diff --git a/PR_REVIEW.md b/PR_REVIEW.md
index 84131c177a3..1152e2942bf 100644
--- a/PR_REVIEW.md
+++ b/PR_REVIEW.md
@@ -1,4 +1,5 @@
## Summary
+
We take PR review seriously. Please read https://medium.com/@mrjoelkemp/giving-better-code-reviews-16109e0fdd36#.xa8lc4i23 to understand how a PR review should be conducted. Be rational and strict in your review, make sure you understand exactly what the submitter's intent is. Anyone in the community can review a PR, but a Prebid Org member is also required. A Prebid Org member should take ownership of a PR and do the initial review.
If the PR is for a standard bid adapter or a standard analytics adapter, just the one review from a core member is sufficient. The reviewer will check against [required conventions](http://prebid.org/dev-docs/bidder-adaptor.html#required-adapter-conventions) and may merge the PR after approving and confirming that the documentation PR against prebid.org is open and linked to the issue.
@@ -11,14 +12,15 @@ General gulp commands include separate commands for serving the codebase on a bu
- Run `gulp review-start`, adding the host parameter `gulp review-start --host=0.0.0.0` will bind to all IPs on the machine
- A page will open which provides a hub for common reviewer tools.
- - If you need to manually acceess the tools:
+ - If you need to manually access the tools:
- Navigate to build/coverage/lcov-report/index.html to view coverage
- Navigate to integrationExamples/gpt/hellow_world.html for basic integration testing
- - The hello_world.html and other exampls can be edited and used as needed to verify functionality
+ - The hello_world.html and other examples can be edited and used as needed to verify functionality
### General PR review Process
+
- All required global and bidder-adapter rules defined in the [Module Rules](https://docs.prebid.org/dev-docs/module-rules.html) must be followed. Please review these rules often - we depend on reviewers to enforce them.
-- Checkout the branch (these instructions are available on the github PR page as well).
+- Checkout the branch (these instructions are available on the GitHub PR page as well).
- Verify PR is a single change type. Example, refactor OR bugfix. If more than 1 type, ask submitter to break out requests.
- Verify code under review has at least 80% unit test coverage. If legacy code doesn't have enough unit test coverage, require that additional unit tests to be included in the PR.
- Verify tests are green in Travis-ci + local build by running `gulp serve` | `gulp test`
@@ -29,13 +31,14 @@ General gulp commands include separate commands for serving the codebase on a bu
- If the change results in needing updates to docs (such as public API change, module interface etc), add a label for "needs docs" and inform the submitter they must submit a docs PR to update the appropriate area of Prebid.org **before the PR can merge**. Help them with finding where the docs are located on prebid.org if needed.
- If all above is good, add a `LGTM` comment and, if the change is in PBS-core or is an important module like the prebidServerBidAdapter, request 1 additional core member to review.
- Once there are 2 `LGTM` on the PR, merge to master
-- The [draft release](https://github.com/prebid/Prebid.js/releases) notes are managed by [release drafter](https://github.com/release-drafter/release-drafter). To get the PR added to the release notes do the steps below. A github action will use that information to build the release notes.
+- The [draft release](https://github.com/prebid/Prebid.js/releases) notes are managed by [release drafter](https://github.com/release-drafter/release-drafter). To get the PR added to the release notes do the steps below. A GitHub action will use that information to build the release notes.
- Adjust the PR Title to be appropriate for release notes
- Add a label for `feature`, `maintenance`, `fix`, `bugfix` or `bug` to categorize the PR
- - Add a semver label of `major`, `minor` or `patch` to indicate the scope of change
+ - Add a SemVer label of `major`, `minor` or `patch` to indicate the scope of change
### Reviewing a New or Updated Bid Adapter
-Documentation they're supposed to be following is https://docs.prebid.org/dev-docs/bidder-adaptor.html
+
+Documentation: https://docs.prebid.org/dev-docs/bidder-adaptor.html
Follow steps above for general review process. In addition, please verify the following:
- Verify the biddercode and aliases are valid:
@@ -67,14 +70,16 @@ Follow steps above for general review process. In addition, please verify the fo
- After a new adapter is approved, let the submitter know they may open a PR in the [headerbid-expert repository](https://github.com/prebid/headerbid-expert) to have their adapter recognized by the [Headerbid Expert extension](https://chrome.google.com/webstore/detail/headerbid-expert/cgfkddgbnfplidghapbbnngaogeldmop). The PR should be to the [bidder patterns file](https://github.com/prebid/headerbid-expert/blob/master/bidderPatterns.js), adding an entry with their adapter's name and the url the adapter uses to send and receive bid responses.
### Reviewing a New or Updated Analytics Adapter
-Documentation they're supposed to be following is https://docs.prebid.org/dev-docs/integrate-with-the-prebid-analytics-api.html
+
+Documentation: https://docs.prebid.org/dev-docs/integrate-with-the-prebid-analytics-api.html
No additional steps above the general review process and making sure it conforms to the [Module Rules](https://docs.prebid.org/dev-docs/module-rules.html).
Make sure there's a docs pull request
### Reviewing a New or Updated User ID Sub-Module
-Documentation they're supposed to be following is https://docs.prebid.org/dev-docs/modules/userId.html#id-providers
+
+Documentation: https://docs.prebid.org/dev-docs/modules/userId.html#id-providers
Follow steps above for general review process. In addition:
- Try running the new user ID module with a basic config and confirm it hits the endpoint and stores the results.
@@ -102,9 +107,11 @@ Follow steps above for general review process. In addition:
- make sure there's a docs pull request
### Reviewing a New or Updated Real-Time-Data Sub-Module
-Documentation they're supposed to be following is https://docs.prebid.org/dev-docs/add-rtd-submodule.html
+
+Documentation: https://docs.prebid.org/dev-docs/add-rtd-submodule.html
Follow steps above for general review process. In addition:
+
- The RTD Provider must include a `providerRtdProvider.md` file. This file must have example parameters and document a sense of what to expect: what should change in the bidrequest, or what targeting data should be added?
- Try running the new sub-module and confirm the provided test parameters.
- Confirm that the module
@@ -118,9 +125,7 @@ Follow steps above for general review process. In addition:
## Ticket Coordinator
-Each week, Prebid Org assigns one person to keep an eye on incoming issues and PRs. Every Monday morning a reminder is
-sent to the prebid-js slack channel with a link to the spreadsheet. If you're on rotation, please check that list each
-Monday to see if you're on-duty.
+Each week, Prebid Org assigns one person to keep an eye on incoming issues and PRs. Every Monday morning a reminder is sent to the prebid-js slack channel with a link to the spreadsheet. If you're on rotation, please check that list each Monday to see if you're on-duty.
When on-duty:
- Review issues and PRs at least once per weekday for new items. Encourage a 48 "SLA" on PRs/issues assigned. Aim for touchpoint once every 48/hours.
diff --git a/browsers.json b/browsers.json
index f73bbbb8aac..4f2ea456f68 100644
--- a/browsers.json
+++ b/browsers.json
@@ -7,11 +7,11 @@
"device": null,
"os": "Windows"
},
- "bs_edge_18_windows_10": {
+ "bs_edge_90_windows_10": {
"base": "BrowserStack",
"os_version": "10",
"browser": "edge",
- "browser_version": "18.0",
+ "browser_version": "90.0",
"device": null,
"os": "Windows"
},
@@ -23,11 +23,11 @@
"device": null,
"os": "Windows"
},
- "bs_chrome_89_windows_10": {
+ "bs_chrome_90_windows_10": {
"base": "BrowserStack",
"os_version": "10",
"browser": "chrome",
- "browser_version": "89.0",
+ "browser_version": "90.0",
"device": null,
"os": "Windows"
},
@@ -39,11 +39,11 @@
"device": null,
"os": "Windows"
},
- "bs_firefox_73_windows_10": {
+ "bs_firefox_88_windows_10": {
"base": "BrowserStack",
"os_version": "10",
"browser": "firefox",
- "browser_version": "73.0",
+ "browser_version": "88.0",
"device": null,
"os": "Windows"
},
@@ -55,11 +55,11 @@
"device": null,
"os": "Windows"
},
- "bs_safari_11_mac_catalina": {
+ "bs_safari_14_mac_bigsur": {
"base": "BrowserStack",
- "os_version": "Catalina",
+ "os_version": "Big Sur",
"browser": "safari",
- "browser_version": "13.0",
+ "browser_version": "14.0",
"device": null,
"os": "OS X"
},
diff --git a/gulpfile.js b/gulpfile.js
index e2bed2a660f..088e3785747 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -8,7 +8,7 @@ var gutil = require('gulp-util');
var connect = require('gulp-connect');
var webpack = require('webpack');
var webpackStream = require('webpack-stream');
-var uglify = require('gulp-uglify');
+var terser = require('gulp-terser');
var gulpClean = require('gulp-clean');
var KarmaServer = require('karma').Server;
var karmaConfMaker = require('./karma.conf.maker');
@@ -168,7 +168,7 @@ function makeWebpackPkg() {
return gulp.src([].concat(moduleSources, analyticsSources, 'src/prebid.js'))
.pipe(helpers.nameModules(externalModules))
.pipe(webpackStream(cloned, webpack))
- .pipe(uglify())
+ .pipe(terser())
.pipe(replace(/('|")v\$prebid\.modulesList\$('|")/g, makeModuleList(externalModules)))
.pipe(gulpif(file => file.basename === 'prebid-core.js', header(banner, { prebid: prebid })))
.pipe(gulp.dest('build/dist'));
diff --git a/integrationExamples/gpt/akamaidap_email_example.html b/integrationExamples/gpt/akamaidap_email_example.html
new file mode 100755
index 00000000000..828b2add787
--- /dev/null
+++ b/integrationExamples/gpt/akamaidap_email_example.html
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Prebid.js Test
+Div-1
+
+
+
+User IDs Sent to Bidding Adapter
+
+
+
diff --git a/integrationExamples/gpt/akamaidap_signature_example.html b/integrationExamples/gpt/akamaidap_signature_example.html
new file mode 100644
index 00000000000..e4c7c617653
--- /dev/null
+++ b/integrationExamples/gpt/akamaidap_signature_example.html
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Prebid.js Test
+Div-1
+
+
+
+User IDs Sent to Bidding Adapter
+
+
+
diff --git a/integrationExamples/gpt/akamaidap_x1_example.html b/integrationExamples/gpt/akamaidap_x1_example.html
new file mode 100755
index 00000000000..b1f16acc560
--- /dev/null
+++ b/integrationExamples/gpt/akamaidap_x1_example.html
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Prebid.js Test
+Div-1
+
+
+
+User IDs Sent to Bidding Adapter
+
+
+
diff --git a/integrationExamples/gpt/idImportLibrary_example.html b/integrationExamples/gpt/idImportLibrary_example.html
index f35b571e8f9..07a4f0fe1c5 100644
--- a/integrationExamples/gpt/idImportLibrary_example.html
+++ b/integrationExamples/gpt/idImportLibrary_example.html
@@ -54,17 +54,7 @@
expires: 30
}
},
- {
- name: "sharedId",
- params: {
- syncTime: 60 // in seconds, default is 24 hours
- },
- storage: {
- type: "html5",
- name: "sharedid",
- expires: 28
- }
- } , {
+ {
name: "liveIntentId",
params: {
publisherId: "9896876"
diff --git a/integrationExamples/gpt/ixMultiFormat.html b/integrationExamples/gpt/ixMultiFormat.html
new file mode 100644
index 00000000000..c4ed5bb9b1e
--- /dev/null
+++ b/integrationExamples/gpt/ixMultiFormat.html
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Prebid.js Test
+ Div-1
+
+
+
+
+
+
+
diff --git a/integrationExamples/gpt/optimeraRtdProvider_example.html b/integrationExamples/gpt/optimeraRtdProvider_example.html
new file mode 100644
index 00000000000..109a4c2b366
--- /dev/null
+++ b/integrationExamples/gpt/optimeraRtdProvider_example.html
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+ Optimera RTD Example
+
+
+
+
+
+
+
+
+
+
+ Basic Prebid.js Example
+ Div-1
+
+
+
+
+
+
+ Div-0
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/integrationExamples/gpt/permutiveRtdProvider_example.html b/integrationExamples/gpt/permutiveRtdProvider_example.html
index a06430bcdfa..b6a22096c90 100644
--- a/integrationExamples/gpt/permutiveRtdProvider_example.html
+++ b/integrationExamples/gpt/permutiveRtdProvider_example.html
@@ -159,6 +159,41 @@
]
}
});
+ pbjs.setBidderConfig({
+ bidders: ['appnexus', 'rubicon'],
+ config: {
+ ortb2: {
+ site: {
+ name: "example",
+ domain: "page.example.com",
+ cat: ["IAB2"],
+ sectioncat: ["IAB2-2"],
+ pagecat: ["IAB2-2"],
+ page: "https://page.example.com/here.html",
+ ref: "https://ref.example.com",
+ keywords: "power tools, drills",
+ search: "drill",
+ content: {}
+ },
+ user: {
+ yob: 1985,
+ gender: 'm',
+ keywords: 'a,b',
+ data: [
+ {
+ name: 'www.dataprovider1.com',
+ ext: { taxonomyname: 'iab_audience_taxonomy' },
+ segment: [{ id: '687' }, { id: '123' }]
+ },
+ {
+ name: 'permutive.com',
+ segment: [{ id: '1' }]
+ }
+ ]
+ }
+ }
+ }
+ });
pbjs.addAdUnits(adUnits);
requestBids();
});
diff --git a/integrationExamples/gpt/revcontent_example_banner.html b/integrationExamples/gpt/revcontent_example_banner.html
new file mode 100644
index 00000000000..cadd2e1a0b7
--- /dev/null
+++ b/integrationExamples/gpt/revcontent_example_banner.html
@@ -0,0 +1,116 @@
+
+
+
+
+ Prebid.js Banner Example
+
+
+
+
+
+
+
+
+
+
+
+ Prebid.js Banner Example
+
+
+
+
+
+
+
+
+
diff --git a/integrationExamples/gpt/revcontent_example.html b/integrationExamples/gpt/revcontent_example_native.html
similarity index 92%
rename from integrationExamples/gpt/revcontent_example.html
rename to integrationExamples/gpt/revcontent_example_native.html
index d7a44df3014..07a06f3a25d 100644
--- a/integrationExamples/gpt/revcontent_example.html
+++ b/integrationExamples/gpt/revcontent_example_native.html
@@ -1,9 +1,9 @@
-
-
-
+ Prebid.js Native Example
+
+
diff --git a/integrationExamples/gpt/userId_example.html b/integrationExamples/gpt/userId_example.html
index 6fbdd69aea7..5659a208103 100644
--- a/integrationExamples/gpt/userId_example.html
+++ b/integrationExamples/gpt/userId_example.html
@@ -72,10 +72,11 @@
"131": true, // id5Id
"929": true, // parrableId
"97": true, // identityLink
- "887": true, // sharedId, uid2
+ "887": true, // uid2
"95": true, // lotamePanoramaId
"301": true, // zeotapIdPlus
"91": true, // criteo
+ "737": true, // amxId
}
}
}
@@ -195,18 +196,6 @@
"expires": 30
}
},
- {
- "name": "sharedId",
- // bidders: ["rubicon", "sampleBidders"], // to allow this ID for specific bidders
- "params": {
- "syncTime": 60 // in seconds, default is 24 hours
- },
- "storage": {
- "type": "cookie",
- "name": "sharedid",
- "expires": 28
- }
- },
{
"name": "lotamePanoramaId"
},
@@ -238,6 +227,14 @@
{
"name": "criteo"
},
+ {
+ "name": "amxId",
+ "storage": {
+ "type": "html5",
+ "name": "amxId",
+ "expires": 14
+ }
+ },
{
"name": "uid2"
}
diff --git a/integrationExamples/postbid/postbid_prebidServer_example.html b/integrationExamples/postbid/postbid_prebidServer_example.html
index 3af7b010872..9f4944884a0 100644
--- a/integrationExamples/postbid/postbid_prebidServer_example.html
+++ b/integrationExamples/postbid/postbid_prebidServer_example.html
@@ -14,11 +14,12 @@
})();
pbjs.que.push(function() {
+ var sizes = [[300, 250]];
var adUnits = [{
code: 'postbid_iframe',
mediaTypes: {
banner: {
- sizes: [[300, 250]]
+ sizes: sizes
}
},
bids: [
diff --git a/modules/.submodules.json b/modules/.submodules.json
index 0a10044a78e..555e8adaefa 100644
--- a/modules/.submodules.json
+++ b/modules/.submodules.json
@@ -28,7 +28,9 @@
"uid2IdSystem",
"admixerIdSystem",
"dmdIdSystem",
- "flocIdSystem"
+ "akamaiDAPId",
+ "flocIdSystem",
+ "amxIdSystem"
],
"adpod": [
"freeWheelAdserverVideo",
@@ -36,9 +38,13 @@
],
"rtdModule": [
"browsiRtdProvider",
+ "dgkeywordRtdProvider",
"geoedgeRtdProvider",
"haloRtdProvider",
+ "iasRtdProvider",
"jwplayerRtdProvider",
+ "medianetRtdProvider",
+ "optimeraRtdProvider",
"permutiveRtdProvider",
"reconciliationRtdProvider",
"sirdataRtdProvider"
diff --git a/modules/1ad4goodBidAdapter.js b/modules/1ad4goodBidAdapter.js
deleted file mode 100644
index 178f3765587..00000000000
--- a/modules/1ad4goodBidAdapter.js
+++ /dev/null
@@ -1,399 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-import find from 'core-js-pure/features/array/find.js';
-import includes from 'core-js-pure/features/array/includes.js';
-
-const BIDDER_CODE = '1ad4good';
-const URL = 'https://hb.1ad4good.org/prebid';
-const VIDEO_TARGETING = ['id', 'mimes', 'minduration', 'maxduration',
- 'startdelay', 'skippable', 'playback_method', 'frameworks'];
-const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language'];
-const APP_DEVICE_PARAMS = ['geo', 'device_id']; // appid is collected separately
-const SOURCE = 'pbjs';
-const MAX_IMPS_PER_REQUEST = 15;
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['adsforgood', 'ads4good', '1adsforgood'],
- supportedMediaTypes: [BANNER, VIDEO],
-
- /**
- * Determines whether or not the given bid request is valid.
- *
- * @param {object} bid The bid to validate.
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: function(bid) {
- return !!(bid.params.placementId);
- },
-
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server.
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: function(bidRequests, bidderRequest) {
- const tags = bidRequests.map(bidToTag);
- const userObjBid = find(bidRequests, hasUserInfo);
- let userObj;
- if (userObjBid) {
- userObj = {};
- Object.keys(userObjBid.params.user)
- .filter(param => includes(USER_PARAMS, param))
- .forEach(param => userObj[param] = userObjBid.params.user[param]);
- }
-
- const appDeviceObjBid = find(bidRequests, hasAppDeviceInfo);
- let appDeviceObj;
- if (appDeviceObjBid && appDeviceObjBid.params && appDeviceObjBid.params.app) {
- appDeviceObj = {};
- Object.keys(appDeviceObjBid.params.app)
- .filter(param => includes(APP_DEVICE_PARAMS, param))
- .forEach(param => appDeviceObj[param] = appDeviceObjBid.params.app[param]);
- }
-
- const appIdObjBid = find(bidRequests, hasAppId);
- let appIdObj;
- if (appIdObjBid && appIdObjBid.params && appDeviceObjBid.params.app && appDeviceObjBid.params.app.id) {
- appIdObj = {
- appid: appIdObjBid.params.app.id
- };
- }
-
- const payload = {
- tags: [...tags],
- user: userObj,
- sdk: {
- source: SOURCE,
- version: '$prebid.version$'
- }
- };
-
- if (appDeviceObjBid) {
- payload.device = appDeviceObj
- }
- if (appIdObjBid) {
- payload.app = appIdObj;
- }
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- // note - objects for impbus use underscore instead of camelCase
- payload.gdpr_consent = {
- consent_string: bidderRequest.gdprConsent.consentString,
- consent_required: bidderRequest.gdprConsent.gdprApplies
- };
- }
-
- if (bidderRequest && bidderRequest.refererInfo) {
- let refererinfo = {
- rd_ref: encodeURIComponent(bidderRequest.refererInfo.referer),
- rd_top: bidderRequest.refererInfo.reachedTop,
- rd_ifs: bidderRequest.refererInfo.numIframes,
- rd_stk: bidderRequest.refererInfo.stack.map((url) => encodeURIComponent(url)).join(',')
- }
- payload.referrer_detection = refererinfo;
- }
-
- const request = formatRequest(payload, bidderRequest);
- return request;
- },
-
- /**
- * 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, {bidderRequest}) {
- serverResponse = serverResponse.body;
- const bids = [];
- if (!serverResponse || serverResponse.error) {
- let errorMessage = `in response for ${bidderRequest.bidderCode} adapter`;
- if (serverResponse && serverResponse.error) { errorMessage += `: ${serverResponse.error}`; }
- utils.logError(errorMessage);
- return bids;
- }
-
- if (serverResponse.tags) {
- serverResponse.tags.forEach(serverBid => {
- const rtbBid = getRtbBid(serverBid);
- if (rtbBid) {
- if (rtbBid.cpm !== 0 && includes(this.supportedMediaTypes, rtbBid.ad_type)) {
- const bid = newBid(serverBid, rtbBid, bidderRequest);
- bid.mediaType = parseMediaType(rtbBid);
- bids.push(bid);
- }
- }
- });
- }
-
- return bids;
- },
-
- transformBidParams: function(params, isOpenRtb) {
- params = utils.convertTypes({
- 'placementId': 'number',
- 'keywords': utils.transformBidderParamKeywords
- }, params);
-
- if (isOpenRtb) {
- params.use_pmt_rule = (typeof params.usePaymentRule === 'boolean') ? params.usePaymentRule : false;
- if (params.usePaymentRule) { delete params.usePaymentRule; }
-
- if (isPopulatedArray(params.keywords)) {
- params.keywords.forEach(deleteValues);
- }
-
- Object.keys(params).forEach(paramKey => {
- let convertedKey = utils.convertCamelToUnderscore(paramKey);
- if (convertedKey !== paramKey) {
- params[convertedKey] = params[paramKey];
- delete params[paramKey];
- }
- });
- }
-
- return params;
- },
-
- /**
- * Add element selector to javascript tracker to improve native viewability
- * @param {Bid} bid
- */
- onBidWon: function(bid) {
- }
-}
-
-function isPopulatedArray(arr) {
- return !!(utils.isArray(arr) && arr.length > 0);
-}
-
-function deleteValues(keyPairObj) {
- if (isPopulatedArray(keyPairObj.value) && keyPairObj.value[0] === '') {
- delete keyPairObj.value;
- }
-}
-
-function formatRequest(payload, bidderRequest) {
- let request = [];
-
- if (payload.tags.length > MAX_IMPS_PER_REQUEST) {
- const clonedPayload = utils.deepClone(payload);
-
- utils.chunk(payload.tags, MAX_IMPS_PER_REQUEST).forEach(tags => {
- clonedPayload.tags = tags;
- const payloadString = JSON.stringify(clonedPayload);
- request.push({
- method: 'POST',
- url: URL,
- data: payloadString,
- bidderRequest
- });
- });
- } else {
- const payloadString = JSON.stringify(payload);
- request = {
- method: 'POST',
- url: URL,
- data: payloadString,
- bidderRequest
- };
- }
-
- return request;
-}
-
-/**
- * Unpack the Server's Bid into a Prebid-compatible one.
- * @param serverBid
- * @param rtbBid
- * @param bidderRequest
- * @return Bid
- */
-function newBid(serverBid, rtbBid, bidderRequest) {
- const bidRequest = utils.getBidRequest(serverBid.uuid, [bidderRequest]);
- const bid = {
- requestId: serverBid.uuid,
- cpm: rtbBid.cpm,
- creativeId: rtbBid.creative_id,
- dealId: rtbBid.deal_id,
- currency: 'USD',
- netRevenue: true,
- ttl: 300,
- adUnitCode: bidRequest.adUnitCode,
- ads4good: {
- buyerMemberId: rtbBid.buyer_member_id,
- dealPriority: rtbBid.deal_priority,
- dealCode: rtbBid.deal_code
- }
- };
-
- if (rtbBid.advertiser_id) {
- bid.meta = Object.assign({}, bid.meta, { advertiserId: rtbBid.advertiser_id });
- }
-
- if (rtbBid.rtb.video) {
- Object.assign(bid, {
- width: rtbBid.rtb.video.player_width,
- height: rtbBid.rtb.video.player_height,
- vastUrl: rtbBid.rtb.video.asset_url,
- vastImpUrl: rtbBid.notify_url,
- ttl: 3600
- });
- } else {
- Object.assign(bid, {
- width: rtbBid.rtb.banner.width,
- height: rtbBid.rtb.banner.height,
- ad: rtbBid.rtb.banner.content
- });
- try {
- const url = rtbBid.rtb.trackers[0].impression_urls[0];
- const tracker = utils.createTrackPixelHtml(url);
- bid.ad += tracker;
- } catch (error) {
- utils.logError('Error appending tracking pixel', error);
- }
- }
-
- return bid;
-}
-
-function bidToTag(bid) {
- const tag = {};
- tag.sizes = transformSizes(bid.sizes);
- tag.primary_size = tag.sizes[0];
- tag.ad_types = [];
- tag.uuid = bid.bidId;
- if (bid.params.placementId) {
- tag.id = parseInt(bid.params.placementId, 10);
- }
- if (bid.params.cpm) {
- tag.cpm = bid.params.cpm;
- }
- tag.allow_smaller_sizes = bid.params.allowSmallerSizes || false;
- tag.use_pmt_rule = bid.params.usePaymentRule || false
- tag.prebid = true;
- tag.disable_psa = true;
- if (bid.params.reserve) {
- tag.reserve = bid.params.reserve;
- }
- if (bid.params.position) {
- tag.position = {'above': 1, 'below': 2}[bid.params.position] || 0;
- }
- if (bid.params.trafficSourceCode) {
- tag.traffic_source_code = bid.params.trafficSourceCode;
- }
- if (bid.params.privateSizes) {
- tag.private_sizes = transformSizes(bid.params.privateSizes);
- }
- if (bid.params.supplyType) {
- tag.supply_type = bid.params.supplyType;
- }
- if (bid.params.pubClick) {
- tag.pubclick = bid.params.pubClick;
- }
- if (bid.params.extInvCode) {
- tag.ext_inv_code = bid.params.extInvCode;
- }
- if (bid.params.externalImpId) {
- tag.external_imp_id = bid.params.externalImpId;
- }
- if (!utils.isEmpty(bid.params.keywords)) {
- let keywords = utils.transformBidderParamKeywords(bid.params.keywords);
-
- if (keywords.length > 0) {
- keywords.forEach(deleteValues);
- }
- tag.keywords = keywords;
- }
-
- const videoMediaType = utils.deepAccess(bid, `mediaTypes.${VIDEO}`);
- const context = utils.deepAccess(bid, 'mediaTypes.video.context');
-
- if (bid.mediaType === VIDEO || videoMediaType) {
- tag.ad_types.push(VIDEO);
- }
-
- // instream gets vastUrl, outstream gets vastXml
- if (bid.mediaType === VIDEO || (videoMediaType && context !== 'outstream')) {
- tag.require_asset_url = true;
- }
-
- if (bid.params.video) {
- tag.video = {};
- // place any valid video params on the tag
- Object.keys(bid.params.video)
- .filter(param => includes(VIDEO_TARGETING, param))
- .forEach(param => tag.video[param] = bid.params.video[param]);
- }
-
- if (bid.renderer) {
- tag.video = Object.assign({}, tag.video, {custom_renderer_present: true});
- }
-
- if (
- (utils.isEmpty(bid.mediaType) && utils.isEmpty(bid.mediaTypes)) ||
- (bid.mediaType === BANNER || (bid.mediaTypes && bid.mediaTypes[BANNER]))
- ) {
- tag.ad_types.push(BANNER);
- }
-
- return tag;
-}
-
-/* Turn bid request sizes into ut-compatible format */
-function transformSizes(requestSizes) {
- let sizes = [];
- let sizeObj = {};
-
- if (utils.isArray(requestSizes) && requestSizes.length === 2 &&
- !utils.isArray(requestSizes[0])) {
- sizeObj.width = parseInt(requestSizes[0], 10);
- sizeObj.height = parseInt(requestSizes[1], 10);
- sizes.push(sizeObj);
- } else if (typeof requestSizes === 'object') {
- for (let i = 0; i < requestSizes.length; i++) {
- let size = requestSizes[i];
- sizeObj = {};
- sizeObj.width = parseInt(size[0], 10);
- sizeObj.height = parseInt(size[1], 10);
- sizes.push(sizeObj);
- }
- }
-
- return sizes;
-}
-
-function hasUserInfo(bid) {
- return !!bid.params.user;
-}
-
-function hasAppDeviceInfo(bid) {
- if (bid.params) {
- return !!bid.params.app
- }
-}
-
-function hasAppId(bid) {
- if (bid.params && bid.params.app) {
- return !!bid.params.app.id
- }
- return !!bid.params.app
-}
-
-function getRtbBid(tag) {
- return tag && tag.ads && tag.ads.length && find(tag.ads, ad => ad.rtb);
-}
-
-function parseMediaType(rtbBid) {
- const adType = rtbBid.ad_type;
- if (adType === VIDEO) {
- return VIDEO;
- } else {
- return BANNER;
- }
-}
-
-registerBidder(spec);
diff --git a/modules/1ad4goodBidAdapter.md b/modules/1ad4goodBidAdapter.md
deleted file mode 100644
index 1e9dfe5e04c..00000000000
--- a/modules/1ad4goodBidAdapter.md
+++ /dev/null
@@ -1,87 +0,0 @@
-# Overview
-
-```
-Module Name: 1ad4good Bid Adapter
-Module Type: Bidder Adapter
-Maintainer: info@1ad4good.org
-```
-
-# Description
-
-Connects to 1ad4good exchange for bids.
-
-1ad4good bid adapter supports Banner and Video (instream).
-
-# Test Parameters
-```
-var adUnits = [
- // Banner adUnit
- {
- code: 'banner-div',
- mediaTypes: {
- banner: {
- sizes: [[300, 250], [300,600]]
- }
- },
- bids: [{
- bidder: '1ad4good',
- params: {
- placementId: 13144370
- }
- }]
- },
- // Video instream adUnit
- {
- code: 'video-instream',
- sizes: [[640, 480]],
- mediaTypes: {
- video: {
- playerSize: [[640, 480]],
- context: 'instream'
- },
- },
- bids: [{
- bidder: '1ad4good',
- params: {
- placementId: 13232361,
- video: {
- skippable: true,
- playback_methods: ['auto_play_sound_off']
- }
- }
- }]
- },
-
- // Banner adUnit in a App Webview
- // Only use this for situations where prebid.js is in a webview of an App
- // See Prebid Mobile for displaying ads via an SDK
- {
- code: 'banner-div',
- mediaTypes: {
- banner: {
- sizes: [[300, 250], [300,600]]
- }
- }
- bids: [{
- bidder: '1ad4good',
- params: {
- placementId: 13144370,
- app: {
- id: "B1O2W3M4AN.com.prebid.webview",
- geo: {
- lat: 40.0964439,
- lng: -75.3009142
- },
- device_id: {
- idfa: "4D12078D-3246-4DA4-AD5E-7610481E7AE", // Apple advertising identifier
- aaid: "38400000-8cf0-11bd-b23e-10b96e40000d", // Android advertising identifier
- md5udid: "5756ae9022b2ea1e47d84fead75220c8", // MD5 hash of the ANDROID_ID
- sha1udid: "4DFAA92388699AC6539885AEF1719293879985BF", // SHA1 hash of the ANDROID_ID
- windowsadid: "750c6be243f1c4b5c9912b95a5742fc5" // Windows advertising identifier
- }
- }
- }
- }]
- }
-];
-```
diff --git a/modules/7xbidBidAdapter.js b/modules/7xbidBidAdapter.js
deleted file mode 100644
index b925912a399..00000000000
--- a/modules/7xbidBidAdapter.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = '7xbid';
-const BIDDER_ALIAS = '7xb';
-const ENDPOINT_BANNER = '//bidder.7xbid.com/api/v1/prebid/banner';
-const ENDPOINT_NATIVE = '//bidder.7xbid.com/api/v1/prebid/native';
-const COOKIE_SYNC_URL = '//bidder.7xbid.com/api/v1/cookie/gen';
-const SUPPORTED_MEDIA_TYPES = ['banner', 'native'];
-const SUPPORTED_CURRENCIES = ['USD', 'JPY'];
-const DEFAULT_CURRENCY = 'JPY';
-const NET_REVENUE = true;
-
-/**
- * updated to support prebid 3.0 - remove utils.getTopWindowUrl()
- */
-
-const _encodeURIComponent = function(a) {
- let b = window.encodeURIComponent(a);
- b = b.replace(/'/g, '%27');
- return b;
-}
-
-export const _getUrlVars = function(url) {
- var hash;
- var myJson = {};
- var hashes = url.slice(url.indexOf('?') + 1).split('&');
- for (var i = 0; i < hashes.length; i++) {
- hash = hashes[i].split('=');
- myJson[hash[0]] = hash[1];
- }
- return myJson;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: [BIDDER_ALIAS], // short code
- supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
- isBidRequestValid: function(bid) {
- if (!(bid.params.placementId)) {
- return false;
- }
-
- if (bid.params.hasOwnProperty('currency') &&
- SUPPORTED_CURRENCIES.indexOf(bid.params.currency) === -1) {
- utils.logInfo('Invalid currency type, we support only JPY and USD!')
- return false;
- }
-
- return true;
- },
- /**
- * 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) {
- let serverRequests = [];
- var refererInfo;
- if (bidderRequest && bidderRequest.refererInfo) {
- refererInfo = bidderRequest.refererInfo;
- }
- validBidRequests.forEach((bid, i) => {
- let endpoint = ENDPOINT_BANNER
- let data = {
- 'placementid': bid.params.placementId,
- 'cur': bid.params.hasOwnProperty('currency') ? bid.params.currency : DEFAULT_CURRENCY,
- 'ua': navigator.userAgent,
- 'loc': utils.deepAccess(bidderRequest, 'refererInfo.referer'),
- 'topframe': (window.parent === window.self) ? 1 : 0,
- 'sw': screen && screen.width,
- 'sh': screen && screen.height,
- 'cb': Math.floor(Math.random() * 99999999999),
- 'tpaf': 1,
- 'cks': 1,
- 'requestid': bid.bidId
- };
-
- if (bid.hasOwnProperty('nativeParams')) {
- endpoint = ENDPOINT_NATIVE
- data.tkf = 1 // return url tracker
- data.ad_track = '1'
- data.apiv = '1.1.0'
- }
-
- if (refererInfo && refererInfo.referer) {
- data.referer = refererInfo.referer;
- } else {
- data.referer = '';
- }
-
- serverRequests.push({
- method: 'GET',
- url: endpoint,
- data: utils.parseQueryStringParameters(data)
- })
- })
-
- return serverRequests;
- },
- interpretResponse: function(serverResponse, request) {
- const data = _getUrlVars(request.data)
- const successBid = serverResponse.body || {};
- let bidResponses = [];
- if (successBid.hasOwnProperty(data.placementid)) {
- let bid = successBid[data.placementid]
- let bidResponse = {
- requestId: bid.requestid,
- cpm: bid.price,
- creativeId: bid.creativeId,
- currency: bid.cur,
- netRevenue: NET_REVENUE,
- ttl: 700
- };
-
- if (bid.hasOwnProperty('title')) { // it is native ad response
- bidResponse.mediaType = 'native'
- bidResponse.native = {
- title: bid.title,
- body: bid.description,
- cta: bid.cta,
- sponsoredBy: bid.advertiser,
- clickUrl: _encodeURIComponent(bid.landingURL),
- impressionTrackers: bid.trackings,
- }
- if (bid.screenshots) {
- bidResponse.native.image = {
- url: bid.screenshots.url,
- height: bid.screenshots.height,
- width: bid.screenshots.width,
- }
- }
- if (bid.icon) {
- bidResponse.native.icon = {
- url: bid.icon.url,
- height: bid.icon.height,
- width: bid.icon.width,
- }
- }
- } else {
- bidResponse.ad = bid.adm
- bidResponse.width = bid.width
- bidResponse.height = bid.height
- }
-
- bidResponses.push(bidResponse);
- }
-
- return bidResponses;
- },
- getUserSyncs: function(syncOptions, serverResponses) {
- return [{
- type: 'image',
- url: COOKIE_SYNC_URL
- }];
- }
-}
-registerBidder(spec);
diff --git a/modules/aardvarkBidAdapter.js b/modules/aardvarkBidAdapter.js
deleted file mode 100644
index 0b864286868..00000000000
--- a/modules/aardvarkBidAdapter.js
+++ /dev/null
@@ -1,262 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'aardvark';
-const DEFAULT_ENDPOINT = 'bidder.rtk.io';
-const SYNC_ENDPOINT = 'sync.rtk.io';
-const AARDVARK_TTL = 300;
-const AARDVARK_CURRENCY = 'USD';
-
-let hasSynced = false;
-
-export function resetUserSync() {
- hasSynced = false;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- gvlid: 52,
- aliases: ['adsparc', 'safereach'],
-
- isBidRequestValid: function(bid) {
- return ((typeof bid.params.ai === 'string') && !!bid.params.ai.length &&
- (typeof bid.params.sc === 'string') && !!bid.params.sc.length);
- },
-
- buildRequests: function(validBidRequests, bidderRequest) {
- var auctionCodes = [];
- var requests = [];
- var requestsMap = {};
- var referer = bidderRequest.refererInfo.referer;
- var pageCategories = [];
- var tdId = '';
- var width = window.innerWidth;
- var height = window.innerHeight;
- var schain = '';
-
- // This reference to window.top can cause issues when loaded in an iframe if not protected with a try/catch.
- try {
- 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'))) {
- tdId = validBidRequests[0].userId.tdid;
- }
-
- schain = spec.serializeSupplyChain(utils.deepAccess(validBidRequests, '0.schain'));
-
- utils._each(validBidRequests, function(b) {
- var rMap = requestsMap[b.params.ai];
- if (!rMap) {
- rMap = {
- shortCodes: [],
- payload: {
- version: 1,
- jsonp: false,
- rtkreferer: referer,
- w: width,
- h: height
- },
- endpoint: DEFAULT_ENDPOINT
- };
-
- if (tdId) {
- rMap.payload.tdid = tdId;
- }
- if (schain) {
- rMap.payload.schain = schain;
- }
-
- if (pageCategories && pageCategories.length) {
- rMap.payload.categories = pageCategories.slice(0);
- }
-
- if (b.params.categories && b.params.categories.length) {
- rMap.payload.categories = rMap.payload.categories || []
- utils._each(b.params.categories, function(cat) {
- rMap.payload.categories.push(cat);
- });
- }
-
- if (bidderRequest.gdprConsent) {
- rMap.payload.gdpr = false;
- if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') {
- rMap.payload.gdpr = bidderRequest.gdprConsent.gdprApplies;
- }
- if (rMap.payload.gdpr) {
- rMap.payload.consent = bidderRequest.gdprConsent.consentString;
- }
- }
-
- requestsMap[b.params.ai] = rMap;
- auctionCodes.push(b.params.ai);
- }
-
- if (bidderRequest.uspConsent) {
- rMap.payload.us_privacy = bidderRequest.uspConsent
- }
-
- rMap.shortCodes.push(b.params.sc);
- rMap.payload[b.params.sc] = b.bidId;
-
- if ((typeof b.params.host === 'string') && b.params.host.length &&
- (b.params.host !== rMap.endpoint)) {
- rMap.endpoint = b.params.host;
- }
- });
-
- utils._each(auctionCodes, function(auctionId) {
- var req = requestsMap[auctionId];
- requests.push({
- method: 'GET',
- url: `https://${req.endpoint}/${auctionId}/${req.shortCodes.join('_')}/aardvark`,
- data: req.payload,
- bidderRequest
- });
- });
-
- return requests;
- },
-
- interpretResponse: function(serverResponse, bidRequest) {
- var bidResponses = [];
-
- if (!Array.isArray(serverResponse.body)) {
- serverResponse.body = [serverResponse.body];
- }
-
- utils._each(serverResponse.body, function(rawBid) {
- var cpm = +(rawBid.cpm || 0);
-
- if (!cpm) {
- return;
- }
-
- var bidResponse = {
- requestId: rawBid.cid,
- cpm: cpm,
- width: rawBid.width || 0,
- height: rawBid.height || 0,
- currency: rawBid.currency ? rawBid.currency : AARDVARK_CURRENCY,
- netRevenue: rawBid.netRevenue ? rawBid.netRevenue : true,
- ttl: rawBid.ttl ? rawBid.ttl : AARDVARK_TTL,
- creativeId: rawBid.creativeId || 0
- };
-
- if (rawBid.hasOwnProperty('dealId')) {
- bidResponse.dealId = rawBid.dealId
- }
-
- if (rawBid.hasOwnProperty('ex')) {
- bidResponse.ex = rawBid.ex;
- }
-
- switch (rawBid.media) {
- case 'banner':
- bidResponse.ad = rawBid.adm + utils.createTrackPixelHtml(decodeURIComponent(rawBid.nurl));
- break;
-
- default:
- return utils.logError('bad Aardvark response (media)', rawBid);
- }
-
- bidResponses.push(bidResponse);
- });
-
- return bidResponses;
- },
-
- getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) {
- const syncs = [];
- const params = [];
- var gdprApplies = false;
- if (gdprConsent && (typeof gdprConsent.gdprApplies === 'boolean')) {
- gdprApplies = gdprConsent.gdprApplies;
- }
-
- if (!syncOptions.iframeEnabled) {
- utils.logWarn('Aardvark: Please enable iframe based user sync.');
- return syncs;
- }
-
- if (hasSynced) {
- return syncs;
- }
-
- hasSynced = true;
- if (gdprApplies) {
- params.push(['g', '1']);
- params.push(['c', gdprConsent.consentString]);
- }
-
- if (uspConsent) {
- params.push(['us_privacy', uspConsent]);
- }
-
- var queryStr = '';
- if (params.length) {
- queryStr = '?' + params.map(p => p[0] + '=' + encodeURIComponent(p[1])).join('&')
- }
-
- syncs.push({
- type: 'iframe',
- url: `https://${SYNC_ENDPOINT}/cs${queryStr}`
- });
- return syncs;
- },
-
- /**
- * Serializes schain params according to OpenRTB requirements
- * @param {Object} supplyChain
- * @returns {String}
- */
- serializeSupplyChain: function (supplyChain) {
- if (!hasValidSupplyChainParams(supplyChain)) {
- return '';
- }
-
- return `${supplyChain.ver},${supplyChain.complete}!${spec.serializeSupplyChainNodes(supplyChain.nodes)}`;
- },
-
- /**
- * Properly sorts schain object params
- * @param {Array} nodes
- * @returns {String}
- */
- serializeSupplyChainNodes: function (nodes) {
- const nodePropOrder = ['asi', 'sid', 'hp', 'rid', 'name', 'domain'];
- return nodes.map(node => {
- return nodePropOrder.map(prop => encodeURIComponent(node[prop] || '')).join(',');
- }).join('!');
- },
-};
-
-/**
- * Make sure the required params are present
- * @param {Object} schain
- * @param {Bool}
- */
-export function hasValidSupplyChainParams(schain) {
- if (!schain || !schain.nodes) {
- return false;
- }
- const requiredFields = ['asi', 'sid', 'hp'];
-
- let isValid = schain.nodes.reduce((status, node) => {
- if (!status) {
- return status;
- }
- return requiredFields.every(field => node[field]);
- }, true);
- if (!isValid) {
- utils.logError('Aardvark: required schain params missing');
- }
- return isValid;
-}
-
-registerBidder(spec);
diff --git a/modules/adagioBidAdapter.js b/modules/adagioBidAdapter.js
index 5598dc5d224..e8893b89282 100644
--- a/modules/adagioBidAdapter.js
+++ b/modules/adagioBidAdapter.js
@@ -12,7 +12,6 @@ import { Renderer } from '../src/Renderer.js';
import { OUTSTREAM } from '../src/video.js';
const BIDDER_CODE = 'adagio';
const LOG_PREFIX = 'Adagio:';
-export const VERSION = '2.11.0';
const FEATURES_VERSION = '1';
export const ENDPOINT = 'https://mp.4dex.io/prebid';
const SUPPORTED_MEDIA_TYPES = [BANNER, NATIVE, VIDEO];
@@ -58,7 +57,66 @@ export const ORTB_VIDEO_PARAMS = {
let currentWindow;
-const EXT_DATA = {}
+export const GlobalExchange = (function() {
+ let features;
+ let exchangeData = {};
+
+ return {
+ clearFeatures: function() {
+ features = undefined;
+ },
+
+ clearExchangeData: function() {
+ exchangeData = {};
+ },
+
+ getOrSetGlobalFeatures: function () {
+ if (!features) {
+ features = {
+ page_dimensions: getPageDimensions().toString(),
+ viewport_dimensions: getViewPortDimensions().toString(),
+ user_timestamp: getTimestampUTC().toString(),
+ dom_loading: getDomLoadingDuration().toString(),
+ }
+ }
+ return features;
+ },
+
+ prepareExchangeData(storageValue) {
+ const adagioStorage = JSON.parse(storageValue, function(name, value) {
+ if (name.charAt(0) !== '_' || name === '') {
+ return value;
+ }
+ });
+ let random = utils.deepAccess(adagioStorage, 'session.rnd');
+ let newSession = false;
+
+ if (internal.isNewSession(adagioStorage)) {
+ newSession = true;
+ random = Math.random();
+ }
+
+ const data = {
+ session: {
+ new: newSession,
+ rnd: random
+ }
+ }
+
+ utils.mergeDeep(exchangeData, adagioStorage, data);
+
+ internal.enqueue({
+ action: 'session',
+ ts: Date.now(),
+ data: exchangeData
+ });
+ },
+
+ getExchangeData() {
+ return exchangeData
+ }
+ };
+})();
export function adagioScriptFromLocalStorageCb(ls) {
try {
@@ -99,13 +157,18 @@ export function getAdagioScript() {
if (isValid) {
loadExternalScript(ADAGIO_TAG_URL, BIDDER_CODE);
} else {
- // ensure adagio removing for next time.
- // It's an antipattern regarding the TCF2 enforcement logic
- // but it's the only way to respect the user choice update.
- window.localStorage.removeItem(ADAGIO_LOCALSTORAGE_KEY);
- // Extra data from external script.
- // This key is removed only if localStorage is not accessible.
- window.localStorage.removeItem('adagio');
+ // Try-catch to avoid error when 3rd party cookies is disabled (e.g. in privacy mode)
+ try {
+ // ensure adagio removing for next time.
+ // It's an antipattern regarding the TCF2 enforcement logic
+ // but it's the only way to respect the user choice update.
+ window.localStorage.removeItem(ADAGIO_LOCALSTORAGE_KEY);
+ // Extra data from external script.
+ // This key is removed only if localStorage is not accessible.
+ window.localStorage.removeItem('adagio');
+ } catch (e) {
+ utils.logInfo(`${LOG_PREFIX} unable to clear Adagio scripts from localstorage.`);
+ }
}
});
}
@@ -129,37 +192,6 @@ function isSafeFrameWindow() {
return !!(ws.$sf && ws.$sf.ext);
}
-// Get localStorage "adagio" data to be passed to the request
-export function prepareExchange(storageValue) {
- const adagioStorage = JSON.parse(storageValue, function(name, value) {
- if (!name.startsWith('_') || name === '') {
- return value;
- }
- });
- let random = utils.deepAccess(adagioStorage, 'session.rnd');
- let newSession = false;
-
- if (internal.isNewSession(adagioStorage)) {
- newSession = true;
- random = Math.random();
- }
-
- const data = {
- session: {
- new: newSession,
- rnd: random
- }
- }
-
- utils.mergeDeep(EXT_DATA, adagioStorage, data);
-
- internal.enqueue({
- action: 'session',
- ts: Date.now(),
- data: EXT_DATA
- });
-}
-
function initAdagio() {
if (canAccessTopWindow()) {
currentWindow = (canAccessTopWindow()) ? utils.getWindowTop() : utils.getWindowSelf();
@@ -172,12 +204,12 @@ function initAdagio() {
w.ADAGIO.pbjsAdUnits = w.ADAGIO.pbjsAdUnits || [];
w.ADAGIO.queue = w.ADAGIO.queue || [];
w.ADAGIO.versions = w.ADAGIO.versions || {};
- w.ADAGIO.versions.adagioBidderAdapter = VERSION;
+ w.ADAGIO.versions.pbjs = '$prebid.version$';
w.ADAGIO.isSafeFrameWindow = isSafeFrameWindow();
storage.getDataFromLocalStorage('adagio', (storageData) => {
try {
- internal.prepareExchange(storageData);
+ GlobalExchange.prepareExchangeData(storageData);
} catch (e) {
utils.logError(LOG_PREFIX, e);
}
@@ -186,211 +218,6 @@ function initAdagio() {
getAdagioScript();
}
-export const _features = {
- getPrintNumber(adUnitCode) {
- const adagioAdUnit = internal.getOrAddAdagioAdUnit(adUnitCode);
- return adagioAdUnit.printNumber || 1;
- },
-
- getPageDimensions() {
- if (isSafeFrameWindow() || !canAccessTopWindow()) {
- return '';
- }
-
- // the page dimension can be computed on window.top only.
- const wt = utils.getWindowTop();
- const body = wt.document.querySelector('body');
-
- if (!body) {
- return '';
- }
- const html = wt.document.documentElement;
- const pageWidth = Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth);
- const pageHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);
-
- return `${pageWidth}x${pageHeight}`;
- },
-
- getViewPortDimensions() {
- if (!isSafeFrameWindow() && !canAccessTopWindow()) {
- return '';
- }
-
- const viewportDims = { w: 0, h: 0 };
-
- if (isSafeFrameWindow()) {
- const ws = utils.getWindowSelf();
-
- if (typeof ws.$sf.ext.geom !== 'function') {
- utils.logWarn(`${LOG_PREFIX} cannot use the $sf.ext.geom() safeFrame API method`);
- return '';
- }
-
- const sfGeom = ws.$sf.ext.geom().win;
- viewportDims.w = Math.round(sfGeom.w);
- viewportDims.h = Math.round(sfGeom.h);
- } else {
- // window.top based computing
- const wt = utils.getWindowTop();
-
- if (wt.innerWidth) {
- viewportDims.w = wt.innerWidth;
- viewportDims.h = wt.innerHeight;
- } else {
- const d = wt.document;
- const body = d.querySelector('body');
-
- if (!body) {
- return '';
- }
-
- viewportDims.w = d.querySelector('body').clientWidth;
- viewportDims.h = d.querySelector('body').clientHeight;
- }
- }
-
- return `${viewportDims.w}x${viewportDims.h}`;
- },
-
- /**
- * domLoading feature is computed on window.top if reachable.
- */
- getDomLoadingDuration() {
- let domLoadingDuration = -1;
- let performance;
-
- performance = (canAccessTopWindow()) ? utils.getWindowTop().performance : utils.getWindowSelf().performance;
-
- if (performance && performance.timing && performance.timing.navigationStart > 0) {
- const val = performance.timing.domLoading - performance.timing.navigationStart;
- if (val > 0) {
- domLoadingDuration = val;
- }
- }
-
- return domLoadingDuration;
- },
-
- getSlotPosition(params) {
- const { adUnitElementId, postBid } = params;
-
- if (!adUnitElementId) {
- return '';
- }
-
- if (!isSafeFrameWindow() && !canAccessTopWindow()) {
- return '';
- }
-
- const position = { x: 0, y: 0 };
-
- if (isSafeFrameWindow()) {
- const ws = utils.getWindowSelf();
-
- if (typeof ws.$sf.ext.geom !== 'function') {
- utils.logWarn(`${LOG_PREFIX} cannot use the $sf.ext.geom() safeFrame API method`);
- return '';
- }
-
- const sfGeom = ws.$sf.ext.geom().self;
- position.x = Math.round(sfGeom.t);
- position.y = Math.round(sfGeom.l);
- } else if (canAccessTopWindow()) {
- // window.top based computing
- const wt = utils.getWindowTop();
- const d = wt.document;
-
- let domElement;
-
- if (postBid === true) {
- const ws = utils.getWindowSelf();
- const currentElement = ws.document.getElementById(adUnitElementId);
- domElement = internal.getElementFromTopWindow(currentElement, ws);
- } else {
- domElement = wt.document.getElementById(adUnitElementId);
- }
-
- if (!domElement) {
- return '';
- }
-
- let box = domElement.getBoundingClientRect();
-
- const docEl = d.documentElement;
- const body = d.body;
- const clientTop = d.clientTop || body.clientTop || 0;
- const clientLeft = d.clientLeft || body.clientLeft || 0;
- const scrollTop = wt.pageYOffset || docEl.scrollTop || body.scrollTop;
- const scrollLeft = wt.pageXOffset || docEl.scrollLeft || body.scrollLeft;
-
- const elComputedStyle = wt.getComputedStyle(domElement, null);
- const elComputedDisplay = elComputedStyle.display || 'block';
- const mustDisplayElement = elComputedDisplay === 'none';
-
- if (mustDisplayElement) {
- domElement.style = domElement.style || {};
- domElement.style.display = 'block';
- box = domElement.getBoundingClientRect();
- domElement.style.display = elComputedDisplay;
- }
- position.x = Math.round(box.left + scrollLeft - clientLeft);
- position.y = Math.round(box.top + scrollTop - clientTop);
- } else {
- return '';
- }
-
- return `${position.x}x${position.y}`;
- },
-
- getTimestampUTC() {
- // timestamp returned in seconds
- return Math.floor(new Date().getTime() / 1000) - new Date().getTimezoneOffset() * 60;
- },
-
- getDevice() {
- const ws = utils.getWindowSelf();
- const ua = ws.navigator.userAgent;
-
- if ((/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i).test(ua)) {
- return 5; // "tablet"
- }
- if ((/Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/).test(ua)) {
- return 4; // "phone"
- }
- return 2; // personal computers
- },
-
- getBrowser() {
- const ws = utils.getWindowSelf();
- const ua = ws.navigator.userAgent;
- const uaLowerCase = ua.toLowerCase();
- return /Edge\/\d./i.test(ua) ? 'edge' : uaLowerCase.indexOf('chrome') > 0 ? 'chrome' : uaLowerCase.indexOf('firefox') > 0 ? 'firefox' : uaLowerCase.indexOf('safari') > 0 ? 'safari' : uaLowerCase.indexOf('opera') > 0 ? 'opera' : uaLowerCase.indexOf('msie') > 0 || ws.MSStream ? 'ie' : 'unknow';
- },
-
- getOS() {
- const ws = utils.getWindowSelf();
- const ua = ws.navigator.userAgent;
- const uaLowerCase = ua.toLowerCase();
- return uaLowerCase.indexOf('linux') > 0 ? 'linux' : uaLowerCase.indexOf('mac') > 0 ? 'mac' : uaLowerCase.indexOf('win') > 0 ? 'windows' : '';
- },
-
- getUrl(refererInfo) {
- // top has not been reached, it means we are not sure
- // to get the proper page url.
- if (!refererInfo.reachedTop) {
- return;
- }
- return refererInfo.referer;
- },
-
- getUrlFromParams(params) {
- const { postBidOptions } = params;
- if (postBidOptions && postBidOptions.url) {
- return postBidOptions.url;
- }
- }
-};
-
function enqueue(ob) {
const w = internal.getCurrentWindow();
@@ -399,18 +226,6 @@ function enqueue(ob) {
w.ADAGIO.queue.push(ob);
};
-function getOrAddAdagioAdUnit(adUnitCode) {
- const w = internal.getCurrentWindow();
-
- w.ADAGIO = w.ADAGIO || {};
-
- if (w.ADAGIO.adUnits[adUnitCode]) {
- return w.ADAGIO.adUnits[adUnitCode];
- }
-
- return w.ADAGIO.adUnits[adUnitCode] = {};
-};
-
function getPageviewId() {
const w = internal.getCurrentWindow();
@@ -420,28 +235,11 @@ function getPageviewId() {
return w.ADAGIO.pageviewId;
};
-function computePrintNumber(adUnitCode) {
- let printNumber = 1;
- const w = internal.getCurrentWindow();
-
- if (
- w.ADAGIO &&
- w.ADAGIO.adUnits && w.ADAGIO.adUnits[adUnitCode] &&
- w.ADAGIO.adUnits[adUnitCode].pageviewId === internal.getPageviewId() &&
- w.ADAGIO.adUnits[adUnitCode].printNumber
- ) {
- printNumber = parseInt(w.ADAGIO.adUnits[adUnitCode].printNumber, 10) + 1;
- }
-
- return printNumber;
-};
-
function getDevice() {
const language = navigator.language ? 'language' : 'userLanguage';
return {
userAgent: navigator.userAgent,
language: navigator[language],
- deviceType: _features.getDevice(),
dnt: utils.getDNT() ? 1 : 0,
geo: {},
js: 1
@@ -504,72 +302,12 @@ function getElementFromTopWindow(element, currentWindow) {
}
};
-function autoDetectAdUnitElementId(adUnitCode) {
+function autoDetectAdUnitElementIdFromGpt(adUnitCode) {
const autoDetectedAdUnit = utils.getGptSlotInfoForAdUnitCode(adUnitCode);
- let adUnitElementId = null;
if (autoDetectedAdUnit && autoDetectedAdUnit.divId) {
- adUnitElementId = autoDetectedAdUnit.divId;
+ return autoDetectedAdUnit.divId;
}
-
- return adUnitElementId;
-};
-
-function autoDetectEnvironment() {
- const device = _features.getDevice();
- const map = { 2: 'desktop', 4: 'mobile', 5: 'tablet' };
- return map[device] || 'unknown';
-};
-
-function supportIObs() {
- const currentWindow = internal.getCurrentWindow();
- return !!(currentWindow && currentWindow.IntersectionObserver && currentWindow.IntersectionObserverEntry &&
- currentWindow.IntersectionObserverEntry.prototype && 'intersectionRatio' in currentWindow.IntersectionObserverEntry.prototype);
-}
-
-function getFeatures(bidRequest, bidderRequest) {
- const { adUnitCode, params } = bidRequest;
- const { adUnitElementId } = params;
- const { refererInfo } = bidderRequest;
-
- if (!adUnitElementId) {
- utils.logWarn(`${LOG_PREFIX} unable to get params.adUnitElementId. Continue without tiv.`);
- }
-
- const features = {
- print_number: _features.getPrintNumber(adUnitCode).toString(),
- page_dimensions: _features.getPageDimensions().toString(),
- viewport_dimensions: _features.getViewPortDimensions().toString(),
- dom_loading: _features.getDomLoadingDuration().toString(),
- // layout: features.getLayout().toString(),
- adunit_position: _features.getSlotPosition(params).toString(),
- user_timestamp: _features.getTimestampUTC().toString(),
- device: _features.getDevice().toString(),
- url: _features.getUrl(refererInfo) || _features.getUrlFromParams(params) || '',
- browser: _features.getBrowser(),
- os: _features.getOS()
- };
-
- Object.keys(features).forEach((prop) => {
- if (features[prop] === '') {
- delete features[prop];
- }
- });
-
- const adUnitFeature = {};
-
- adUnitFeature[adUnitElementId] = {
- features: features,
- version: FEATURES_VERSION
- };
-
- internal.enqueue({
- action: 'features',
- ts: Date.now(),
- data: adUnitFeature
- });
-
- return features;
};
function isRendererPreferredFromPublisher(bidRequest) {
@@ -604,23 +342,16 @@ function isNewSession(adagioStorage) {
export const internal = {
enqueue,
- getOrAddAdagioAdUnit,
getPageviewId,
- computePrintNumber,
getDevice,
getSite,
getElementFromTopWindow,
- autoDetectAdUnitElementId,
- autoDetectEnvironment,
- getFeatures,
getRefererInfo,
adagioScriptFromLocalStorageCb,
getCurrentWindow,
- supportIObs,
canAccessTopWindow,
isRendererPreferredFromPublisher,
- isNewSession,
- prepareExchange
+ isNewSession
};
function _getGdprConsent(bidderRequest) {
@@ -773,8 +504,8 @@ function _parseNativeBidResponse(bid) {
if (bid.admNative.link.url) {
native.clickUrl = bid.admNative.link.url;
}
- if (Array.isArray(bid.admNative.link.clickTrackers)) {
- native.clickTrackers = bid.admNative.link.clickTrackers
+ if (Array.isArray(bid.admNative.link.clicktrackers)) {
+ native.clickTrackers = bid.admNative.link.clicktrackers
}
}
@@ -863,85 +594,288 @@ function _getFloors(bidRequest) {
return floors;
}
+/**
+ * Try to find the value of `paramName` and set it to adUnit.params if
+ * it has not already been set.
+ * This function will check through:
+ * - bidderSettings object
+ * - ortb2.site.ext.data FPD…
+ *
+ * @param {*} bid
+ * @param {String} paramName
+ */
+export function setExtraParam(bid, paramName) {
+ bid.params = bid.params || {};
+
+ // eslint-disable-next-line
+ if (!!(bid.params[paramName])) {
+ return;
+ }
+
+ const adgGlobalConf = config.getConfig('adagio') || {};
+ const ortb2Conf = config.getConfig('ortb2');
+
+ const detected = adgGlobalConf[paramName] || utils.deepAccess(ortb2Conf, `site.ext.data.${paramName}`, null);
+ if (detected) {
+ bid.params[paramName] = detected;
+ }
+}
+
+function autoFillParams(bid) {
+ // adUnitElementId …
+ const adgGlobalConf = config.getConfig('adagio') || {};
+
+ bid.params = bid.params || {};
+
+ // adgGlobalConf.siteId is a shortcut to facilitate the integration for publisher.
+ if (adgGlobalConf.siteId) {
+ bid.params.organizationId = adgGlobalConf.siteId.split(':')[0];
+ bid.params.site = adgGlobalConf.siteId.split(':')[1];
+ }
+
+ // Edge case. Useful when Prebid Manager cannot handle properly params setting…
+ if (adgGlobalConf.useAdUnitCodeAsPlacement === true || bid.params.useAdUnitCodeAsPlacement === true) {
+ bid.params.placement = bid.adUnitCode;
+ }
+
+ bid.params.adUnitElementId = utils.deepAccess(bid, 'ortb2Imp.ext.data.elementId', null) || bid.params.adUnitElementId;
+
+ if (!bid.params.adUnitElementId) {
+ if (adgGlobalConf.useAdUnitCodeAsAdUnitElementId === true || bid.params.useAdUnitCodeAsAdUnitElementId === true) {
+ bid.params.adUnitElementId = bid.adUnitCode;
+ } else {
+ bid.params.adUnitElementId = autoDetectAdUnitElementIdFromGpt(bid.adUnitCode);
+ }
+ }
+
+ // extra params
+ setExtraParam(bid, 'environment');
+ setExtraParam(bid, 'pagetype');
+ setExtraParam(bid, 'category');
+ setExtraParam(bid, 'subcategory');
+}
+
+function getPageDimensions() {
+ if (isSafeFrameWindow() || !canAccessTopWindow()) {
+ return '';
+ }
+
+ // the page dimension can be computed on window.top only.
+ const wt = utils.getWindowTop();
+ const body = wt.document.querySelector('body');
+
+ if (!body) {
+ return '';
+ }
+ const html = wt.document.documentElement;
+ const pageWidth = Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth);
+ const pageHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);
+
+ return `${pageWidth}x${pageHeight}`;
+}
+
+/**
+* @todo Move to prebid Core as Utils.
+* @returns
+*/
+function getViewPortDimensions() {
+ if (!isSafeFrameWindow() && !canAccessTopWindow()) {
+ return '';
+ }
+
+ const viewportDims = { w: 0, h: 0 };
+
+ if (isSafeFrameWindow()) {
+ const ws = utils.getWindowSelf();
+
+ if (typeof ws.$sf.ext.geom !== 'function') {
+ utils.logWarn(LOG_PREFIX, 'Unable to compute from safeframe api.');
+ return '';
+ }
+
+ const sfGeom = ws.$sf.ext.geom();
+
+ if (!sfGeom || !sfGeom.win) {
+ utils.logWarn(LOG_PREFIX, 'Unable to compute from safeframe api. Missing `geom().win` property');
+ return '';
+ }
+
+ viewportDims.w = Math.round(sfGeom.w);
+ viewportDims.h = Math.round(sfGeom.h);
+ } else {
+ // window.top based computing
+ const wt = utils.getWindowTop();
+ viewportDims.w = wt.innerWidth;
+ viewportDims.h = wt.innerHeight;
+ }
+
+ return `${viewportDims.w}x${viewportDims.h}`;
+}
+
+function getSlotPosition(adUnitElementId) {
+ if (!adUnitElementId) {
+ return '';
+ }
+
+ if (!isSafeFrameWindow() && !canAccessTopWindow()) {
+ return '';
+ }
+
+ const position = { x: 0, y: 0 };
+
+ if (isSafeFrameWindow()) {
+ const ws = utils.getWindowSelf();
+
+ if (typeof ws.$sf.ext.geom !== 'function') {
+ utils.logWarn(LOG_PREFIX, 'Unable to compute from safeframe api.');
+ return '';
+ }
+
+ const sfGeom = ws.$sf.ext.geom();
+
+ if (!sfGeom || !sfGeom.self) {
+ utils.logWarn(LOG_PREFIX, 'Unable to compute from safeframe api. Missing `geom().self` property');
+ return '';
+ }
+
+ position.x = Math.round(sfGeom.t);
+ position.y = Math.round(sfGeom.l);
+ } else if (canAccessTopWindow()) {
+ // window.top based computing
+ const wt = utils.getWindowTop();
+ const d = wt.document;
+
+ let domElement;
+
+ if (utils.inIframe() === true) {
+ const ws = utils.getWindowSelf();
+ const currentElement = ws.document.getElementById(adUnitElementId);
+ domElement = internal.getElementFromTopWindow(currentElement, ws);
+ } else {
+ domElement = wt.document.getElementById(adUnitElementId);
+ }
+
+ if (!domElement) {
+ return '';
+ }
+
+ let box = domElement.getBoundingClientRect();
+
+ const docEl = d.documentElement;
+ const body = d.body;
+ const clientTop = d.clientTop || body.clientTop || 0;
+ const clientLeft = d.clientLeft || body.clientLeft || 0;
+ const scrollTop = wt.pageYOffset || docEl.scrollTop || body.scrollTop;
+ const scrollLeft = wt.pageXOffset || docEl.scrollLeft || body.scrollLeft;
+
+ const elComputedStyle = wt.getComputedStyle(domElement, null);
+ const elComputedDisplay = elComputedStyle.display || 'block';
+ const mustDisplayElement = elComputedDisplay === 'none';
+
+ if (mustDisplayElement) {
+ domElement.style = domElement.style || {};
+ domElement.style.display = 'block';
+ box = domElement.getBoundingClientRect();
+ domElement.style.display = elComputedDisplay;
+ }
+ position.x = Math.round(box.left + scrollLeft - clientLeft);
+ position.y = Math.round(box.top + scrollTop - clientTop);
+ } else {
+ return '';
+ }
+
+ return `${position.x}x${position.y}`;
+}
+
+function getTimestampUTC() {
+ // timestamp returned in seconds
+ return Math.floor(new Date().getTime() / 1000) - new Date().getTimezoneOffset() * 60;
+}
+
+function getPrintNumber(adUnitCode, bidderRequest) {
+ if (!bidderRequest.bids || !bidderRequest.bids.length) {
+ return 1;
+ }
+ const adagioBid = find(bidderRequest.bids, bid => bid.adUnitCode === adUnitCode);
+ return adagioBid.bidRequestsCount || 1;
+}
+
+/**
+ * domLoading feature is computed on window.top if reachable.
+ */
+function getDomLoadingDuration() {
+ let domLoadingDuration = -1;
+ let performance;
+
+ performance = (canAccessTopWindow()) ? utils.getWindowTop().performance : utils.getWindowSelf().performance;
+
+ if (performance && performance.timing && performance.timing.navigationStart > 0) {
+ const val = performance.timing.domLoading - performance.timing.navigationStart;
+ if (val > 0) {
+ domLoadingDuration = val;
+ }
+ }
+
+ return domLoadingDuration;
+}
+
+function storeRequestInAdagioNS(bidRequest) {
+ const w = getCurrentWindow();
+ // Store adUnits config.
+ // If an adUnitCode has already been stored, it will be replaced.
+ w.ADAGIO = w.ADAGIO || {};
+ w.ADAGIO.pbjsAdUnits = w.ADAGIO.pbjsAdUnits.filter((adUnit) => adUnit.code !== bidRequest.adUnitCode);
+
+ let printNumber
+ if (bidRequest.features && bidRequest.features.print_number) {
+ printNumber = bidRequest.features.print_number;
+ } else if (bidRequest.params.features && bidRequest.params.features.print_number) {
+ printNumber = bidRequest.params.features.print_number;
+ }
+
+ w.ADAGIO.pbjsAdUnits.push({
+ code: bidRequest.adUnitCode,
+ mediaTypes: bidRequest.mediaTypes || {},
+ sizes: (bidRequest.mediaTypes && bidRequest.mediaTypes.banner && Array.isArray(bidRequest.mediaTypes.banner.sizes)) ? bidRequest.mediaTypes.banner.sizes : bidRequest.sizes,
+ bids: [{
+ bidder: bidRequest.bidder,
+ params: bidRequest.params // use the updated bid.params object with auto-detected params
+ }],
+ auctionId: bidRequest.auctionId,
+ pageviewId: internal.getPageviewId(),
+ printNumber
+ });
+
+ // (legacy) Store internal adUnit information
+ w.ADAGIO.adUnits[bidRequest.adUnitCode] = {
+ auctionId: bidRequest.auctionId,
+ pageviewId: internal.getPageviewId(),
+ printNumber,
+ };
+}
+
export const spec = {
code: BIDDER_CODE,
gvlid: GVLID,
supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
isBidRequestValid(bid) {
- const { adUnitCode, auctionId, sizes, bidder, params, mediaTypes } = bid;
- if (!params) {
- utils.logWarn(`${LOG_PREFIX} the "params" property is missing.`);
- return false;
- }
-
- const { organizationId, site } = params;
- const adUnitElementId = (params.useAdUnitCodeAsAdUnitElementId === true)
- ? adUnitCode
- : params.adUnitElementId || internal.autoDetectAdUnitElementId(adUnitCode);
- const placement = (params.useAdUnitCodeAsPlacement === true) ? adUnitCode : params.placement;
- const environment = params.environment || internal.autoDetectEnvironment();
- const supportIObs = internal.supportIObs();
-
- // insure auto-detected params are kept in `bid` object.
- bid.params = {
- ...params,
- adUnitElementId,
- environment,
- placement,
- supportIObs
- };
-
- const debugData = () => ({
- action: 'pb-dbg',
- ts: Date.now(),
- data: {
- bid
- }
- });
+ bid.params = bid.params || {};
- const refererInfo = internal.getRefererInfo();
+ autoFillParams(bid);
- if (!refererInfo.reachedTop) {
+ if (!internal.getRefererInfo().reachedTop) {
utils.logWarn(`${LOG_PREFIX} the main page url is unreachabled.`);
- internal.enqueue(debugData());
-
+ // internal.enqueue(debugData());
return false;
- } else if (!(organizationId && site && placement)) {
- utils.logWarn(`${LOG_PREFIX} at least one required param is missing.`);
- internal.enqueue(debugData());
+ }
+ if (!(bid.params.organizationId && bid.params.site && bid.params.placement)) {
+ utils.logWarn(`${LOG_PREFIX} at least one required param is missing.`);
+ // internal.enqueue(debugData());
return false;
}
- const w = internal.getCurrentWindow();
- const pageviewId = internal.getPageviewId();
- const printNumber = internal.computePrintNumber(adUnitCode);
-
- // Store adUnits config.
- // If an adUnitCode has already been stored, it will be replaced.
- w.ADAGIO = w.ADAGIO || {};
- w.ADAGIO.pbjsAdUnits = w.ADAGIO.pbjsAdUnits.filter((adUnit) => adUnit.code !== adUnitCode);
- w.ADAGIO.pbjsAdUnits.push({
- code: adUnitCode,
- mediaTypes: mediaTypes || {},
- sizes: (mediaTypes && mediaTypes.banner && Array.isArray(mediaTypes.banner.sizes)) ? mediaTypes.banner.sizes : sizes,
- bids: [{
- bidder,
- params: bid.params // use the updated bid.params object with auto-detected params
- }],
- auctionId,
- pageviewId,
- printNumber
- });
-
- // (legacy) Store internal adUnit information
- w.ADAGIO.adUnits[adUnitCode] = {
- auctionId,
- pageviewId,
- printNumber,
- };
-
return true;
},
@@ -955,8 +889,32 @@ export const spec = {
const coppa = _getCoppa();
const schain = _getSchain(validBidRequests[0]);
const eids = _getEids(validBidRequests[0]) || [];
+
const adUnits = utils._map(validBidRequests, (bidRequest) => {
- bidRequest.features = internal.getFeatures(bidRequest, bidderRequest);
+ const globalFeatures = GlobalExchange.getOrSetGlobalFeatures();
+ const features = {
+ ...globalFeatures,
+ print_number: getPrintNumber(bidRequest.adUnitCode, bidderRequest).toString(),
+ adunit_position: getSlotPosition(bidRequest.params.adUnitElementId) // adUnitElementId à déplacer ???
+ };
+
+ Object.keys(features).forEach((prop) => {
+ if (features[prop] === '') {
+ delete features[prop];
+ }
+ });
+
+ bidRequest.features = features;
+
+ internal.enqueue({
+ action: 'features',
+ ts: Date.now(),
+ data: {
+ features: bidRequest.features,
+ params: bidRequest.params,
+ adUnitCode: bidRequest.adUnitCode
+ }
+ });
// Handle priceFloors module
bidRequest.floors = _getFloors(bidRequest);
@@ -965,6 +923,8 @@ export const spec = {
_buildVideoBidRequest(bidRequest);
}
+ storeRequestInAdagioNS(bidRequest);
+
return bidRequest;
});
@@ -975,6 +935,7 @@ export const spec = {
// remove useless props
delete adUnitCopy.floorData;
+ delete adUnitCopy.params.siteId;
groupedAdUnits[adUnitCopy.params.organizationId] = groupedAdUnits[adUnitCopy.params.organizationId] || [];
groupedAdUnits[adUnitCopy.params.organizationId].push(adUnitCopy);
@@ -995,7 +956,7 @@ export const spec = {
site: site,
pageviewId: pageviewId,
adUnits: groupedAdUnits[organizationId],
- data: EXT_DATA,
+ data: GlobalExchange.getExchangeData(),
regs: {
gdpr: gdprConsent,
coppa: coppa,
@@ -1006,7 +967,6 @@ export const spec = {
eids: eids
},
prebidVersion: '$prebid.version$',
- adapterVersion: VERSION,
featuresVersion: FEATURES_VERSION
},
options: {
@@ -1094,6 +1054,39 @@ export const spec = {
return syncs;
},
+
+ /**
+ * Handle custom logic in s2s context
+ *
+ * @param {*} params
+ * @param {boolean} isOrtb Is an s2s context
+ * @param {*} adUnit
+ * @param {*} bidRequests
+ * @returns {object} updated params
+ */
+ transformBidParams(params, isOrtb, adUnit, bidRequests) {
+ const adagioBidderRequest = find(bidRequests, bidRequest => bidRequest.bidderCode === 'adagio');
+ const adagioBid = find(adagioBidderRequest.bids, bid => bid.adUnitCode === adUnit.code);
+
+ if (isOrtb) {
+ autoFillParams(adagioBid);
+
+ const globalFeatures = GlobalExchange.getOrSetGlobalFeatures();
+ adagioBid.params.features = {
+ ...globalFeatures,
+ print_number: getPrintNumber(adagioBid.adUnitCode, adagioBidderRequest).toString(),
+ adunit_position: getSlotPosition(adagioBid.params.adUnitElementId) // adUnitElementId à déplacer ???
+ }
+
+ adagioBid.params.pageviewId = internal.getPageviewId();
+ adagioBid.params.prebidVersion = '$prebid.version$';
+ adagioBid.params.data = GlobalExchange.getExchangeData();
+
+ storeRequestInAdagioNS(adagioBid);
+ }
+
+ return adagioBid.params;
+ }
};
initAdagio();
diff --git a/modules/adagioBidAdapter.md b/modules/adagioBidAdapter.md
index 46656d88d37..2779ced8cea 100644
--- a/modules/adagioBidAdapter.md
+++ b/modules/adagioBidAdapter.md
@@ -8,187 +8,227 @@ Maintainer: dev@adagio.io
Connects to Adagio demand source to fetch bids.
-## Test Parameters
+## Configuration
+
+Adagio require several params. These params must be set at Prebid.js global config level or at adUnit level.
+
+Below, the list of Adagio params and where they can be set.
+
+| Param name | Global config | AdUnit config |
+| ---------- | ------------- | ------------- |
+| siteId | x |
+| organizationId (obsolete) | | x
+| site (obsolete) | | x
+| pagetype | x | x
+| environment | x | x
+| category | x | x
+| subcategory | x | x
+| useAdUnitCodeAsAdUnitElementId | x | x
+| useAdUnitCodeAsPlacement | x | x
+| placement | | x
+| adUnitElementId | | x
+| debug | | x
+| video | | x
+| native | | x
+
+### Global configuration
+
+The global configuration is used to store params once instead of duplicate them to each adUnit. The values will be used as "params" in the ad-request.
```javascript
- var adUnits = [
- {
- code: 'dfp_banniere_atf',
- mediaTypes: {
- banner: {
- sizes: [[300, 250], [300, 600]],
- }
+pbjs.setConfig({
+ debug: false,
+ // …,
+ adagio: {
+ siteId: '1002:adagio-io', // Required. Provided by Adagio
+
+ // The following params are limited to 30 characters,
+ // and can only contain the following characters:
+ // - alphanumeric (A-Z+a-z+0-9, case-insensitive)
+ // - dashes `-`
+ // - underscores `_`
+ // Also, each param can have at most 50 unique active values (case-insensitive).
+ pagetype: 'article', // Highly recommended. The pagetype describes what kind of content will be present in the page.
+ environment: 'mobile', // Recommended. Environment where the page is displayed.
+ category: 'sport', // Recommended. Category of the content displayed in the page.
+ subcategory: 'handball', // Optional. Subcategory of the content displayed in the page.
+ useAdUnitCodeAsAdUnitElementId: false, // Optional. Use it by-pass adUnitElementId and use the adUnit code as value
+ useAdUnitCodeAsPlacement: false, // Optional. Use it to by-pass placement and use the adUnit code as value
+ },
+});
+```
+
+### adUnit configuration
+
+```javascript
+var adUnits = [
+ {
+ code: 'dfp_banniere_atf',
+ bids: [{
+ bidder: 'adagio',
+ params: {
+ placement: 'in_article', // Required. Refers to the placement of an adunit in a page. Must not contain any information about the type of device. Other example: `mpu_btf'.
+ adUnitElementId: 'article_outstream', // Required - AdUnit element id. Refers to the adunit id in a page. Usually equals to the adunit code above.
+ // Optional debug mode, used to get a bid response with expected cpm.
+ debug: {
+ enabled: true,
+ cpm: 3.00 // default to 1.00
},
- bids: [{
- bidder: 'adagio', // Required
- params: {
- organizationId: '1002', // Required - Organization ID provided by Adagio.
- site: 'adagio-io', // Required - Site Name provided by Adagio.
- placement: 'in_article', // Required. Refers to the placement of an adunit in a page. Must not contain any information about the type of device. Other example: `mpu_btf'.
- adUnitElementId: 'article_outstream', // Required - AdUnit element id. Refers to the adunit id in a page. Usually equals to the adunit code above.
-
- // The following params are limited to 30 characters,
- // and can only contain the following characters:
- // - alphanumeric (A-Z+a-z+0-9, case-insensitive)
- // - dashes `-`
- // - underscores `_`
- // Also, each param can have at most 50 unique active values (case-insensitive).
- pagetype: 'article', // Highly recommended. The pagetype describes what kind of content will be present in the page.
- environment: 'mobile', // Recommended. Environment where the page is displayed.
- category: 'sport', // Recommended. Category of the content displayed in the page.
- subcategory: 'handball', // Optional. Subcategory of the content displayed in the page.
- postBid: false, // Optional. Use it in case of Post-bid integration only.
- useAdUnitCodeAsAdUnitElementId: false, // Optional. Use it by-pass adUnitElementId and use the adUnit code as value
- useAdUnitCodeAsPlacement: false, // Optional. Use it to by-pass placement and use the adUnit code as value
- // Optional debug mode, used to get a bid response with expected cpm.
- debug: {
- enabled: true,
- cpm: 3.00 // default to 1.00
- }
+ video: {
+ skip: 0
+ // OpenRTB 2.5 video options defined here override ones defined in mediaTypes.
+ },
+ native: {
+ // Optional OpenRTB Native 1.2 request object. Only `context`, `plcmttype` fields are supported.
+ context: 1,
+ plcmttype: 2
+ },
+ }
+ }]
+ }
+];
+```
+
+## Test Parameters
+
+```javascript
+
+ pbjs.setConfig({
+ debug: true,
+ adagio: {
+ pagetype: 'article',
+ environment: 'mobile',
+ category: 'sport',
+ subcategory: 'handball',
+ useAdUnitCodeAsAdUnitElementId: false,
+ useAdUnitCodeAsPlacement: false,
+ }
+ });
+
+ var adUnits = [
+ {
+ code: 'dfp_banniere_atf',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250], [300, 600]],
+ }
+ },
+ bids: [{
+ bidder: 'adagio', // Required
+ params: {
+ placement: 'in_article',
+ adUnitElementId: 'article_outstream',
+ debug: {
+ enabled: true,
+ cpm: 3.00 // default to 1.00
}
- }]
+ }
+ }]
+ },
+ {
+ code: 'article_outstream',
+ mediaTypes: {
+ video: {
+ context: 'outstream',
+ playerSize: [640, 480],
+ mimes: ['video/mp4'],
+ skip: 1
+ }
},
- {
- code: 'article_outstream',
- mediaTypes: {
+ bids: [{
+ bidder: 'adagio',
+ params: {
+ placement: 'in_article',
+ adUnitElementId: 'article_outstream',
video: {
- context: 'outstream',
- playerSize: [640, 480],
- mimes: ['video/mp4'],
- skip: 1
- // Other OpenRTB 2.5 video options…
+ skip: 0
+ },
+ debug: {
+ enabled: true,
+ cpm: 3.00
}
- },
- bids: [{
- bidder: 'adagio', // Required
- params: {
- organizationId: '1002', // Required - Organization ID provided by Adagio.
- site: 'adagio-io', // Required - Site Name provided by Adagio.
- placement: 'in_article', // Required. Refers to the placement of an adunit in a page. Must not contain any information about the type of device. Other example: `mpu_btf'.
- adUnitElementId: 'article_outstream', // Required - AdUnit element id. Refers to the adunit id in a page. Usually equals to the adunit code above.
-
- // The following params are limited to 30 characters,
- // and can only contain the following characters:
- // - alphanumeric (A-Z+a-z+0-9, case-insensitive)
- // - dashes `-`
- // - underscores `_`
- // Also, each param can have at most 50 unique active values (case-insensitive).
- pagetype: 'article', // Highly recommended. The pagetype describes what kind of content will be present in the page.
- environment: 'mobile', // Recommended. Environment where the page is displayed.
- category: 'sport', // Recommended. Category of the content displayed in the page.
- subcategory: 'handball', // Optional. Subcategory of the content displayed in the page.
- postBid: false, // Optional. Use it in case of Post-bid integration only.
- useAdUnitCodeAsAdUnitElementId: false, // Optional. Use it by-pass adUnitElementId and use the adUnit code as value
- useAdUnitCodeAsPlacement: false, // Optional. Use it to by-pass placement and use the adUnit code as value
- video: {
- skip: 0
- // OpenRTB 2.5 video options defined here override ones defined in mediaTypes.
- },
- // Optional debug mode, used to get a bid response with expected cpm.
- debug: {
- enabled: true,
- cpm: 3.00 // default to 1.00
+ }
+ }]
+ },
+ {
+ code: 'article_native',
+ mediaTypes: {
+ native: {
+ // generic Prebid options
+ title: {
+ required: true,
+ len: 80
+ },
+ // …
+ // Custom Adagio data assets
+ ext: {
+ adagio_bvw: {
+ required: false
}
}
- }]
+ }
},
- {
- code: 'article_native',
- mediaTypes: {
+ bids: [{
+ bidder: 'adagio',
+ params: {
+ placement: 'in_article',
+ adUnitElementId: 'article_native',
native: {
- // generic Prebid options
- title: {
- required: true,
- len: 80
- },
- // …
- // Custom Adagio data assets
- ext: {
- adagio_bvw: {
- required: false
- }
- }
+ context: 1,
+ plcmttype: 2
+ },
+ debug: {
+ enabled: true,
+ cpm: 3.00
+ }
+ }
+ }]
+ }
+ ];
+
+ pbjs.addAdUnits(adUnits);
+
+ pbjs.bidderSettings = {
+ adagio: {
+ alwaysUseBid: true,
+ adserverTargeting: [
+ {
+ key: "site",
+ val: function (bidResponse) {
+ return bidResponse.site;
}
},
- bids: [{
- bidder: 'adagio', // Required
- params: {
- organizationId: '1002', // Required - Organization ID provided by Adagio.
- site: 'adagio-io', // Required - Site Name provided by Adagio.
- placement: 'in_article', // Required. Refers to the placement of an adunit in a page. Must not contain any information about the type of device. Other example: `mpu_btf'.
- adUnitElementId: 'article_native', // Required - AdUnit element id. Refers to the adunit id in a page. Usually equals to the adunit code above.
-
- // The following params are limited to 30 characters,
- // and can only contain the following characters:
- // - alphanumeric (A-Z+a-z+0-9, case-insensitive)
- // - dashes `-`
- // - underscores `_`
- // Also, each param can have at most 50 unique active values (case-insensitive).
- pagetype: 'article', // Highly recommended. The pagetype describes what kind of content will be present in the page.
- environment: 'mobile', // Recommended. Environment where the page is displayed.
- category: 'sport', // Recommended. Category of the content displayed in the page.
- subcategory: 'handball', // Optional. Subcategory of the content displayed in the page.
- postBid: false, // Optional. Use it in case of Post-bid integration only.
- useAdUnitCodeAsAdUnitElementId: false, // Optional. Use it by-pass adUnitElementId and use the adUnit code as value
- useAdUnitCodeAsPlacement: false, // Optional. Use it to by-pass placement and use the adUnit code as value
- // Optional OpenRTB Native 1.2 request object. Only `context`, `plcmttype` fields are supported.
- native: {
- context: 1,
- plcmttype: 2
- },
- // Optional debug mode, used to get a bid response with expected cpm.
- debug: {
- enabled: true,
- cpm: 3.00 // default to 1.00
- }
+ {
+ key: "environment",
+ val: function (bidResponse) {
+ return bidResponse.environment;
}
- }]
- }
- ];
-
- pbjs.addAdUnits(adUnits);
-
- pbjs.bidderSettings = {
- adagio: {
- alwaysUseBid: true,
- adserverTargeting: [
- {
- key: "site",
- val: function (bidResponse) {
- return bidResponse.site;
- }
- },
- {
- key: "environment",
- val: function (bidResponse) {
- return bidResponse.environment;
- }
- },
- {
- key: "placement",
- val: function (bidResponse) {
- return bidResponse.placement;
- }
- },
- {
- key: "pagetype",
- val: function (bidResponse) {
- return bidResponse.pagetype;
- }
- },
- {
- key: "category",
- val: function (bidResponse) {
- return bidResponse.category;
- }
- },
- {
- key: "subcategory",
- val: function (bidResponse) {
- return bidResponse.subcategory;
- }
+ },
+ {
+ key: "placement",
+ val: function (bidResponse) {
+ return bidResponse.placement;
}
- ]
- }
+ },
+ {
+ key: "pagetype",
+ val: function (bidResponse) {
+ return bidResponse.pagetype;
+ }
+ },
+ {
+ key: "category",
+ val: function (bidResponse) {
+ return bidResponse.category;
+ }
+ },
+ {
+ key: "subcategory",
+ val: function (bidResponse) {
+ return bidResponse.subcategory;
+ }
+ }
+ ]
}
+ }
```
diff --git a/modules/adbookpspBidAdapter.js b/modules/adbookpspBidAdapter.js
new file mode 100644
index 00000000000..d3f3ba295b9
--- /dev/null
+++ b/modules/adbookpspBidAdapter.js
@@ -0,0 +1,796 @@
+import includes from 'core-js-pure/features/array/includes.js';
+import find from 'core-js-pure/features/array/find';
+import { config } from '../src/config.js';
+import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
+import { getStorageManager } from '../src/storageManager.js';
+import * as utils from '../src/utils.js';
+import { registerBidder } from '../src/adapters/bidderFactory.js';
+
+/**
+ * CONSTANTS
+ */
+
+export const VERSION = '1.0.0';
+const EXCHANGE_URL = 'https://ex.fattail.com/openrtb2';
+const WIN_TRACKING_URL = 'https://ev.fattail.com/wins';
+const BIDDER_CODE = 'adbookpsp';
+const USER_ID_KEY = 'hb_adbookpsp_uid';
+const USER_ID_COOKIE_EXP = 2592000000; // lasts 30 days
+const BID_TTL = 300;
+const SUPPORTED_MEDIA_TYPES = [BANNER, VIDEO];
+const DEFAULT_CURRENCY = 'USD';
+const VIDEO_PARAMS = [
+ 'mimes',
+ 'minduration',
+ 'maxduration',
+ 'protocols',
+ 'w',
+ 'h',
+ 'startdelay',
+ 'placement',
+ 'linearity',
+ 'skip',
+ 'skipmin',
+ 'skipafter',
+ 'sequence',
+ 'battr',
+ 'maxextended',
+ 'minbitrate',
+ 'maxbitrate',
+ 'boxingallowed',
+ 'playbackmethod',
+ 'playbackend',
+ 'delivery',
+ 'pos',
+ 'companionad',
+ 'api',
+ 'companiontype',
+ 'ext',
+];
+const TARGETING_VALUE_SEPARATOR = ',';
+
+export const DEFAULT_BIDDER_CONFIG = {
+ bidTTL: BID_TTL,
+ defaultCurrency: DEFAULT_CURRENCY,
+ exchangeUrl: EXCHANGE_URL,
+ winTrackingEnabled: true,
+ winTrackingUrl: WIN_TRACKING_URL,
+ orgId: null,
+};
+
+config.setDefaults({
+ adbookpsp: DEFAULT_BIDDER_CONFIG,
+});
+
+export const spec = {
+ code: BIDDER_CODE,
+ supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
+
+ buildRequests,
+ getUserSyncs,
+ interpretResponse,
+ isBidRequestValid,
+ onBidWon,
+};
+
+registerBidder(spec);
+
+/**
+ * BID REQUEST
+ */
+
+function isBidRequestValid(bidRequest) {
+ return (
+ hasRequiredParams(bidRequest) &&
+ (isValidBannerRequest(bidRequest) || isValidVideoRequest(bidRequest))
+ );
+}
+
+function buildRequests(validBidRequests, bidderRequest) {
+ const requests = [];
+
+ if (validBidRequests.length > 0) {
+ requests.push({
+ method: 'POST',
+ url: getBidderConfig('exchangeUrl'),
+ options: {
+ contentType: 'application/json',
+ withCredentials: true,
+ },
+ data: buildRequest(validBidRequests, bidderRequest),
+ });
+ }
+
+ return requests;
+}
+
+function buildRequest(validBidRequests, bidderRequest) {
+ const request = {
+ id: bidderRequest.bidderRequestId,
+ tmax: bidderRequest.timeout,
+ site: {
+ domain: window.location.hostname,
+ page: window.location.href,
+ ref: bidderRequest.refererInfo.referer,
+ },
+ source: buildSource(validBidRequests, bidderRequest),
+ device: buildDevice(),
+ regs: buildRegs(bidderRequest),
+ user: buildUser(bidderRequest),
+ imp: validBidRequests.map(buildImp),
+ ext: {
+ adbook: {
+ config: getBidderConfig(),
+ version: {
+ prebid: '$prebid.version$',
+ adapter: VERSION,
+ },
+ },
+ },
+ };
+
+ return JSON.stringify(request);
+}
+
+function buildDevice() {
+ const { innerWidth, innerHeight } = common.getWindowDimensions();
+
+ const device = {
+ w: innerWidth,
+ h: innerHeight,
+ js: true,
+ ua: navigator.userAgent,
+ dnt:
+ navigator.doNotTrack === 'yes' ||
+ navigator.doNotTrack == '1' ||
+ navigator.msDoNotTrack == '1'
+ ? 1
+ : 0,
+ };
+
+ const deviceConfig = common.getConfig('device');
+
+ if (utils.isPlainObject(deviceConfig)) {
+ return { ...device, ...deviceConfig };
+ }
+
+ return device;
+}
+
+function buildRegs(bidderRequest) {
+ const regs = {
+ coppa: common.getConfig('coppa') === true ? 1 : 0,
+ };
+
+ if (bidderRequest.gdprConsent) {
+ utils.deepSetValue(
+ regs,
+ 'ext.gdpr',
+ bidderRequest.gdprConsent.gdprApplies ? 1 : 0
+ );
+ utils.deepSetValue(
+ regs,
+ 'ext.gdprConsentString',
+ bidderRequest.gdprConsent.consentString || ''
+ );
+ }
+
+ if (bidderRequest.uspConsent) {
+ utils.deepSetValue(regs, 'ext.us_privacy', bidderRequest.uspConsent);
+ }
+
+ return regs;
+}
+
+function buildSource(bidRequests, bidderRequest) {
+ const source = {
+ fd: 1,
+ tid: bidderRequest.auctionId,
+ };
+ const schain = utils.deepAccess(bidRequests, '0.schain');
+
+ if (schain) {
+ utils.deepSetValue(source, 'ext.schain', schain);
+ }
+
+ return source;
+}
+
+function buildUser(bidderRequest) {
+ const user = {
+ id: getUserId(),
+ };
+
+ if (bidderRequest.gdprConsent) {
+ user.gdprConsentString = bidderRequest.gdprConsent.consentString || '';
+ }
+
+ return user;
+}
+
+function buildImp(bidRequest) {
+ let impBase = {
+ id: bidRequest.bidId,
+ tagid: bidRequest.adUnitCode,
+ ext: buildImpExt(bidRequest),
+ };
+
+ return Object.keys(bidRequest.mediaTypes)
+ .filter((mediaType) => includes(SUPPORTED_MEDIA_TYPES, mediaType))
+ .reduce((imp, mediaType) => {
+ return {
+ ...imp,
+ [mediaType]: buildMediaTypeObject(mediaType, bidRequest),
+ };
+ }, impBase);
+}
+
+function buildMediaTypeObject(mediaType, bidRequest) {
+ switch (mediaType) {
+ case BANNER:
+ return buildBannerObject(bidRequest);
+ case VIDEO:
+ return buildVideoObject(bidRequest);
+ default:
+ utils.logWarn(`${BIDDER_CODE}: Unsupported media type ${mediaType}!`);
+ }
+}
+
+function buildBannerObject(bidRequest) {
+ const format = bidRequest.mediaTypes.banner.sizes.map((size) => {
+ const [w, h] = size;
+
+ return { w, h };
+ });
+ const { w, h } = format[0];
+
+ return {
+ pos: 0,
+ topframe: utils.inIframe() ? 0 : 1,
+ format,
+ w,
+ h,
+ };
+}
+
+function buildVideoObject(bidRequest) {
+ const { w, h } = getVideoSize(bidRequest);
+ let videoObj = {
+ w,
+ h,
+ };
+
+ for (const param of VIDEO_PARAMS) {
+ const paramsValue = utils.deepAccess(bidRequest, `params.video.${param}`);
+ const mediaTypeValue = utils.deepAccess(
+ bidRequest,
+ `mediaTypes.video.${param}`
+ );
+
+ if (paramsValue || mediaTypeValue) {
+ videoObj[param] = paramsValue || mediaTypeValue;
+ }
+ }
+
+ return videoObj;
+}
+
+function getVideoSize(bidRequest) {
+ const playerSize = utils.deepAccess(bidRequest, 'mediaTypes.video.playerSize', [[]]);
+ const { w, h } = utils.deepAccess(bidRequest, 'mediaTypes.video', {});
+
+ if (utils.isNumber(w) && utils.isNumber(h)) {
+ return { w, h };
+ }
+
+ return {
+ w: playerSize[0][0],
+ h: playerSize[0][1],
+ }
+}
+
+function buildImpExt(validBidRequest) {
+ const defaultOrgId = getBidderConfig('orgId');
+ const { orgId, placementId } = validBidRequest.params || {};
+ const effectiverOrgId = orgId || defaultOrgId;
+ const ext = {};
+
+ if (placementId) {
+ utils.deepSetValue(ext, 'adbook.placementId', placementId);
+ }
+
+ if (effectiverOrgId) {
+ utils.deepSetValue(ext, 'adbook.orgId', effectiverOrgId);
+ }
+
+ return ext;
+}
+
+/**
+ * BID RESPONSE
+ */
+
+function interpretResponse(bidResponse, bidderRequest) {
+ const bidderRequestBody = safeJSONparse(bidderRequest.data);
+
+ if (
+ utils.deepAccess(bidderRequestBody, 'id') !=
+ utils.deepAccess(bidResponse, 'body.id')
+ ) {
+ utils.logError(
+ `${BIDDER_CODE}: Bid response id does not match bidder request id`
+ );
+
+ return [];
+ }
+
+ const referrer = utils.deepAccess(bidderRequestBody, 'site.ref', '');
+ const incomingBids = utils
+ .deepAccess(bidResponse, 'body.seatbid', [])
+ .filter((seat) => utils.isArray(seat.bid))
+ .reduce((bids, seat) => bids.concat(seat.bid), [])
+ .filter(validateBid(bidderRequestBody));
+ const targetingMap = buildTargetingMap(incomingBids);
+
+ return impBidsToPrebidBids(
+ incomingBids,
+ bidderRequestBody,
+ bidResponse.body.cur,
+ referrer,
+ targetingMap
+ );
+}
+
+function impBidsToPrebidBids(
+ incomingBids,
+ bidderRequestBody,
+ bidResponseCurrency,
+ referrer,
+ targetingMap
+) {
+ return incomingBids
+ .map(
+ impToPrebidBid(
+ bidderRequestBody,
+ bidResponseCurrency,
+ referrer,
+ targetingMap
+ )
+ )
+ .filter((i) => i !== null);
+}
+
+const impToPrebidBid =
+ (bidderRequestBody, bidResponseCurrency, referrer, targetingMap) => (bid) => {
+ try {
+ const bidRequest = findBidRequest(bidderRequestBody, bid);
+
+ if (!bidRequest) {
+ utils.logError(`${BIDDER_CODE}: Could not match bid to bid request`);
+
+ return null;
+ }
+ const categories = utils.deepAccess(bid, 'cat', []);
+ const mediaType = getMediaType(bid.adm);
+ let prebidBid = {
+ ad: bid.adm,
+ adId: bid.adid,
+ adserverTargeting: targetingMap[bid.impid],
+ adUnitCode: bidRequest.tagid,
+ bidderRequestId: bidderRequestBody.id,
+ bidId: bid.id,
+ cpm: bid.price,
+ creativeId: bid.crid || bid.id,
+ currency: bidResponseCurrency || getBidderConfig('defaultCurrency'),
+ height: bid.h,
+ lineItemId: utils.deepAccess(bid, 'ext.liid'),
+ mediaType,
+ meta: {
+ advertiserDomains: bid.adomain,
+ mediaType,
+ primaryCatId: categories[0],
+ secondaryCatIds: categories.slice(1),
+ },
+ netRevenue: true,
+ nurl: bid.nurl,
+ referrer: referrer,
+ requestId: bid.impid,
+ ttl: getBidderConfig('bidTTL'),
+ width: bid.w,
+ };
+
+ if (mediaType === VIDEO) {
+ prebidBid = {
+ ...prebidBid,
+ ...getVideoSpecificParams(bidRequest, bid),
+ };
+ }
+
+ return prebidBid;
+ } catch (error) {
+ utils.logError(`${BIDDER_CODE}: Error while building bid`, error);
+
+ return null;
+ }
+ };
+
+function getVideoSpecificParams(bidRequest, bid) {
+ return {
+ height: bid.h || bidRequest.video.h,
+ vastXml: bid.adm,
+ width: bid.w || bidRequest.video.w,
+ };
+}
+
+function buildTargetingMap(bids) {
+ const impIds = bids.map(({ impid }) => impid).filter(utils.uniques);
+ const values = impIds.reduce((result, id) => {
+ result[id] = {
+ lineItemIds: [],
+ dealIds: [],
+ adIds: [],
+ };
+
+ return result;
+ }, {});
+
+ bids.forEach((bid) => {
+ values[bid.impid].lineItemIds.push(bid.ext.liid);
+ values[bid.impid].dealIds.push(bid.dealid);
+ values[bid.impid].adIds.push(bid.adid);
+ });
+
+ const targetingMap = {};
+
+ for (const id of impIds) {
+ targetingMap[id] = {
+ hb_liid_adbookpsp: values[id].lineItemIds.join(TARGETING_VALUE_SEPARATOR),
+ hb_deal_adbookpsp: values[id].dealIds.join(TARGETING_VALUE_SEPARATOR),
+ hb_adid_c_adbookpsp: values[id].adIds.join(TARGETING_VALUE_SEPARATOR),
+ };
+ }
+
+ return targetingMap;
+}
+
+/**
+ * VALIDATION
+ */
+
+function hasRequiredParams(bidRequest) {
+ const value =
+ utils.deepAccess(bidRequest, 'params.placementId') != null ||
+ utils.deepAccess(bidRequest, 'params.orgId') != null ||
+ getBidderConfig('orgId') != null;
+
+ if (!value) {
+ utils.logError(`${BIDDER_CODE}: missing orgId and placementId parameter`);
+ }
+
+ return value;
+}
+
+function isValidBannerRequest(bidRequest) {
+ const value = validateSizes(
+ utils.deepAccess(bidRequest, 'mediaTypes.banner.sizes', [])
+ );
+
+ return value;
+}
+
+function isValidVideoRequest(bidRequest) {
+ const value =
+ utils.isArray(utils.deepAccess(bidRequest, 'mediaTypes.video.mimes')) &&
+ validateVideoSizes(bidRequest);
+
+ return value;
+}
+
+function validateSize(size) {
+ return utils.isArray(size) && size.length === 2 && size.every(utils.isNumber);
+}
+
+function validateSizes(sizes) {
+ return utils.isArray(sizes) && sizes.length > 0 && sizes.every(validateSize);
+}
+
+function validateVideoSizes(bidRequest) {
+ const { w, h } = utils.deepAccess(bidRequest, 'mediaTypes.video', {});
+
+ return (
+ validateSizes(
+ utils.deepAccess(bidRequest, 'mediaTypes.video.playerSize')
+ ) ||
+ (utils.isNumber(w) && utils.isNumber(h))
+ );
+}
+
+function validateBid(bidderRequestBody) {
+ return function (bid) {
+ const mediaType = getMediaType(bid.adm);
+ const bidRequest = findBidRequest(bidderRequestBody, bid);
+ let validators = commonBidValidators;
+
+ if (mediaType === BANNER) {
+ validators = [...commonBidValidators, ...bannerBidValidators];
+ }
+
+ const value = validators.every((validator) => validator(bid, bidRequest));
+
+ if (!value) {
+ utils.logWarn(`${BIDDER_CODE}: Invalid bid`, bid);
+ }
+
+ return value;
+ };
+}
+
+const commonBidValidators = [
+ (bid) => utils.isPlainObject(bid),
+ (bid) => isNonEmptyStr(bid.adid),
+ (bid) => isNonEmptyStr(bid.adm),
+ (bid) => isNonEmptyStr(bid.id),
+ (bid) => isNonEmptyStr(bid.impid),
+ (bid) => isNonEmptyStr(utils.deepAccess(bid, 'ext.liid')),
+ (bid) => utils.isNumber(bid.price),
+];
+
+const bannerBidValidators = [
+ validateBannerDimension('w'),
+ validateBannerDimension('h'),
+];
+
+function validateBannerDimension(dimension) {
+ return function (bid, bidRequest) {
+ if (bid[dimension] == null) {
+ return bannerHasSingleSize(bidRequest);
+ }
+
+ return utils.isNumber(bid[dimension]);
+ };
+}
+
+function bannerHasSingleSize(bidRequest) {
+ return utils.deepAccess(bidRequest, 'banner.format', []).length === 1;
+}
+
+/**
+ * USER SYNC
+ */
+
+export const storage = getStorageManager();
+
+function getUserSyncs(syncOptions, responses, gdprConsent, uspConsent) {
+ return responses
+ .map((response) => utils.deepAccess(response, 'body.ext.sync'))
+ .filter(utils.isArray)
+ .reduce(utils.flatten, [])
+ .filter(validateSync(syncOptions))
+ .map(applyConsents(gdprConsent, uspConsent));
+}
+
+const validateSync = (syncOptions) => (sync) => {
+ return (
+ ((sync.type === 'image' && syncOptions.pixelEnabled) ||
+ (sync.type === 'iframe' && syncOptions.iframeEnabled)) &&
+ sync.url
+ );
+};
+
+const applyConsents = (gdprConsent, uspConsent) => (sync) => {
+ const url = getUrlBuilder(sync.url);
+
+ if (gdprConsent) {
+ url.set('gdpr', gdprConsent.gdprApplies ? 1 : 0);
+ url.set('consentString', gdprConsent.consentString || '');
+ }
+ if (uspConsent) {
+ url.set('us_privacy', encodeURIComponent(uspConsent));
+ }
+ if (common.getConfig('coppa') === true) {
+ url.set('coppa', 1);
+ }
+
+ return { ...sync, url: url.toString() };
+};
+
+function getUserId() {
+ const id = getUserIdFromStorage() || common.generateUUID();
+
+ setUserId(id);
+
+ return id;
+}
+
+function getUserIdFromStorage() {
+ const id = storage.localStorageIsEnabled()
+ ? storage.getDataFromLocalStorage(USER_ID_KEY)
+ : storage.getCookie(USER_ID_KEY);
+
+ if (!validateUUID(id)) {
+ return;
+ }
+
+ return id;
+}
+
+function setUserId(userId) {
+ if (storage.localStorageIsEnabled()) {
+ storage.setDataInLocalStorage(USER_ID_KEY, userId);
+ }
+
+ if (storage.cookiesAreEnabled()) {
+ const expires = new Date(Date.now() + USER_ID_COOKIE_EXP).toISOString();
+
+ storage.setCookie(USER_ID_KEY, userId, expires);
+ }
+}
+
+function validateUUID(uuid) {
+ return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(
+ uuid
+ );
+}
+
+/**
+ * EVENT TRACKING
+ */
+
+function onBidWon(bid) {
+ if (!getBidderConfig('winTrackingEnabled')) {
+ return;
+ }
+
+ const wurl = buildWinUrl(bid);
+
+ if (wurl !== null) {
+ utils.triggerPixel(wurl);
+ }
+
+ if (utils.isStr(bid.nurl)) {
+ utils.triggerPixel(bid.nurl);
+ }
+}
+
+function buildWinUrl(bid) {
+ try {
+ const url = getUrlBuilder(getBidderConfig('winTrackingUrl'));
+
+ url.set('impId', bid.requestId);
+ url.set('reqId', bid.bidderRequestId);
+ url.set('bidId', bid.bidId);
+
+ return url.toString();
+ } catch (_) {
+ utils.logError(
+ `${BIDDER_CODE}: Could not build win tracking URL with %s`,
+ getBidderConfig('winTrackingUrl')
+ );
+
+ return null;
+ }
+}
+
+/**
+ * COMMON
+ */
+
+const VAST_REGEXP = /VAST\s+version/;
+
+function getMediaType(adm) {
+ const videoRegex = new RegExp(VAST_REGEXP);
+
+ if (videoRegex.test(adm)) {
+ return VIDEO;
+ }
+
+ const markup = safeJSONparse(adm.replace(/\\/g, ''));
+
+ if (markup && utils.isPlainObject(markup.native)) {
+ return NATIVE;
+ }
+
+ return BANNER;
+}
+
+function safeJSONparse(...args) {
+ try {
+ return JSON.parse(...args);
+ } catch (_) {
+ return undefined;
+ }
+}
+
+function isNonEmptyStr(value) {
+ return utils.isStr(value) && !utils.isEmptyStr(value);
+}
+
+function findBidRequest(bidderRequest, bid) {
+ return find(bidderRequest.imp, (imp) => imp.id === bid.impid);
+}
+
+function getBidderConfig(property) {
+ if (!property) {
+ return common.getConfig(`${BIDDER_CODE}`);
+ }
+
+ return common.getConfig(`${BIDDER_CODE}.${property}`);
+}
+
+const getUrlBase = function (url) {
+ return url.split('?')[0];
+};
+
+const getUrlQuery = function (url) {
+ const query = url.split('?')[1];
+
+ if (!query) {
+ return;
+ }
+
+ return '?' + query.split('#')[0];
+};
+
+const getUrlHash = function (url) {
+ const hash = url.split('#')[1];
+
+ if (!hash) {
+ return;
+ }
+
+ return '#' + hash;
+};
+
+const getUrlBuilder = function (url) {
+ const hash = getUrlHash(url);
+ const base = getUrlBase(url);
+ const query = getUrlQuery(url);
+ const pairs = [];
+
+ function set(key, value) {
+ pairs.push([key, value]);
+
+ return {
+ set,
+ toString,
+ };
+ }
+
+ function toString() {
+ if (!pairs.length) {
+ return url;
+ }
+
+ const queryString = pairs
+ .map(function (pair) {
+ return pair.join('=');
+ })
+ .join('&');
+
+ if (!query) {
+ return base + '?' + queryString + (hash || '');
+ }
+
+ return base + query + '&' + queryString + (hash || '');
+ }
+
+ return {
+ set,
+ toString,
+ };
+};
+
+export const common = {
+ generateUUID: function () {
+ return utils.generateUUID();
+ },
+ getConfig: function (property) {
+ return config.getConfig(property);
+ },
+ getWindowDimensions: function () {
+ return {
+ innerWidth: window.innerWidth,
+ innerHeight: window.innerHeight,
+ };
+ },
+};
diff --git a/modules/adbookpspBidAdapter.md b/modules/adbookpspBidAdapter.md
new file mode 100644
index 00000000000..e258b1fd7c3
--- /dev/null
+++ b/modules/adbookpspBidAdapter.md
@@ -0,0 +1,191 @@
+### Overview
+
+```
+Module Name: AdbookPSP Bid Adapter
+Module Type: Bidder Adapter
+Maintainer: hbsupport@fattail.com
+```
+
+### Description
+
+Prebid.JS adapter that connects to the AdbookPSP demand sources.
+
+*NOTE*: The AdBookPSP Bidder Adapter requires setup and approval before use. The adapter uses custom targeting keys that require a dedicated Google Ad Manager setup to work. Please reach out to your AdbookPSP representative for more details.
+
+### Bidder parameters
+
+Each adUnit with `adbookpsp` adapter has to have either `placementId` or `orgId` set.
+
+```js
+var adUnits = [
+ {
+ bids: [
+ {
+ bidder: 'adbookpsp',
+ params: {
+ placementId: 'example-placement-id',
+ orgId: 'example-org-id',
+ },
+ },
+ ],
+ },
+];
+```
+
+Alternatively, `orgId` can be set globally while configuring prebid.js:
+
+```js
+pbjs.setConfig({
+ adbookpsp: {
+ orgId: 'example-org-id',
+ },
+});
+```
+
+*NOTE*: adUnit orgId will take precedence over the globally set orgId.
+
+#### Banner parameters
+
+Required:
+
+- sizes
+
+Example configuration:
+
+```js
+var adUnits = [
+ {
+ code: 'div-1',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ },
+ }
+ },
+];
+```
+
+#### Video parameters
+
+Required:
+
+- context
+- mimes
+- playerSize
+
+Additionaly, all `Video` object parameters described in chapter `3.2.7` of the [OpenRTB 2.5 specification](https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-API-Specification-Version-2-5-FINAL.pdf) can be passed as bidder params.
+
+Example configuration:
+
+```js
+var adUnits = [
+ {
+ code: 'div-1',
+ mediaTypes: {
+ video: {
+ context: 'outstream',
+ mimes: ['video/mp4', 'video/x-flv'],
+ playerSize: [400, 300],
+ protocols: [2, 3],
+ },
+ },
+ bids: [
+ {
+ bidder: 'adbookpsp',
+ params: {
+ placementId: 'example-placement-id',
+ video: {
+ placement: 2,
+ },
+ },
+ },
+ ],
+ },
+];
+```
+
+*NOTE*: Supporting outstream video requires the publisher to set up a renderer as described [in the Prebid docs](https://docs.prebid.org/dev-docs/show-outstream-video-ads.html).
+
+#### Testing params
+
+To test the adapter, either `placementId: 'example-placement-id'` or `orgId: 'example-org-id'` can be used.
+
+*NOTE*: If any adUnit uses the testing params, all adUnits will receive testing responses.
+
+Example adUnit configuration:
+
+```js
+var adUnits = [
+ {
+ code: 'div-1',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ },
+ },
+ bids: [
+ {
+ bidder: 'adbookpsp',
+ params: {
+ placementId: 'example-placement-id',
+ },
+ },
+ ],
+ },
+];
+```
+
+Example google publisher tag configuration:
+
+```js
+googletag
+ .defineSlot('/22094606581/example-adbookPSP', sizes, 'div-1')
+ .addService(googletag.pubads());
+```
+
+### Configuration
+
+Setting of the `orgId` can be done in the `pbjs.setConfig()` call. If this is the case, both `orgId` and `placementId` become optional. Remember to only call `pbjs.setConfig()` once as each call overwrites anything set in previous calls.
+
+Enabling iframe based user syncs is also encouraged.
+
+```javascript
+pbjs.setConfig({
+ adbookpsp: {
+ orgId: 'example-org-id',
+ winTrackingEnabled: true,
+ },
+ userSync: {
+ filterSettings: {
+ iframe: {
+ bidders: '*',
+ filter: 'include',
+ },
+ },
+ },
+});
+```
+
+### Privacy
+
+GDPR and US Privacy are both supported by default.
+
+#### Event tracking
+
+This adapter tracks win events for it’s bids. This functionality can be disabled by adding `winTrackingEnabled: false` to the adapter configuration:
+
+```js
+pbjs.setConfig({
+ adbookpsp: {
+ winTrackingEnabled: false,
+ },
+});
+```
+
+#### COPPA support
+
+COPPA support can be enabled for all the visitors by changing the config value:
+
+```js
+config.setConfig({ coppa: true });
+```
diff --git a/modules/adbutlerBidAdapter.js b/modules/adbutlerBidAdapter.js
deleted file mode 100644
index 10edd8ae3e3..00000000000
--- a/modules/adbutlerBidAdapter.js
+++ /dev/null
@@ -1,140 +0,0 @@
-'use strict';
-
-import * as utils from '../src/utils.js';
-import {config} from '../src/config.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'adbutler';
-
-export const spec = {
- code: BIDDER_CODE,
- pageID: Math.floor(Math.random() * 10e6),
- aliases: ['divreach', 'doceree'],
-
- isBidRequestValid: function (bid) {
- return !!(bid.params.accountID && bid.params.zoneID);
- },
-
- buildRequests: function (validBidRequests) {
- let i;
- let zoneID;
- let bidRequest;
- let accountID;
- let keyword;
- let domain;
- let requestURI;
- let serverRequests = [];
- let zoneCounters = {};
- let extraParams = {};
-
- for (i = 0; i < validBidRequests.length; i++) {
- bidRequest = validBidRequests[i];
- zoneID = utils.getBidIdParameter('zoneID', bidRequest.params);
- accountID = utils.getBidIdParameter('accountID', bidRequest.params);
- keyword = utils.getBidIdParameter('keyword', bidRequest.params);
- domain = utils.getBidIdParameter('domain', bidRequest.params);
- extraParams = utils.getBidIdParameter('extra', bidRequest.params);
-
- if (!(zoneID in zoneCounters)) {
- zoneCounters[zoneID] = 0;
- }
-
- if (typeof domain === 'undefined' || domain.length === 0) {
- domain = 'servedbyadbutler.com';
- }
-
- requestURI = 'https://' + domain + '/adserve/;type=hbr;';
- requestURI += 'ID=' + encodeURIComponent(accountID) + ';';
- requestURI += 'setID=' + encodeURIComponent(zoneID) + ';';
- requestURI += 'pid=' + encodeURIComponent(spec.pageID) + ';';
- requestURI += 'place=' + encodeURIComponent(zoneCounters[zoneID]) + ';';
-
- // append the keyword for targeting if one was passed in
- if (keyword !== '') {
- requestURI += 'kw=' + encodeURIComponent(keyword) + ';';
- }
-
- for (let key in extraParams) {
- if (extraParams.hasOwnProperty(key)) {
- let val = encodeURIComponent(extraParams[key]);
- requestURI += `${key}=${val};`;
- }
- }
-
- zoneCounters[zoneID]++;
- serverRequests.push({
- method: 'GET',
- url: requestURI,
- data: {},
- bidRequest: bidRequest
- });
- }
- return serverRequests;
- },
-
- interpretResponse: function (serverResponse, bidRequest) {
- const bidObj = bidRequest.bidRequest;
- let bidResponses = [];
- let bidResponse = {};
- let isCorrectSize = false;
- let isCorrectCPM = true;
- let CPM;
- let minCPM;
- let maxCPM;
- let width;
- let height;
-
- serverResponse = serverResponse.body;
- if (serverResponse && serverResponse.status === 'SUCCESS' && bidObj) {
- CPM = serverResponse.cpm;
- minCPM = utils.getBidIdParameter('minCPM', bidObj.params);
- maxCPM = utils.getBidIdParameter('maxCPM', bidObj.params);
- width = parseInt(serverResponse.width);
- height = parseInt(serverResponse.height);
-
- // Ensure response CPM is within the given bounds
- if (minCPM !== '' && CPM < parseFloat(minCPM)) {
- isCorrectCPM = false;
- }
- if (maxCPM !== '' && CPM > parseFloat(maxCPM)) {
- isCorrectCPM = false;
- }
-
- // Ensure that response ad matches one of the placement sizes.
- utils._each(utils.deepAccess(bidObj, 'mediaTypes.banner.sizes', []), function (size) {
- if (width === size[0] && height === size[1]) {
- isCorrectSize = true;
- }
- });
- if (isCorrectCPM && isCorrectSize) {
- bidResponse.requestId = bidObj.bidId;
- bidResponse.bidderCode = bidObj.bidder;
- bidResponse.creativeId = serverResponse.placement_id;
- bidResponse.cpm = CPM;
- bidResponse.width = width;
- bidResponse.height = height;
- bidResponse.ad = serverResponse.ad_code;
- bidResponse.ad += spec.addTrackingPixels(serverResponse.tracking_pixels);
- bidResponse.currency = 'USD';
- bidResponse.netRevenue = true;
- bidResponse.ttl = config.getConfig('_bidderTimeout');
- bidResponse.referrer = utils.deepAccess(bidObj, 'refererInfo.referer');
- bidResponses.push(bidResponse);
- }
- }
- return bidResponses;
- },
-
- addTrackingPixels: function (trackingPixels) {
- let trackingPixelMarkup = '';
- utils._each(trackingPixels, function (pixelURL) {
- let trackingPixel = ' ';
-
- trackingPixelMarkup += trackingPixel;
- });
- return trackingPixelMarkup;
- }
-};
-registerBidder(spec);
diff --git a/modules/adfBidAdapter.js b/modules/adfBidAdapter.js
index 5893891eba6..7666e98b374 100644
--- a/modules/adfBidAdapter.js
+++ b/modules/adfBidAdapter.js
@@ -15,7 +15,10 @@ const { getConfig } = config;
const BIDDER_CODE = 'adf';
const GVLID = 50;
-const BIDDER_ALIAS = [ { code: 'adformOpenRTB', gvlid: GVLID } ];
+const BIDDER_ALIAS = [
+ { code: 'adformOpenRTB', gvlid: GVLID },
+ { code: 'adform', gvlid: GVLID }
+];
const NATIVE_ASSET_IDS = { 0: 'title', 2: 'icon', 3: 'image', 5: 'sponsoredBy', 4: 'body', 1: 'cta' };
const NATIVE_PARAMS = {
title: {
diff --git a/modules/adfinityBidAdapter.js b/modules/adfinityBidAdapter.js
deleted file mode 100644
index ebf1198fba2..00000000000
--- a/modules/adfinityBidAdapter.js
+++ /dev/null
@@ -1,125 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'adfinity';
-const AD_URL = 'https://stat.adfinity.pro/?c=o&m=multi';
-const SYNC_URL = 'https://stat.adfinity.pro/?c=o&m=cookie'
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency) {
- return false;
- }
-
- switch (bid.mediaType) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- const n = bid.native
- return Boolean(n) && Boolean(n.title) && Boolean(n.body) && Boolean(n.image) && Boolean(n.impression_trackers);
- default:
- return false;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
- /**
- * Determines whether or not the given bid request is valid.
- *
- * @param {object} bid The bid to validate.
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(bid.params.placement_id));
- },
-
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the Server.
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: (validBidRequests, bidderRequest) => {
- let winTop = window;
- let location;
- try {
- location = new URL(bidderRequest.refererInfo.referer)
- winTop = window.top;
- } catch (e) {
- location = winTop.location;
- utils.logMessage(e);
- };
- let placements = [];
- let request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language : '',
- 'secure': 1,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
-
- if (bidderRequest) {
- if (bidderRequest.gdprConsent) {
- request.gdpr_consent = bidderRequest.gdprConsent.consentString || 'ALL'
- request.gdpr_require = bidderRequest.gdprConsent.gdprApplies ? 1 : 0
- }
- }
-
- for (let i = 0; i < validBidRequests.length; i++) {
- let bid = validBidRequests[i];
- let traff = bid.params.traffic || BANNER
- let placement = {
- placementId: bid.params.placement_id,
- bidId: bid.bidId,
- sizes: bid.mediaTypes[traff].sizes,
- traffic: traff
- };
- if (bid.schain) {
- placement.schain = bid.schain;
- }
- placements.push(placement);
- }
- return {
- method: 'POST',
- url: AD_URL,
- data: request
- };
- },
-
- /**
- * 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: (serverResponse) => {
- let response = [];
- try {
- serverResponse = serverResponse.body;
- for (let i = 0; i < serverResponse.length; i++) {
- let resItem = serverResponse[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- } catch (e) {
- utils.logMessage(e);
- };
- return response;
- },
-
- getUserSyncs: () => {
- return [{
- type: 'image',
- url: SYNC_URL
- }];
- }
-};
-
-registerBidder(spec);
diff --git a/modules/adformBidAdapter.js b/modules/adformBidAdapter.js
deleted file mode 100644
index 3d0ed0fba79..00000000000
--- a/modules/adformBidAdapter.js
+++ /dev/null
@@ -1,213 +0,0 @@
-'use strict';
-
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { config } from '../src/config.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-import { Renderer } from '../src/Renderer.js';
-import * as utils from '../src/utils.js';
-import includes from 'core-js-pure/features/array/includes.js';
-
-const OUTSTREAM_RENDERER_URL = 'https://s2.adform.net/banners/scripts/video/outstream/render.js';
-
-const BIDDER_CODE = 'adform';
-const GVLID = 50;
-export const spec = {
- code: BIDDER_CODE,
- gvlid: GVLID,
- supportedMediaTypes: [ BANNER, VIDEO ],
- isBidRequestValid: function (bid) {
- return !!(bid.params.mid);
- },
- buildRequests: function (validBidRequests, bidderRequest) {
- var i, l, j, k, bid, _key, _value, reqParams, netRevenue, gdprObject;
- const currency = config.getConfig('currency.adServerCurrency');
- const eids = getEncodedEIDs(utils.deepAccess(validBidRequests, '0.userIdAsEids'));
-
- var request = [];
- var globalParams = [ [ 'adxDomain', 'adx.adform.net' ], [ 'fd', 1 ], [ 'url', null ], [ 'tid', null ], [ 'eids', eids ] ];
- const targetingParams = { mkv: [], mkw: [], msw: [] };
-
- var bids = JSON.parse(JSON.stringify(validBidRequests));
- var bidder = (bids[0] && bids[0].bidder) || BIDDER_CODE;
-
- // set common targeting options as query params
- if (bids.length > 1) {
- for (let key in targetingParams) {
- if (targetingParams.hasOwnProperty(key)) {
- const collection = bids.map(bid => ((bid.params[key] && bid.params[key].split(',')) || []));
- targetingParams[key] = collection.reduce(intersects);
- if (targetingParams[key].length) {
- bids.forEach((bid, index) => {
- bid.params[key] = collection[index].filter(item => !includes(targetingParams[key], item));
- });
- }
- }
- }
- }
-
- for (i = 0, l = bids.length; i < l; i++) {
- bid = bids[i];
- if ((bid.params.priceType === 'net') || (bid.params.pt === 'net')) {
- netRevenue = 'net';
- }
-
- for (j = 0, k = globalParams.length; j < k; j++) {
- _key = globalParams[j][0];
- _value = bid[_key] || bid.params[_key];
- if (_value) {
- bid[_key] = bid.params[_key] = null;
- globalParams[j][1] = _value;
- }
- }
- reqParams = bid.params;
- reqParams.transactionId = bid.transactionId;
- reqParams.rcur = reqParams.rcur || currency;
- request.push(formRequestUrl(reqParams));
- }
-
- request.unshift('https://' + globalParams[0][1] + '/adx/?rp=4');
- netRevenue = netRevenue || 'gross';
- request.push('pt=' + netRevenue);
- request.push('stid=' + validBidRequests[0].auctionId);
-
- const gdprApplies = utils.deepAccess(bidderRequest, 'gdprConsent.gdprApplies');
- const consentString = utils.deepAccess(bidderRequest, 'gdprConsent.consentString');
- if (gdprApplies !== undefined) {
- gdprObject = {
- gdpr: gdprApplies,
- gdpr_consent: consentString
- };
- request.push('gdpr=' + (gdprApplies & 1));
- request.push('gdpr_consent=' + consentString);
- }
-
- if (bidderRequest && bidderRequest.uspConsent) {
- request.push('us_privacy=' + bidderRequest.uspConsent);
- }
-
- for (let key in targetingParams) {
- if (targetingParams.hasOwnProperty(key)) {
- globalParams.push([ key, targetingParams[key].join(',') ]);
- }
- }
-
- for (i = 1, l = globalParams.length; i < l; i++) {
- _key = globalParams[i][0];
- _value = globalParams[i][1];
- if (_value) {
- request.push(_key + '=' + encodeURIComponent(_value));
- }
- }
-
- return {
- method: 'GET',
- url: request.join('&'),
- bids: validBidRequests,
- netRevenue: netRevenue,
- bidder,
- gdpr: gdprObject
- };
-
- function formRequestUrl(reqData) {
- var key;
- var url = [];
-
- for (key in reqData) {
- if (reqData.hasOwnProperty(key) && reqData[key]) { url.push(key, '=', reqData[key], '&'); }
- }
-
- return encodeURIComponent(btoa(url.join('').slice(0, -1)));
- }
-
- function getEncodedEIDs(eids) {
- if (utils.isArray(eids) && eids.length > 0) {
- const parsed = parseEIDs(eids);
- return btoa(JSON.stringify(parsed));
- }
- }
-
- function parseEIDs(eids) {
- return eids.reduce((result, eid) => {
- const source = eid.source;
- result[source] = result[source] || {};
-
- eid.uids.forEach(value => {
- const id = value.id + '';
- result[source][id] = result[source][id] || [];
- result[source][id].push(value.atype);
- });
-
- return result;
- }, {});
- }
-
- function intersects(col1, col2) {
- return col1.filter(item => includes(col2, item));
- }
- },
- interpretResponse: function (serverResponse, bidRequest) {
- const VALID_RESPONSES = {
- banner: 1,
- vast_content: 1,
- vast_url: 1
- };
- var bidObject, response, bid, type;
- var bidRespones = [];
- var bids = bidRequest.bids;
- var responses = serverResponse.body;
- for (var i = 0; i < responses.length; i++) {
- response = responses[i];
- type = response.response === 'banner' ? BANNER : VIDEO;
- bid = bids[i];
- if (VALID_RESPONSES[response.response] && (verifySize(response, utils.getAdUnitSizes(bid)) || type === VIDEO)) {
- bidObject = {
- requestId: bid.bidId,
- cpm: response.win_bid,
- width: response.width,
- height: response.height,
- creativeId: bid.bidId,
- dealId: response.deal_id,
- currency: response.win_cur,
- netRevenue: bidRequest.netRevenue !== 'gross',
- ttl: 360,
- meta: { advertiserDomains: response && response.adomain ? response.adomain : [] },
- ad: response.banner,
- bidderCode: bidRequest.bidder,
- transactionId: bid.transactionId,
- vastUrl: response.vast_url,
- vastXml: response.vast_content,
- mediaType: type
- };
-
- if (!bid.renderer && type === VIDEO && utils.deepAccess(bid, 'mediaTypes.video.context') === 'outstream') {
- bidObject.renderer = Renderer.install({id: bid.bidId, url: OUTSTREAM_RENDERER_URL});
- bidObject.renderer.setRender(renderer);
- }
-
- if (bidRequest.gdpr) {
- bidObject.gdpr = bidRequest.gdpr.gdpr;
- bidObject.gdpr_consent = bidRequest.gdpr.gdpr_consent;
- }
- bidRespones.push(bidObject);
- }
- }
- return bidRespones;
-
- function renderer(bid) {
- bid.renderer.push(() => {
- window.Adform.renderOutstream(bid);
- });
- }
-
- function verifySize(adItem, validSizes) {
- for (var j = 0, k = validSizes.length; j < k; j++) {
- if (adItem.width == validSizes[j][0] &&
- adItem.height == validSizes[j][1]) {
- return true;
- }
- }
- return false;
- }
- }
-};
-registerBidder(spec);
diff --git a/modules/adformBidAdapter.md b/modules/adformBidAdapter.md
deleted file mode 100644
index 10ebec37e08..00000000000
--- a/modules/adformBidAdapter.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Overview
-
-Module Name: Adform Bidder Adapter
-Module Type: Bidder Adapter
-Maintainer: Scope.FL.Scripts@adform.com
-
-# Description
-
-Module that connects to Adform demand sources to fetch bids.
-Banner and video formats are supported.
-
-# Test Parameters
-```
- var adUnits = [
- {
- code: 'div-gpt-ad-1460505748561-0',
- sizes: [[300, 250], [250, 300], [300, 600], [600, 300]], // a display size
- bids: [
- {
- bidder: "adform",
- params: {
- adxDomain: 'adx.adform.net', //optional
- mid: '292063',
- priceType: 'net' // default is 'gross'
- }
- }
- ]
- },
- ];
-```
diff --git a/modules/adgenerationBidAdapter.js b/modules/adgenerationBidAdapter.js
index 7f92ab483f6..f43fd284bad 100644
--- a/modules/adgenerationBidAdapter.js
+++ b/modules/adgenerationBidAdapter.js
@@ -2,6 +2,7 @@ import * as utils from '../src/utils.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {BANNER, NATIVE} from '../src/mediaTypes.js';
import {config} from '../src/config.js';
+
const ADG_BIDDER_CODE = 'adgeneration';
export const spec = {
@@ -24,7 +25,7 @@ export const spec = {
* @return ServerRequest Info describing the request to the server.
*/
buildRequests: function (validBidRequests, bidderRequest) {
- const ADGENE_PREBID_VERSION = '1.0.1';
+ const ADGENE_PREBID_VERSION = '1.1.0';
let serverRequests = [];
for (let i = 0, len = validBidRequests.length; i < len; i++) {
const validReq = validBidRequests[i];
@@ -86,6 +87,11 @@ export const spec = {
netRevenue: true,
ttl: body.ttl || 10,
};
+ if (body.adomain && Array.isArray(body.adomain) && body.adomain.length) {
+ bidResponse.meta = {
+ advertiserDomains: body.adomain
+ }
+ }
if (isNative(body)) {
bidResponse.native = createNativeAd(body);
bidResponse.mediaType = NATIVE;
diff --git a/modules/adglareBidAdapter.js b/modules/adglareBidAdapter.js
deleted file mode 100644
index d66a38482ec..00000000000
--- a/modules/adglareBidAdapter.js
+++ /dev/null
@@ -1,90 +0,0 @@
-'use strict';
-
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'adglare';
-
-export const spec = {
- code: BIDDER_CODE,
- isBidRequestValid: function (bid) {
- let p = bid.params;
- if (typeof p.domain === 'string' && !!p.domain.length && p.zID && !isNaN(p.zID) && p.type == 'banner') return true;
- return false;
- },
- buildRequests: function (validBidRequests, bidderRequest) {
- let i;
- let j;
- let bidRequest;
- let zID;
- let domain;
- let keywords;
- let url;
- let type;
- let availscreen = window.innerWidth + 'x' + window.innerHeight;
- let pixelRatio = window.devicePixelRatio || 1;
- let screen = (pixelRatio * window.screen.width) + 'x' + (pixelRatio * window.screen.height);
- let sizes = [];
- let serverRequests = [];
- let timeout = bidderRequest.timeout || 0;
- let referer = bidderRequest.refererInfo.referer || '';
- let reachedtop = bidderRequest.refererInfo.reachedTop || '';
- for (i = 0; i < validBidRequests.length; i++) {
- bidRequest = validBidRequests[i];
- zID = bidRequest.params.zID;
- domain = bidRequest.params.domain;
- keywords = bidRequest.params.keywords || '';
- type = bidRequest.params.type;
-
- // Build ad unit sizes
- if (bidRequest.mediaTypes && bidRequest.mediaTypes[type]) {
- for (j in bidRequest.mediaTypes[type].sizes) {
- sizes.push(bidRequest.mediaTypes[type].sizes[j].join('x'));
- }
- }
-
- // Build URL
- url = 'https://' + domain + '/?' + encodeURIComponent(zID) + '&pbjs&pbjs_version=1';
- url += '&pbjs_type=' + encodeURIComponent(type);
- url += '&pbjs_timeout=' + encodeURIComponent(timeout);
- url += '&pbjs_reachedtop=' + encodeURIComponent(reachedtop);
- url += '&sizes=' + encodeURIComponent(sizes.join(','));
- url += '&screen=' + encodeURIComponent(screen);
- url += '&availscreen=' + encodeURIComponent(availscreen);
- url += '&referer=' + encodeURIComponent(referer);
- if (keywords !== '') {
- url += '&keywords=' + encodeURIComponent(keywords);
- }
-
- // Push server request
- serverRequests.push({
- method: 'GET',
- url: url,
- data: {},
- bidRequest: bidRequest
- });
- }
- return serverRequests;
- },
- interpretResponse: function (serverResponse, request) {
- const bidObj = request.bidRequest;
- let bidResponses = [];
- let bidResponse = {};
- serverResponse = serverResponse.body;
-
- if (serverResponse && serverResponse.status == 'OK' && bidObj) {
- bidResponse.requestId = bidObj.bidId;
- bidResponse.bidderCode = bidObj.bidder;
- bidResponse.cpm = serverResponse.cpm;
- bidResponse.width = serverResponse.width;
- bidResponse.height = serverResponse.height;
- bidResponse.ad = serverResponse.adhtml;
- bidResponse.ttl = serverResponse.ttl;
- bidResponse.creativeId = serverResponse.crID;
- bidResponse.netRevenue = true;
- bidResponse.currency = serverResponse.currency;
- bidResponses.push(bidResponse);
- }
- return bidResponses;
- },
-};
-registerBidder(spec);
diff --git a/modules/adhashBidAdapter.js b/modules/adhashBidAdapter.js
deleted file mode 100644
index b30f9cebbc1..00000000000
--- a/modules/adhashBidAdapter.js
+++ /dev/null
@@ -1,102 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import includes from 'core-js-pure/features/array/includes.js';
-import { BANNER } from '../src/mediaTypes.js';
-
-const VERSION = '1.0';
-
-export const spec = {
- code: 'adhash',
- url: 'https://bidder.adhash.org/rtb?version=' + VERSION + '&prebid=true',
- supportedMediaTypes: [ BANNER ],
-
- isBidRequestValid: (bid) => {
- try {
- const { publisherId, platformURL } = bid.params;
- return (
- includes(Object.keys(bid.mediaTypes), BANNER) &&
- typeof publisherId === 'string' &&
- publisherId.length === 42 &&
- typeof platformURL === 'string' &&
- platformURL.length >= 13
- );
- } catch (error) {
- return false;
- }
- },
-
- buildRequests: (validBidRequests, bidderRequest) => {
- const { gdprConsent } = bidderRequest;
- const { url } = spec;
- const bidRequests = [];
- let referrer = '';
- if (bidderRequest && bidderRequest.refererInfo) {
- referrer = bidderRequest.refererInfo.referer;
- }
- for (var i = 0; i < validBidRequests.length; i++) {
- var index = Math.floor(Math.random() * validBidRequests[i].sizes.length);
- var size = validBidRequests[i].sizes[index].join('x');
- bidRequests.push({
- method: 'POST',
- url: url,
- bidRequest: validBidRequests[i],
- data: {
- timezone: new Date().getTimezoneOffset() / 60,
- location: referrer,
- publisherId: validBidRequests[i].params.publisherId,
- size: {
- screenWidth: window.screen.width,
- screenHeight: window.screen.height
- },
- navigator: {
- platform: window.navigator.platform,
- language: window.navigator.language,
- userAgent: window.navigator.userAgent
- },
- creatives: [{
- size: size,
- position: validBidRequests[i].adUnitCode
- }],
- blockedCreatives: [],
- currentTimestamp: new Date().getTime(),
- recentAds: [],
- GDPR: gdprConsent
- },
- options: {
- withCredentials: false,
- crossOrigin: true
- },
- });
- }
- return bidRequests;
- },
-
- interpretResponse: (serverResponse, request) => {
- const responseBody = serverResponse ? serverResponse.body : {};
-
- if (!responseBody.creatives || responseBody.creatives.length === 0) {
- return [];
- }
-
- const publisherURL = JSON.stringify(request.bidRequest.params.platformURL);
- const oneTimeId = request.bidRequest.adUnitCode + Math.random().toFixed(16).replace('0.', '.');
- const bidderResponse = JSON.stringify({ responseText: JSON.stringify(responseBody) });
- const requestData = JSON.stringify(request.data);
-
- return [{
- requestId: request.bidRequest.bidId,
- cpm: responseBody.creatives[0].costEUR,
- ad:
- `
-
- `,
- width: request.bidRequest.sizes[0][0],
- height: request.bidRequest.sizes[0][1],
- creativeId: request.bidRequest.adUnitCode,
- netRevenue: true,
- currency: 'EUR',
- ttl: 60
- }];
- }
-};
-
-registerBidder(spec);
diff --git a/modules/adheseBidAdapter.js b/modules/adheseBidAdapter.js
index b9dbae529ba..88f3e0e0e4f 100644
--- a/modules/adheseBidAdapter.js
+++ b/modules/adheseBidAdapter.js
@@ -107,6 +107,9 @@ function adResponse(bid, ad) {
originData: adDetails.originData,
origin: adDetails.origin,
originInstance: adDetails.originInstance
+ },
+ meta: {
+ advertiserDomains: ad.adomain || []
}
});
diff --git a/modules/adkernelBidAdapter.js b/modules/adkernelBidAdapter.js
index b18b2333bac..3d868bb91d2 100644
--- a/modules/adkernelBidAdapter.js
+++ b/modules/adkernelBidAdapter.js
@@ -67,7 +67,7 @@ export const spec = {
{code: 'stringads'},
{code: 'bcm'},
{code: 'engageadx'},
- {code: 'converge_digital', gvlid: 248},
+ {code: 'converge', gvlid: 248},
{code: 'adomega'},
{code: 'denakop'}
],
@@ -404,6 +404,10 @@ function buildRtbRequest(imps, bidderRequest, schain) {
if (schain) {
utils.deepSetValue(req, 'source.ext.schain', schain);
}
+ let eids = getExtendedUserIds(bidderRequest);
+ if (eids) {
+ utils.deepSetValue(req, 'user.ext.eids', eids);
+ }
return req;
}
@@ -435,6 +439,13 @@ function createSite(refInfo) {
return site;
}
+function getExtendedUserIds(bidderRequest) {
+ let eids = utils.deepAccess(bidderRequest, 'bids.0.userIdAsEids');
+ if (utils.isArray(eids)) {
+ return eids;
+ }
+}
+
/**
* Format creative with optional nurl call
* @param bid rtb Bid object
diff --git a/modules/adliveBidAdapter.js b/modules/adliveBidAdapter.js
deleted file mode 100644
index 4c703628c4d..00000000000
--- a/modules/adliveBidAdapter.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'adlive';
-const ENDPOINT_URL = 'https://api.publishers.adlive.io/get?pbjs=1';
-
-const CURRENCY = 'USD';
-const TIME_TO_LIVE = 360;
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER],
-
- isBidRequestValid: function(bid) {
- return !!(bid.params.hashes && utils.isArray(bid.params.hashes));
- },
-
- buildRequests: function(validBidRequests) {
- let requests = [];
-
- utils._each(validBidRequests, function(bid) {
- requests.push({
- method: 'POST',
- url: ENDPOINT_URL,
- options: {
- contentType: 'application/json',
- withCredentials: true
- },
- data: JSON.stringify({
- transaction_id: bid.bidId,
- hashes: utils.getBidIdParameter('hashes', bid.params)
- }),
- bidId: bid.bidId
- });
- });
-
- return requests;
- },
-
- interpretResponse: function(serverResponse, bidRequest) {
- try {
- const response = serverResponse.body;
- const bidResponses = [];
-
- utils._each(response, function(bidResponse) {
- if (!bidResponse.is_passback) {
- bidResponses.push({
- requestId: bidRequest.bidId,
- cpm: bidResponse.price,
- width: bidResponse.size[0],
- height: bidResponse.size[1],
- creativeId: bidResponse.hash,
- currency: CURRENCY,
- netRevenue: false,
- ttl: TIME_TO_LIVE,
- ad: bidResponse.content
- });
- }
- });
-
- return bidResponses;
- } catch (err) {
- utils.logError(err);
- return [];
- }
- }
-};
-registerBidder(spec);
diff --git a/modules/admanBidAdapter.js b/modules/admanBidAdapter.js
deleted file mode 100644
index 2e4091e7a24..00000000000
--- a/modules/admanBidAdapter.js
+++ /dev/null
@@ -1,118 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'adman';
-const AD_URL = 'https://pub.admanmedia.com/?c=o&m=multi';
-const URL_SYNC = 'https://pub.admanmedia.com/?c=o&m=sync';
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId ||
- !bid.ttl || !bid.currency) {
- return false;
- }
- switch (bid['mediaType']) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- return Boolean(bid.native && bid.native.title && bid.native.image && bid.native.impressionTrackers);
- default:
- return false;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(bid.params.placementId));
- },
-
- buildRequests: (validBidRequests = [], bidderRequest) => {
- let winTop = window;
- let location;
- try {
- location = new URL(bidderRequest.refererInfo.referer)
- winTop = window.top;
- } catch (e) {
- location = winTop.location;
- utils.logMessage(e);
- };
- let placements = [];
- let request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language : '',
- 'secure': 1,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
- request.language.indexOf('-') != -1 && (request.language = request.language.split('-')[0])
- if (bidderRequest) {
- if (bidderRequest.uspConsent) {
- request.ccpa = bidderRequest.uspConsent;
- }
- if (bidderRequest.gdprConsent) {
- request.gdpr = bidderRequest.gdprConsent
- }
- }
- const len = validBidRequests.length;
-
- for (let i = 0; i < len; i++) {
- let bid = validBidRequests[i];
- let traff = bid.params.traffic || BANNER
-
- placements.push({
- placementId: bid.params.placementId,
- bidId: bid.bidId,
- sizes: bid.mediaTypes && bid.mediaTypes[traff] && bid.mediaTypes[traff].sizes ? bid.mediaTypes[traff].sizes : [],
- traffic: traff
- });
- if (bid.schain) {
- placements.schain = bid.schain;
- }
- }
- return {
- method: 'POST',
- url: AD_URL,
- data: request
- };
- },
-
- interpretResponse: (serverResponse) => {
- let response = [];
- serverResponse = serverResponse.body;
- for (let i = 0; i < serverResponse.length; i++) {
- let resItem = serverResponse[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- return response;
- },
-
- getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => {
- let syncUrl = URL_SYNC
- if (gdprConsent && gdprConsent.consentString) {
- if (typeof gdprConsent.gdprApplies === 'boolean') {
- syncUrl += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
- } else {
- syncUrl += `&gdpr==0&gdpr_consent=${gdprConsent.consentString}`;
- }
- }
- if (uspConsent && uspConsent.consentString) {
- syncUrl += `&ccpa_consent=${uspConsent.consentString}`;
- }
- return [{
- type: 'image',
- url: syncUrl
- }];
- }
-
-};
-
-registerBidder(spec);
diff --git a/modules/admaticBidAdapter.js b/modules/admaticBidAdapter.js
deleted file mode 100644
index d46c01f7f48..00000000000
--- a/modules/admaticBidAdapter.js
+++ /dev/null
@@ -1,147 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'admatic';
-const ENDPOINT_URL = 'https://ads4.admatic.com.tr/prebid/v3/bidrequest';
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['admatic'], // 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.pid && bid.params.wid && bid.params.url);
- },
- /**
- * 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) {
- const payload = {
- request: []
- };
-
- for (var i = 0; i < validBidRequests.length; i++) {
- var validBidRequest = validBidRequests[i];
- payload.auctionId = validBidRequest.auctionId;
- payload.bidder = validBidRequest.bidder;
- payload.bidderRequestId = validBidRequest.bidderRequestId;
- payload.pid = validBidRequest.params.pid;
- payload.wid = validBidRequest.params.wid;
- payload.url = validBidRequest.params.url;
-
- var request = {
- adUnitCode: validBidRequest.adUnitCode,
- bidId: validBidRequest.bidId,
- transactionId: validBidRequest.transactionId,
- priceType: validBidRequest.params.priceType,
- sizes: transformSizes(validBidRequest.sizes)
- }
-
- payload.request.push(request);
- }
-
- const payloadString = JSON.stringify(payload);
-
- return {
- method: 'POST',
- url: ENDPOINT_URL,
- data: payloadString,
- bidder: 'admatic',
- bids: validBidRequests
- };
- },
-
- /**
- * 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, bidRequest) {
- const serverBody = serverResponse.body;
- const bidResponses = [];
-
- if (serverBody) {
- if (serverBody.tags && serverBody.tags.length > 0) {
- serverBody.tags.forEach(serverBid => {
- if (serverBid != null) {
- if (serverBid.cpm !== 0) {
- const bidResponse = {
- requestId: serverBid.bidId,
- cpm: serverBid.cpm,
- width: serverBid.width,
- height: serverBid.height,
- creativeId: serverBid.creativeId,
- dealId: serverBid.dealId,
- currency: serverBid.currency,
- netRevenue: serverBid.netRevenue,
- ttl: serverBid.ttl,
- referrer: serverBid.referrer,
- ad: serverBid.ad
- };
-
- bidResponses.push(bidResponse);
- }
- }
- });
- }
- }
-
- return bidResponses;
- },
- /**
- * 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: function (syncOptions, serverResponses) {
- const syncs = [];
- if (syncOptions.iframeEnabled) {
- syncs.push({
- type: 'iframe',
- url: 'https://ads4.admatic.com.tr/prebid/static/usersync/v3/async_usersync.html'
- });
- }
-
- if (syncOptions.pixelEnabled && serverResponses.length > 0) {
- syncs.push({
- type: 'image',
- url: 'https://ads5.admatic.com.tr/prebid/v3/bidrequest/usersync'
- });
- }
- return syncs;
- }
-}
-
-/* Turn bid request sizes into ut-compatible format */
-function transformSizes(requestSizes) {
- let sizes = [];
- let sizeObj = {};
-
- if (utils.isArray(requestSizes) && requestSizes.length === 2 && !utils.isArray(requestSizes[0])) {
- sizeObj.width = parseInt(requestSizes[0], 10);
- sizeObj.height = parseInt(requestSizes[1], 10);
- sizes.push(sizeObj);
- } else if (typeof requestSizes === 'object') {
- for (let i = 0; i < requestSizes.length; i++) {
- let size = requestSizes[i];
- sizeObj = {};
- sizeObj.width = parseInt(size[0], 10);
- sizeObj.height = parseInt(size[1], 10);
- sizes.push(sizeObj);
- }
- }
-
- return sizes;
-}
-
-registerBidder(spec);
diff --git a/modules/admediaBidAdapter.js b/modules/admediaBidAdapter.js
deleted file mode 100644
index 0a9e510843c..00000000000
--- a/modules/admediaBidAdapter.js
+++ /dev/null
@@ -1,71 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'admedia';
-const ENDPOINT_URL = 'https://prebid.admedia.com/bidder/';
-
-export const spec = {
- code: BIDDER_CODE,
-
- isBidRequestValid: function (bid) {
- return bid.params && !!bid.params.aid;
- },
-
- buildRequests: function (validBidRequests, bidderRequest) {
- let payload = {};
-
- if (bidderRequest && bidderRequest.refererInfo) {
- payload.referer = encodeURIComponent(bidderRequest.refererInfo.referer);
- }
-
- payload.tags = [];
-
- utils._each(validBidRequests, function (bid) {
- const tag = {
- id: bid.bidId,
- sizes: bid.sizes,
- aid: bid.params.aid
- };
- payload.tags.push(tag);
- });
-
- const payloadString = JSON.stringify(payload);
- return {
- method: 'POST',
- url: ENDPOINT_URL,
- data: payloadString,
- };
- },
-
- interpretResponse: function (serverResponse, bidRequest) {
- const bidResponses = [];
-
- if (!serverResponse.body.tags) {
- return bidResponses;
- }
-
- utils._each(serverResponse.body.tags, function (response) {
- if (!response.error && response.cpm > 0) {
- const bidResponse = {
- requestId: response.id,
- cpm: response.cpm,
- width: response.width,
- height: response.height,
- creativeId: response.id,
- dealId: response.id,
- currency: 'USD',
- netRevenue: true,
- ttl: 120,
- // referrer: REFERER,
- ad: response.ad
- };
-
- bidResponses.push(bidResponse);
- }
- });
-
- return bidResponses;
- }
-};
-
-registerBidder(spec);
diff --git a/modules/admixerBidAdapter.js b/modules/admixerBidAdapter.js
index 70ea5666e84..1aecc85fe5a 100644
--- a/modules/admixerBidAdapter.js
+++ b/modules/admixerBidAdapter.js
@@ -4,7 +4,7 @@ import {config} from '../src/config.js';
const BIDDER_CODE = 'admixer';
const ALIASES = ['go2net', 'adblender'];
-const ENDPOINT_URL = 'https://inv-nets.admixer.net/prebid.1.1.aspx';
+const ENDPOINT_URL = 'https://inv-nets.admixer.net/prebid.1.2.aspx';
export const spec = {
code: BIDDER_CODE,
aliases: ALIASES,
@@ -21,7 +21,7 @@ export const spec = {
buildRequests: function (validRequest, bidderRequest) {
const payload = {
imps: [],
- fpd: config.getLegacyFpd(config.getConfig('ortb2'))
+ ortb2: config.getConfig('ortb2'),
};
let endpointUrl;
if (bidderRequest) {
@@ -43,9 +43,7 @@ export const spec = {
}
validRequest.forEach((bid) => {
let imp = {};
- Object.keys(bid).forEach(key => {
- (key === 'ortb2Imp') ? imp.fpd = config.getLegacyImpFpd(bid[key]) : imp[key] = bid[key];
- });
+ Object.keys(bid).forEach(key => imp[key] = bid[key]);
payload.imps.push(imp);
});
const payloadString = JSON.stringify(payload);
@@ -62,26 +60,7 @@ export const spec = {
const bidResponses = [];
try {
const {body: {ads = []} = {}} = serverResponse;
- ads.forEach((bidResponse) => {
- const bidResp = {
- requestId: bidResponse.bidId,
- cpm: bidResponse.cpm,
- width: bidResponse.width,
- height: bidResponse.height,
- ad: bidResponse.ad,
- ttl: bidResponse.ttl,
- creativeId: bidResponse.creativeId,
- netRevenue: bidResponse.netRevenue,
- currency: bidResponse.currency,
- vastUrl: bidResponse.vastUrl,
- dealId: bidResponse.dealId,
- /**
- * currently includes meta.advertiserDomains ; networkId ; advertiserId
- */
- meta: bidResponse.meta,
- };
- bidResponses.push(bidResp);
- });
+ ads.forEach((ad) => bidResponses.push(ad));
} catch (e) {
utils.logError(e);
}
diff --git a/modules/adnuntiusBidAdapter.js b/modules/adnuntiusBidAdapter.js
index 8752e37a96f..68c3e9caffd 100644
--- a/modules/adnuntiusBidAdapter.js
+++ b/modules/adnuntiusBidAdapter.js
@@ -1,30 +1,86 @@
import { registerBidder } from '../src/adapters/bidderFactory.js';
+import { BANNER } from '../src/mediaTypes.js';
+import * as utils from '../src/utils.js';
+import { config } from '../src/config.js';
+import { getStorageManager } from '../src/storageManager.js';
const BIDDER_CODE = 'adnuntius';
-const ENDPOINT_URL = 'https://delivery.adnuntius.com/i?tzo=';
+const ENDPOINT_URL = 'https://ads.adnuntius.delivery/i';
+const GVLID = 855;
+
+const checkSegment = function (segment) {
+ if (utils.isStr(segment)) return segment;
+ if (segment.id) return segment.id
+}
+
+const getSegmentsFromOrtb = function (ortb2) {
+ const userData = utils.deepAccess(ortb2, 'user.data');
+ let segments = [];
+ if (userData) {
+ userData.forEach(userdat => {
+ if (userdat.segment) {
+ segments.push(...userdat.segment.filter(checkSegment).map(checkSegment));
+ }
+ });
+ }
+ return segments
+}
+
+const handleMeta = function () {
+ const storage = getStorageManager(GVLID, 'adnuntius')
+ let adnMeta = null
+ if (storage.localStorageIsEnabled()) {
+ adnMeta = JSON.parse(storage.getDataFromLocalStorage('adn.metaData'))
+ }
+ const meta = (adnMeta !== null) ? adnMeta.reduce((acc, cur) => { return { ...acc, [cur.key]: cur.value } }, {}) : {}
+ return meta
+}
+
+const getUsi = function (meta, ortb2, bidderRequest) {
+ const usi = (meta !== null) ? meta.usi : false;
+ return usi
+}
export const spec = {
code: BIDDER_CODE,
-
+ gvlid: GVLID,
+ supportedMediaTypes: [BANNER],
isBidRequestValid: function (bid) {
return !!(bid.bidId || (bid.params.member && bid.params.invCode));
},
- buildRequests: function (validBidRequests) {
+ buildRequests: function (validBidRequests, bidderRequest) {
const networks = {};
const bidRequests = {};
const requests = [];
+ const request = [];
+ const ortb2 = config.getConfig('ortb2');
+ const adnMeta = handleMeta()
+ const usi = getUsi(adnMeta, ortb2, bidderRequest)
+ const segments = getSegmentsFromOrtb(ortb2);
const tzo = new Date().getTimezoneOffset();
+ const gdprApplies = utils.deepAccess(bidderRequest, 'gdprConsent.gdprApplies');
+ const consentString = utils.deepAccess(bidderRequest, 'gdprConsent.consentString');
+
+ request.push('tzo=' + tzo)
+ request.push('format=json')
+ if (gdprApplies !== undefined) request.push('consentString=' + consentString);
+ if (segments.length > 0) request.push('segments=' + segments.join(','));
+ if (usi) request.push('userId=' + usi);
for (var i = 0; i < validBidRequests.length; i++) {
const bid = validBidRequests[i]
const network = bid.params.network || 'network';
+ const targeting = bid.params.targeting || {};
+
bidRequests[network] = bidRequests[network] || [];
bidRequests[network].push(bid);
networks[network] = networks[network] || {};
networks[network].adUnits = networks[network].adUnits || [];
- networks[network].adUnits.push({ ...bid.params.targeting, auId: bid.params.auId, targetId: bid.bidId });
+ if (bidderRequest && bidderRequest.refererInfo) networks[network].context = bidderRequest.refererInfo.referer;
+ if (adnMeta) networks[network].metaData = adnMeta;
+ networks[network].adUnits.push({ ...targeting, auId: bid.params.auId, targetId: bid.bidId });
}
const networkKeys = Object.keys(networks)
@@ -32,7 +88,7 @@ export const spec = {
const network = networkKeys[j];
requests.push({
method: 'POST',
- url: ENDPOINT_URL + tzo + '&format=json',
+ url: ENDPOINT_URL + '?' + request.join('&'),
data: JSON.stringify(networks[network]),
bid: bidRequests[network]
});
@@ -45,19 +101,19 @@ export const spec = {
const adUnits = serverResponse.body.adUnits;
const bidResponsesById = adUnits.reduce((response, adUnit) => {
if (adUnit.matchedAdCount >= 1) {
- const bid = adUnit.ads[0];
- const effectiveCpm = (bid.cpc && bid.cpm) ? bid.bid.amount + bid.cpm.amount : (bid.cpc) ? bid.bid.amount : (bid.cpm) ? bid.cpm.amount : 0;
+ const ad = adUnit.ads[0];
+ const effectiveCpm = (ad.bid) ? ad.bid.amount * 1000 : 0;
return {
...response,
[adUnit.targetId]: {
requestId: adUnit.targetId,
cpm: effectiveCpm,
- width: Number(bid.creativeWidth),
- height: Number(bid.creativeHeight),
- creativeId: bid.creativeId,
- currency: (bid.bid) ? bid.bid.currency : 'EUR',
+ width: Number(ad.creativeWidth),
+ height: Number(ad.creativeHeight),
+ creativeId: ad.creativeId,
+ currency: (ad.bid) ? ad.bid.currency : 'EUR',
meta: {
- advertiserDomains: (bid.destinationUrls.destination) ? [bid.destinationUrls.destination.split('/')[2]] : []
+ advertiserDomains: (ad.destinationUrls.destination) ? [ad.destinationUrls.destination.split('/')[2]] : []
},
netRevenue: false,
diff --git a/modules/adotBidAdapter.js b/modules/adotBidAdapter.js
index 502ef05b0d5..ddd9531eb43 100644
--- a/modules/adotBidAdapter.js
+++ b/modules/adotBidAdapter.js
@@ -74,7 +74,7 @@ function isBanner(mediaTypes) {
}
function isVideo(mediaTypes) {
- return isPlainObject(mediaTypes) && isPlainObject(mediaTypes.video);
+ return isPlainObject(mediaTypes) && 'video' in mediaTypes;
}
function validateBanner(banner) {
@@ -104,13 +104,16 @@ function validateMediaSizes(mediaSize) {
function validateParameters(parameters, adUnit) {
if (isVideo(adUnit.mediaTypes)) {
if (!isPlainObject(parameters)) return false;
+ if (!isPlainObject(adUnit.mediaTypes.video)) return false;
if (!validateVideoParameters(parameters.video, adUnit)) return false;
}
return true;
}
-function validateVideoParameters(video, adUnit) {
+function validateVideoParameters(videoParams, adUnit) {
+ const video = adUnit.mediaTypes.video;
+
if (!video) return false;
if (!isArray(video.mimes)) return false;
@@ -124,9 +127,9 @@ function validateVideoParameters(video, adUnit) {
if (video.protocols.length === 0) return false;
if (!video.protocols.every(isNumber)) return false;
- if (isInstream(adUnit.mediaTypes.video)) {
- if (!video.instreamContext) return false;
- if (SUPPORTED_INSTREAM_CONTEXTS.indexOf(video.instreamContext) === -1) return false;
+ if (isInstream(video)) {
+ if (!videoParams.instreamContext) return false;
+ if (SUPPORTED_INSTREAM_CONTEXTS.indexOf(videoParams.instreamContext) === -1) return false;
}
return true;
@@ -203,7 +206,7 @@ function generateImpressionsFromAdUnit(acc, adUnit) {
if (mediaType === 'banner') return acc.concat(generateBannerFromAdUnit(impId, data, params));
if (mediaType === 'video') return acc.concat({id: impId, video: generateVideoFromAdUnit(data, params), pmp, ext});
- if (mediaType === 'native') return acc.concat({id: impId, native: generateNativeFromAdUnit(data, params), pmp, ext});
+ if (mediaType === 'native') return acc.concat({id: impId, native: generateNativeFromAdUnit(data), pmp, ext});
}, []);
return acc.concat(imps);
@@ -226,25 +229,52 @@ function generateBannerFromAdUnit(impId, data, params) {
function generateVideoFromAdUnit(data, params) {
const {playerSize} = data;
+ const video = data
+
const hasPlayerSize = isArray(playerSize) && playerSize.length > 0;
- const {position, video = {}} = params;
const {minDuration, maxDuration, protocols} = video;
const size = {width: hasPlayerSize ? playerSize[0][0] : null, height: hasPlayerSize ? playerSize[0][1] : null};
const duration = {min: isNumber(minDuration) ? minDuration : null, max: isNumber(maxDuration) ? maxDuration : null};
+ const startdelay = computeStartDelay(data, params);
return {
mimes: SUPPORTED_VIDEO_MIMES,
+ skip: video.skippable || 0,
w: size.width,
h: size.height,
- startdelay: computeStartDelay(data, params),
+ startdelay: startdelay,
+ linearity: video.linearity || null,
minduration: duration.min,
maxduration: duration.max,
protocols,
- pos: position || 0
+ api: getApi(protocols),
+ format: hasPlayerSize ? playerSize.map(s => {
+ return {w: s[0], h: s[1]};
+ }) : null,
+ pos: video.position || 0
};
}
+function getApi(protocols) {
+ let defaultValue = [2];
+ let listProtocols = [
+ {key: 'VPAID_1_0', value: 1},
+ {key: 'VPAID_2_0', value: 2},
+ {key: 'MRAID_1', value: 3},
+ {key: 'ORMMA', value: 4},
+ {key: 'MRAID_2', value: 5},
+ {key: 'MRAID_3', value: 6},
+ ];
+ if (protocols) {
+ return listProtocols.filter(p => {
+ return protocols.indexOf(p.key) !== -1;
+ }).map(p => p.value)
+ } else {
+ return defaultValue;
+ }
+}
+
function isInstream(video) {
return isPlainObject(video) && (video.context === 'instream');
}
@@ -263,7 +293,7 @@ function computeStartDelay(data, params) {
return null;
}
-function generateNativeFromAdUnit(data, params) {
+function generateNativeFromAdUnit(data) {
const {type} = data;
const presetFormatter = type && NATIVE_PRESET_FORMATTERS[data.type];
const nativeFields = presetFormatter ? presetFormatter(data) : data;
@@ -500,6 +530,10 @@ function generateAdFromBid(bid, bidResponse, serverRequest) {
mediaType: bid.ext.adot.media_type,
};
+ if (bid.adomain) {
+ base.meta = { advertiserDomains: bid.adomain };
+ }
+
if (isBidANative(bid)) return {...base, native: formatNativeData(bid)};
const size = getSizeFromBid(bid, impressionData);
diff --git a/modules/adotBidAdapter.md b/modules/adotBidAdapter.md
index 98a4a1a5970..894a592ec18 100644
--- a/modules/adotBidAdapter.md
+++ b/modules/adotBidAdapter.md
@@ -47,23 +47,22 @@ const adUnit = {
context: 'outstream',
// Video dimensions supported by the video ad unit.
// Each ad unit size is formatted as follows: [width, height].
- playerSize: [[300, 250]]
+ playerSize: [[300, 250]],
+ // Content MIME types supported by the ad unit.
+ mimes: ['video/mp4'],
+ // Minimum accepted video ad duration (in seconds).
+ minDuration: 5,
+ // Maximum accepted video ad duration (in seconds).
+ maxDuration: 35,
+ // Video protocols supported by the ad unit (see the OpenRTB 2.5 specifications,
+ // section 5.8).
+ protocols: [2, 3]
}
},
bids: [{
bidder: 'adot',
params: {
- video: {
- // Content MIME types supported by the ad unit.
- mimes: ['video/mp4'],
- // Minimum accepted video ad duration (in seconds).
- minDuration: 5,
- // Maximum accepted video ad duration (in seconds).
- maxDuration: 35,
- // Video protocols supported by the ad unit (see the OpenRTB 2.5 specifications,
- // section 5.8).
- protocols: [2, 3]
- }
+ video: {}
}
}]
}
@@ -82,23 +81,22 @@ const adUnit = {
context: 'instream',
// Video dimensions supported by the video ad unit.
// Each ad unit size is formatted as follows: [width, height].
- playerSize: [[300, 250]]
+ playerSize: [[300, 250]],
+ // Content MIME types supported by the ad unit.
+ mimes: ['video/mp4'],
+ // Minimum accepted video ad duration (in seconds).
+ minDuration: 5,
+ // Maximum accepted video ad duration (in seconds).
+ maxDuration: 35,
+ // Video protocols supported by the ad unit (see the OpenRTB 2.5 specifications,
+ // section 5.8).
+ protocols: [2, 3]
}
},
bids: [{
bidder: 'adot',
params: {
video: {
- // Content MIME types supported by the ad unit.
- mimes: ['video/mp4'],
- // Minimum accepted video ad duration (in seconds).
- minDuration: 5,
- // Maximum accepted video ad duration (in seconds).
- maxDuration: 35,
- // Video protocols supported by the ad unit (see the OpenRTB 2.5 specifications,
- // section 5.8).
- protocols: [2, 3],
- // Instream video context. Must be either 'pre-roll', 'mid-roll' or 'post-roll'.
instreamContext: 'pre-roll'
}
}
diff --git a/modules/adpartnerBidAdapter.js b/modules/adpartnerBidAdapter.js
deleted file mode 100644
index 2180b472120..00000000000
--- a/modules/adpartnerBidAdapter.js
+++ /dev/null
@@ -1,124 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import * as utils from '../src/utils.js'
-import {ajax} from '../src/ajax.js';
-
-const BIDDER_CODE = 'adpartner';
-export const ENDPOINT_PROTOCOL = 'https';
-export const ENDPOINT_DOMAIN = 'a4p.adpartner.pro';
-export const ENDPOINT_PATH = '/hb/bid';
-
-export const spec = {
- code: BIDDER_CODE,
-
- isBidRequestValid: function (bidRequest) {
- return !!parseInt(bidRequest.params.unitId);
- },
-
- buildRequests: function (validBidRequests, bidderRequest) {
- let referer = window.location.href;
- try {
- referer = typeof bidderRequest.refererInfo === 'undefined'
- ? window.top.location.href
- : bidderRequest.refererInfo.referer;
- } catch (e) {}
-
- let bidRequests = [];
- let beaconParams = {
- tag: [],
- sizes: [],
- referer: ''
- };
-
- validBidRequests.forEach(function(validBidRequest) {
- bidRequests.push({
- unitId: parseInt(validBidRequest.params.unitId),
- adUnitCode: validBidRequest.adUnitCode,
- sizes: validBidRequest.sizes,
- bidId: validBidRequest.bidId,
- referer: referer
- });
-
- beaconParams.tag.push(validBidRequest.params.unitId);
- beaconParams.sizes.push(spec.joinSizesToString(validBidRequest.sizes));
- beaconParams.referer = encodeURIComponent(referer);
- });
-
- beaconParams.tag = beaconParams.tag.join(',');
- beaconParams.sizes = beaconParams.sizes.join(',');
-
- let adPartnerRequestUrl = utils.buildUrl({
- protocol: ENDPOINT_PROTOCOL,
- hostname: ENDPOINT_DOMAIN,
- pathname: ENDPOINT_PATH,
- search: beaconParams
- });
-
- return {
- method: 'POST',
- url: adPartnerRequestUrl,
- data: JSON.stringify(bidRequests)
- };
- },
-
- joinSizesToString: function(sizes) {
- let res = [];
- sizes.forEach(function(size) {
- res.push(size.join('x'));
- });
-
- return res.join('|');
- },
-
- interpretResponse: function (serverResponse, bidRequest) {
- const validBids = JSON.parse(bidRequest.data);
-
- if (typeof serverResponse.body === 'undefined') {
- return [];
- }
-
- return validBids
- .map(bid => ({
- bid: bid,
- ad: serverResponse.body[bid.adUnitCode]
- }))
- .filter(item => item.ad)
- .map(item => spec.adResponse(item.bid, item.ad));
- },
-
- adResponse: function(bid, ad) {
- return {
- requestId: bid.bidId,
- ad: ad.ad,
- cpm: ad.cpm,
- width: ad.width,
- height: ad.height,
- ttl: 60,
- creativeId: ad.creativeId,
- netRevenue: ad.netRevenue,
- currency: ad.currency,
- winNotification: ad.winNotification
- };
- },
-
- onBidWon: function(data) {
- data.winNotification.forEach(function(unitWon) {
- let adPartnerBidWonUrl = utils.buildUrl({
- protocol: ENDPOINT_PROTOCOL,
- hostname: ENDPOINT_DOMAIN,
- pathname: unitWon.path
- });
-
- if (unitWon.method === 'POST') {
- spec.postRequest(adPartnerBidWonUrl, JSON.stringify(unitWon.data));
- }
- });
-
- return true;
- },
-
- postRequest(endpoint, data) {
- ajax(endpoint, null, data, {method: 'POST'});
- }
-}
-
-registerBidder(spec);
diff --git a/modules/adprimeBidAdapter.js b/modules/adprimeBidAdapter.js
deleted file mode 100644
index 12d0410a821..00000000000
--- a/modules/adprimeBidAdapter.js
+++ /dev/null
@@ -1,129 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'adprime';
-const AD_URL = 'https://delta.adprime.com/?c=o&m=multi';
-const SYNC_URL = 'https://delta.adprime.com/?c=rtb&m=sync';
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId ||
- !bid.ttl || !bid.currency) {
- return false;
- }
- switch (bid.mediaType) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- return Boolean(bid.native && bid.native.title && bid.native.image && bid.native.impressionTrackers);
- default:
- return false;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(parseInt(bid.params.placementId)));
- },
-
- buildRequests: (validBidRequests = [], bidderRequest) => {
- let winTop = window;
- let location;
- try {
- location = new URL(bidderRequest.refererInfo.referer)
- winTop = window.top;
- } catch (e) {
- location = winTop.location;
- utils.logMessage(e);
- };
- let placements = [];
- let request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language.split('-')[0] : '',
- 'secure': 1,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
- if (bidderRequest) {
- if (bidderRequest.uspConsent) {
- request.ccpa = bidderRequest.uspConsent;
- }
- if (bidderRequest.gdprConsent) {
- request.gdpr = bidderRequest.gdprConsent
- }
- }
- const len = validBidRequests.length;
-
- for (let i = 0; i < len; i++) {
- let bid = validBidRequests[i];
- let sizes
- let identeties = {}
- if (bid.mediaTypes) {
- if (bid.mediaTypes[BANNER] && bid.mediaTypes[BANNER].sizes) {
- sizes = bid.mediaTypes[BANNER].sizes
- } else if (bid.mediaTypes[VIDEO] && bid.mediaTypes[VIDEO].playerSize) {
- sizes = bid.mediaTypes[VIDEO].playerSize
- }
- }
- if (bid.userId && bid.userId.idl_env) {
- identeties.identityLink = bid.userId.idl_env
- }
-
- placements.push({
- placementId: bid.params.placementId,
- bidId: bid.bidId,
- sizes: sizes || [],
- wPlayer: sizes ? sizes[0] : 0,
- hPlayer: sizes ? sizes[1] : 0,
- traffic: bid.params.traffic || BANNER,
- schain: bid.schain || {},
- keywords: bid.params.keywords || [],
- identeties
- });
- }
- return {
- method: 'POST',
- url: AD_URL,
- data: request
- };
- },
-
- interpretResponse: (serverResponse) => {
- let response = [];
- for (let i = 0; i < serverResponse.body.length; i++) {
- let resItem = serverResponse.body[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- return response;
- },
-
- getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => {
- let syncUrl = SYNC_URL
- if (gdprConsent && gdprConsent.consentString) {
- if (typeof gdprConsent.gdprApplies === 'boolean') {
- syncUrl += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
- } else {
- syncUrl += `&gdpr=0&gdpr_consent=${gdprConsent.consentString}`;
- }
- }
- if (uspConsent && uspConsent.consentString) {
- syncUrl += `&ccpa_consent=${uspConsent.consentString}`;
- }
- return [{
- type: 'image',
- url: syncUrl
- }];
- }
-
-};
-
-registerBidder(spec);
diff --git a/modules/adrelevantisBidAdapter.js b/modules/adrelevantisBidAdapter.js
index c6298cffde9..b6832cfeb0d 100644
--- a/modules/adrelevantisBidAdapter.js
+++ b/modules/adrelevantisBidAdapter.js
@@ -124,7 +124,7 @@ export const spec = {
if (fpdcfg && fpdcfg.context) {
let fdata = {
keywords: fpdcfg.context.keywords || '',
- category: utils.deepAccess(fpdcfg, 'context.data.category') || ''
+ category: fpdcfg.context.category || ''
}
payload.fpd = fdata;
}
@@ -428,9 +428,6 @@ function bidToTag(bid) {
tag.use_pmt_rule = bid.params.usePaymentRule || false
tag.prebid = true;
tag.disable_psa = true;
- if (bid.params.reserve) {
- tag.reserve = bid.params.reserve;
- }
if (bid.params.position) {
tag.position = {'above': 1, 'below': 2}[bid.params.position] || 0;
}
diff --git a/modules/adriverBidAdapter.js b/modules/adriverBidAdapter.js
index af0a401b355..d5a777f6111 100644
--- a/modules/adriverBidAdapter.js
+++ b/modules/adriverBidAdapter.js
@@ -20,7 +20,7 @@ export const spec = {
return !!bid.params.siteid;
},
- buildRequests: function (validBidRequests) {
+ buildRequests: function (validBidRequests, bidderRequest) {
utils.logInfo('validBidRequests', validBidRequests);
let win = utils.getWindowLocation();
@@ -29,9 +29,15 @@ export const spec = {
let currency = utils.getBidIdParameter('currency', validBidRequests[0].params);
currency = 'RUB';
+ let timeout = null;
+ if (bidderRequest) {
+ timeout = bidderRequest.timeout
+ }
+
const payload = {
'at': 1,
'cur': [currency],
+ 'tmax': timeout,
'site': {
'name': win.origin,
'domain': win.hostname,
@@ -40,7 +46,10 @@ export const spec = {
},
'id': customID,
'user': {
- 'buyerid': 0
+ 'buyerid': 0,
+ 'ext': {
+ 'eids': getUserIdAsEids(validBidRequests)
+ }
},
'device': {
'ip': '195.209.111.14',
@@ -132,10 +141,23 @@ export const spec = {
});
return bidResponses;
}
-
};
registerBidder(spec);
+/**
+ * get first userId from validBidRequests
+ * @param validBidRequests
+ * @returns {Array|*} userIdAsEids
+ */
+function getUserIdAsEids(validBidRequests) {
+ if (validBidRequests && validBidRequests.length > 0 && validBidRequests[0].userIdAsEids &&
+ validBidRequests[0].userIdAsEids.length > 0) {
+ return validBidRequests[0].userIdAsEids;
+ } else {
+ return [];
+ }
+}
+
/**
* Gets bidfloor
* @param {Object} bid
diff --git a/modules/adspendBidAdapter.js b/modules/adspendBidAdapter.js
deleted file mode 100644
index 9fe70885eeb..00000000000
--- a/modules/adspendBidAdapter.js
+++ /dev/null
@@ -1,164 +0,0 @@
-import * as utils from '../src/utils.js';
-import { ajax } from '../src/ajax.js'
-import { config } from '../src/config.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER } from '../src/mediaTypes.js';
-import { getStorageManager } from '../src/storageManager.js';
-
-const storage = getStorageManager();
-const BIDDER_CODE = 'adspend';
-const BID_URL = 'https://rtb.com.ru/headerbidding-bid';
-const SYNC_URL = 'https://rtb.com.ru/headerbidding-sync?uid={UUID}';
-const COOKIE_NAME = 'hb-adspend-id';
-const TTL = 10000;
-const RUB = 'RUB';
-const FIRST_PRICE = 1;
-const NET_REVENUE = true;
-
-const winEventURLs = {};
-const placementToBidMap = {};
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['as'],
- supportedMediaTypes: [BANNER],
-
- onBidWon: function(winObj) {
- const requestId = winObj.requestId;
- const cpm = winObj.cpm;
- const event = winEventURLs[requestId].replace(
- /\$\{AUCTION_PRICE\}/,
- cpm
- );
-
- ajax(event, null);
- },
-
- isBidRequestValid: function(bid) {
- const adServerCur = config.getConfig('currency.adServerCurrency') === RUB;
-
- return !!(adServerCur &&
- bid.params &&
- bid.params.bidfloor &&
- bid.crumbs.pubcid &&
- utils.checkCookieSupport() &&
- storage.cookiesAreEnabled()
- );
- },
-
- buildRequests: function(bidRequests, bidderRequest) {
- const req = bidRequests[Math.floor(Math.random() * bidRequests.length)];
- const bidId = req.bidId;
- const at = FIRST_PRICE;
- const site = { id: req.crumbs.pubcid, domain: document.domain };
- const device = { ua: navigator.userAgent, ip: '' };
- const user = { id: getUserID() }
- const cur = [ RUB ];
- const tmax = bidderRequest.timeout;
-
- const imp = bidRequests.map(req => {
- const params = req.params;
-
- const tagId = params.tagId;
- const id = params.placement;
- const banner = { 'format': getFormats(req.sizes) };
- const bidfloor = params.bidfloor !== undefined
- ? Number(params.bidfloor) : 1;
- const bidfloorcur = RUB;
-
- placementToBidMap[id] = bidId;
-
- return {
- id,
- tagId,
- banner,
- bidfloor,
- bidfloorcur,
- secure: 0,
- };
- });
-
- const payload = {
- bidId,
- at,
- site,
- device,
- user,
- imp,
- cur,
- tmax,
- };
-
- return {
- method: 'POST',
- url: BID_URL,
- data: JSON.stringify(payload),
- };
- },
-
- interpretResponse: function(resp, {bidderRequest}) {
- if (resp.body === '') return [];
-
- const bids = resp.body.seatbid[0].bid.map(bid => {
- const cpm = bid.price;
- const impid = bid.impid;
- const requestId = placementToBidMap[impid];
- const width = bid.w;
- const height = bid.h;
- const creativeId = bid.adid;
- const dealId = bid.dealid;
- const currency = resp.body.cur;
- const netRevenue = NET_REVENUE;
- const ttl = TTL;
- const ad = bid.adm;
-
- return {
- cpm,
- requestId,
- width,
- height,
- creativeId,
- dealId,
- currency,
- netRevenue,
- ttl,
- ad,
- };
- });
-
- return bids;
- },
-
- getUserSyncs: function(syncOptions, resps) {
- let syncs = [];
-
- resps.forEach(resp => {
- if (syncOptions.pixelEnabled && resp.body === '') {
- const uuid = getUserID();
- syncs.push({
- type: 'image',
- url: SYNC_URL.replace('{UUID}', uuid),
- });
- }
- });
-
- return syncs
- }
-}
-
-const getUserID = () => {
- const i = storage.getCookie(COOKIE_NAME);
-
- if (i === null) {
- const uuid = utils.generateUUID();
- storage.setCookie(COOKIE_NAME, uuid);
- return uuid;
- }
- return i;
-};
-
-const getFormats = arr => arr.map((s) => {
- return { w: s[0], h: s[1] };
-});
-
-registerBidder(spec);
diff --git a/modules/adtargetBidAdapter.js b/modules/adtargetBidAdapter.js
index b22addec54f..1779ba94371 100644
--- a/modules/adtargetBidAdapter.js
+++ b/modules/adtargetBidAdapter.js
@@ -173,7 +173,10 @@ function createBid(bidResponse, bidRequest) {
cpm: bidResponse.cpm,
netRevenue: true,
mediaType,
- ttl: 300
+ ttl: 300,
+ meta: {
+ advertiserDomains: bidResponse.adomain || []
+ }
};
if (mediaType === BANNER) {
diff --git a/modules/adtelligentBidAdapter.js b/modules/adtelligentBidAdapter.js
index 9ca4b95dfd2..e1c6dc1ca35 100644
--- a/modules/adtelligentBidAdapter.js
+++ b/modules/adtelligentBidAdapter.js
@@ -179,6 +179,13 @@ function bidToTag(bidRequests, adapterRequest) {
if (utils.deepAccess(bidRequests[0], 'userId')) {
tag.UserIds = utils.deepAccess(bidRequests[0], 'userId');
}
+ if (utils.deepAccess(bidRequests[0], 'userIdAsEids')) {
+ tag.UserEids = utils.deepAccess(bidRequests[0], 'userIdAsEids');
+ }
+ if (window.adtDmp && window.adtDmp.ready) {
+ tag.DMPId = window.adtDmp.getUID();
+ }
+
// end publisher env
const bids = []
@@ -248,7 +255,10 @@ function createBid(bidResponse, bidRequest) {
cpm: bidResponse.cpm,
netRevenue: true,
mediaType,
- ttl: 300
+ ttl: 300,
+ meta: {
+ advertiserDomains: bidResponse.adomain || []
+ }
};
if (mediaType === BANNER) {
diff --git a/modules/adtelligentIdSystem.js b/modules/adtelligentIdSystem.js
new file mode 100644
index 00000000000..fb3b5f6fe2a
--- /dev/null
+++ b/modules/adtelligentIdSystem.js
@@ -0,0 +1,91 @@
+/**
+ * This module adds Adtelligent DMP Tokens to the User ID module
+ * The {@link module:modules/userId} module is required
+ * @module modules/adtelligentIdSystem
+ * @requires module:modules/userId
+ */
+
+import * as ajax from '../src/ajax.js';
+import { submodule } from '../src/hook.js';
+
+const gvlid = 410;
+const moduleName = 'adtelligent';
+const syncUrl = 'https://idrs.adtelligent.com/get';
+
+function buildUrl(opts) {
+ const queryPairs = [];
+ for (let key in opts) {
+ queryPairs.push(`${key}=${encodeURIComponent(opts[key])}`);
+ }
+ return `${syncUrl}?${queryPairs.join('&')}`;
+}
+
+function requestRemoteIdAsync(url, cb) {
+ ajax.ajaxBuilder()(
+ url,
+ {
+ success: response => {
+ const jsonResponse = JSON.parse(response);
+ const { u: dmpId } = jsonResponse;
+ cb(dmpId);
+ },
+ error: () => {
+ cb();
+ }
+ },
+ null,
+ {
+ method: 'GET',
+ contentType: 'application/json',
+ withCredentials: true
+ }
+ );
+}
+
+/** @type {Submodule} */
+export const adtelligentIdModule = {
+ /**
+ * used to link submodule with config
+ * @type {string}
+ */
+ name: moduleName,
+ gvlid: gvlid,
+ /**
+ * decode the stored id value for passing to bid requests
+ * @function
+ * @returns {{adtelligentId: string}}
+ */
+ decode(uid) {
+ return { adtelligentId: uid };
+ },
+ /**
+ * get the Adtelligent Id from local storages and initiate a new user sync
+ * @function
+ * @param {SubmoduleConfig} [config]
+ * @param {ConsentData} [consentData]
+ * @returns {IdResponse}
+ */
+ getId(config, consentData) {
+ const gdpr = consentData && consentData.gdprApplies ? 1 : 0;
+ const gdprConsent = gdpr ? consentData.consentString : '';
+ const url = buildUrl({
+ gdpr,
+ gdprConsent
+ });
+
+ if (window.adtDmp && window.adtDmp.ready) {
+ return { id: window.adtDmp.getUID() }
+ }
+
+ return {
+ callback: (cb) => {
+ requestRemoteIdAsync(url, (id) => {
+ cb(id);
+ });
+ }
+
+ }
+ }
+};
+
+submodule('userId', adtelligentIdModule);
diff --git a/modules/adtelligentIdSystem.md b/modules/adtelligentIdSystem.md
new file mode 100644
index 00000000000..291a5e70bde
--- /dev/null
+++ b/modules/adtelligentIdSystem.md
@@ -0,0 +1,33 @@
+### Adtelligent Id Sytem
+
+The [Adtelligent](https://adtelligent.com) ID system is a uniq per-session user identifier for providing high quality DMP data for advertisers
+
+#### Adtelligent Id Sytem Configuration Example
+
+{% highlight javascript %}
+ pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'adtelligent'
+ }]
+ }
+ });
+{% endhighlight %}
+
+Example with a short storage for ~10 minutes and refresh in 5 minutes:
+
+{% highlight javascript %}
+ pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'adtelligent',
+ storage: {
+ type: "html5",
+ name: "adt_id",
+ expires:0.003,
+ refreshInSeconds: 60 * 5
+ }
+ }]
+ }
+ });
+{% endhighlight %}
diff --git a/modules/adtrueBidAdapter.js b/modules/adtrueBidAdapter.js
index b4dc7f7ea89..96f1ceb12f0 100644
--- a/modules/adtrueBidAdapter.js
+++ b/modules/adtrueBidAdapter.js
@@ -77,15 +77,6 @@ function _getDomainFromURL(url) {
return anchor.hostname;
}
-function _parseSlotParam(paramName, paramValue) {
- switch (paramName) {
- case 'reserve':
- return parseFloat(paramValue) || UNDEFINED;
- default:
- return paramValue;
- }
-}
-
let platform = (function getPlatform() {
var ua = navigator.userAgent;
if (ua.indexOf('Android') > -1 || ua.indexOf('Adr') > -1) {
@@ -380,7 +371,7 @@ function _createImpressionObject(bid, conf) {
impObj = {
id: bid.bidId,
tagid: String(bid.params.zoneId || undefined),
- bidfloor: _parseSlotParam('reserve', bid.params.reserve),
+ bidfloor: 0,
secure: 1,
ext: {},
bidfloorcur: ADTRUE_CURRENCY
diff --git a/modules/advangelistsBidAdapter.js b/modules/advangelistsBidAdapter.js
deleted file mode 100755
index 746baa9ae35..00000000000
--- a/modules/advangelistsBidAdapter.js
+++ /dev/null
@@ -1,378 +0,0 @@
-import * as utils from '../src/utils.js';
-import { config } from '../src/config.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { VIDEO, BANNER } from '../src/mediaTypes.js';
-import find from 'core-js-pure/features/array/find.js';
-import includes from 'core-js-pure/features/array/includes.js';
-
-const ADAPTER_VERSION = '1.0';
-const BIDDER_CODE = 'advangelists';
-
-export const VIDEO_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';// 0cf8d6d643e13d86a5b6374148a4afac';
-export const BANNER_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';// 0cf8d6d643e13d86a5b6374148a4afac';
-export const OUTSTREAM_SRC = 'https://player-cdn.beachfrontmedia.com/playerapi/loader/outstream.js';
-export const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'skip'];
-export const DEFAULT_MIMES = ['video/mp4', 'application/javascript'];
-
-let pubid = '';
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO],
-
- isBidRequestValid(bidRequest) {
- if (typeof bidRequest != 'undefined') {
- if (bidRequest.bidder !== BIDDER_CODE && typeof bidRequest.params === 'undefined') { return false; }
- if (bidRequest === '' || bidRequest.params.placement === '' || bidRequest.params.pubid === '') { return false; }
- return true;
- } else { return false; }
- },
-
- buildRequests(bids, bidderRequest) {
- let requests = [];
- let videoBids = bids.filter(bid => isVideoBidValid(bid));
- let bannerBids = bids.filter(bid => isBannerBidValid(bid));
- videoBids.forEach(bid => {
- pubid = getVideoBidParam(bid, 'pubid');
- requests.push({
- method: 'POST',
- url: VIDEO_ENDPOINT + pubid,
- data: createVideoRequestData(bid, bidderRequest),
- bidRequest: bid
- });
- });
-
- bannerBids.forEach(bid => {
- pubid = getBannerBidParam(bid, 'pubid');
- requests.push({
- method: 'POST',
- url: BANNER_ENDPOINT + pubid,
- data: createBannerRequestData(bid, bidderRequest),
- bidRequest: bid
- });
- });
- return requests;
- },
-
- interpretResponse(serverResponse, {bidRequest}) {
- let response = serverResponse.body;
- if (response !== null && utils.isEmpty(response) == false) {
- if (isVideoBid(bidRequest)) {
- let bidResponse = {
- requestId: response.id,
- bidderCode: BIDDER_CODE,
- cpm: response.seatbid[0].bid[0].price,
- width: response.seatbid[0].bid[0].w,
- height: response.seatbid[0].bid[0].h,
- ttl: response.seatbid[0].bid[0].ttl || 60,
- creativeId: response.seatbid[0].bid[0].crid,
- currency: response.cur,
- mediaType: VIDEO,
- netRevenue: true
- }
-
- if (response.seatbid[0].bid[0].adm) {
- bidResponse.vastXml = response.seatbid[0].bid[0].adm;
- bidResponse.adResponse = {
- content: response.seatbid[0].bid[0].adm
- };
- } else {
- bidResponse.vastUrl = response.seatbid[0].bid[0].nurl;
- }
-
- return bidResponse;
- } else {
- return {
- requestId: response.id,
- bidderCode: BIDDER_CODE,
- cpm: response.seatbid[0].bid[0].price,
- width: response.seatbid[0].bid[0].w,
- height: response.seatbid[0].bid[0].h,
- ad: response.seatbid[0].bid[0].adm,
- ttl: response.seatbid[0].bid[0].ttl || 60,
- creativeId: response.seatbid[0].bid[0].crid,
- currency: response.cur,
- mediaType: BANNER,
- netRevenue: true
- }
- }
- }
- }
-};
-
-function isBannerBid(bid) {
- return utils.deepAccess(bid, 'mediaTypes.banner') || !isVideoBid(bid);
-}
-
-function isVideoBid(bid) {
- return utils.deepAccess(bid, 'mediaTypes.video');
-}
-
-function isVideoBidValid(bid) {
- return isVideoBid(bid) && getVideoBidParam(bid, 'pubid') && getVideoBidParam(bid, 'placement');
-}
-
-function isBannerBidValid(bid) {
- return isBannerBid(bid) && getBannerBidParam(bid, 'pubid') && getBannerBidParam(bid, 'placement');
-}
-
-function getVideoBidParam(bid, key) {
- return utils.deepAccess(bid, 'params.video.' + key) || utils.deepAccess(bid, 'params.' + key);
-}
-
-function getBannerBidParam(bid, key) {
- return utils.deepAccess(bid, 'params.banner.' + key) || utils.deepAccess(bid, 'params.' + key);
-}
-
-function isMobile() {
- return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
-}
-
-function isConnectedTV() {
- return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
-}
-
-function getDoNotTrack() {
- return navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.msDoNoTrack === '1' || navigator.doNotTrack === 'yes';
-}
-
-function findAndFillParam(o, key, value) {
- try {
- if (typeof value === 'function') {
- o[key] = value();
- } else {
- o[key] = value;
- }
- } catch (ex) {}
-}
-
-function getOsVersion() {
- let clientStrings = [
- { s: 'Android', r: /Android/ },
- { s: 'iOS', r: /(iPhone|iPad|iPod)/ },
- { s: 'Mac OS X', r: /Mac OS X/ },
- { s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ },
- { s: 'Linux', r: /(Linux|X11)/ },
- { s: 'Windows 10', r: /(Windows 10.0|Windows NT 10.0)/ },
- { s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/ },
- { s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/ },
- { s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/ },
- { s: 'Windows Vista', r: /Windows NT 6.0/ },
- { s: 'Windows Server 2003', r: /Windows NT 5.2/ },
- { s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/ },
- { s: 'UNIX', r: /UNIX/ },
- { s: 'Search Bot', r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ }
- ];
- let cs = find(clientStrings, cs => cs.r.test(navigator.userAgent));
- return cs ? cs.s : 'unknown';
-}
-
-function getFirstSize(sizes) {
- return (sizes && sizes.length) ? sizes[0] : { w: undefined, h: undefined };
-}
-
-function parseSizes(sizes) {
- return utils.parseSizesInput(sizes).map(size => {
- let [ width, height ] = size.split('x');
- return {
- w: parseInt(width, 10) || undefined,
- h: parseInt(height, 10) || undefined
- };
- });
-}
-
-function getVideoSizes(bid) {
- return parseSizes(utils.deepAccess(bid, 'mediaTypes.video.playerSize') || bid.sizes);
-}
-
-function getBannerSizes(bid) {
- return parseSizes(utils.deepAccess(bid, 'mediaTypes.banner.sizes') || bid.sizes);
-}
-
-function getTopWindowReferrer() {
- try {
- return window.top.document.referrer;
- } catch (e) {
- return '';
- }
-}
-
-function getVideoTargetingParams(bid) {
- return Object.keys(Object(bid.params.video))
- .filter(param => includes(VIDEO_TARGETING, param))
- .reduce((obj, param) => {
- obj[ param ] = bid.params.video[ param ];
- return obj;
- }, {});
-}
-
-function createVideoRequestData(bid, bidderRequest) {
- let topLocation = getTopWindowLocation(bidderRequest);
- let topReferrer = getTopWindowReferrer();
-
- let sizes = getVideoSizes(bid);
- let firstSize = getFirstSize(sizes);
-
- let video = getVideoTargetingParams(bid);
- const o = {
- 'device': {
- 'langauge': (global.navigator.language).split('-')[0],
- 'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
- 'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
- 'js': 1,
- 'os': getOsVersion()
- },
- 'at': 2,
- 'site': {},
- 'tmax': 3000,
- 'cur': ['USD'],
- 'id': bid.bidId,
- 'imp': [],
- 'regs': {
- 'ext': {
- }
- },
- 'user': {
- 'ext': {
- }
- }
- };
-
- o.site['page'] = topLocation.href;
- o.site['domain'] = topLocation.hostname;
- o.site['search'] = topLocation.search;
- o.site['domain'] = topLocation.hostname;
- o.site['ref'] = topReferrer;
- o.site['mobile'] = isMobile() ? 1 : 0;
- const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
-
- o.device['dnt'] = getDoNotTrack() ? 1 : 0;
-
- findAndFillParam(o.site, 'name', function() {
- return global.top.document.title;
- });
-
- findAndFillParam(o.device, 'h', function() {
- return global.screen.height;
- });
- findAndFillParam(o.device, 'w', function() {
- return global.screen.width;
- });
-
- let placement = getVideoBidParam(bid, 'placement');
-
- for (let j = 0; j < sizes.length; j++) {
- o.imp.push({
- 'id': '' + j,
- 'displaymanager': '' + BIDDER_CODE,
- 'displaymanagerver': '' + ADAPTER_VERSION,
- 'tagId': placement,
- 'bidfloor': 2.0,
- 'bidfloorcur': 'USD',
- 'secure': secure,
- 'video': Object.assign({
- 'id': utils.generateUUID(),
- 'pos': 0,
- 'w': firstSize.w,
- 'h': firstSize.h,
- 'mimes': DEFAULT_MIMES
- }, video)
-
- });
- }
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- let { gdprApplies, consentString } = bidderRequest.gdprConsent;
- o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
- o.user.ext = {'consent': consentString};
- }
-
- return o;
-}
-
-function getTopWindowLocation(bidderRequest) {
- let url = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer;
- return utils.parseUrl(config.getConfig('pageUrl') || url, { decodeSearchAsString: true });
-}
-
-function createBannerRequestData(bid, bidderRequest) {
- let topLocation = getTopWindowLocation(bidderRequest);
- let topReferrer = getTopWindowReferrer();
-
- let sizes = getBannerSizes(bid);
-
- const o = {
- 'device': {
- 'langauge': (global.navigator.language).split('-')[0],
- 'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
- 'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
- 'js': 1
- },
- 'at': 2,
- 'site': {},
- 'tmax': 3000,
- 'cur': ['USD'],
- 'id': bid.bidId,
- 'imp': [],
- 'regs': {
- 'ext': {
- }
- },
- 'user': {
- 'ext': {
- }
- }
- };
-
- o.site['page'] = topLocation.href;
- o.site['domain'] = topLocation.hostname;
- o.site['search'] = topLocation.search;
- o.site['domain'] = topLocation.hostname;
- o.site['ref'] = topReferrer;
- o.site['mobile'] = isMobile() ? 1 : 0;
- const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
-
- o.device['dnt'] = getDoNotTrack() ? 1 : 0;
-
- findAndFillParam(o.site, 'name', function() {
- return global.top.document.title;
- });
-
- findAndFillParam(o.device, 'h', function() {
- return global.screen.height;
- });
- findAndFillParam(o.device, 'w', function() {
- return global.screen.width;
- });
-
- let placement = getBannerBidParam(bid, 'placement');
- for (let j = 0; j < sizes.length; j++) {
- let size = sizes[j];
-
- o.imp.push({
- 'id': '' + j,
- 'displaymanager': '' + BIDDER_CODE,
- 'displaymanagerver': '' + ADAPTER_VERSION,
- 'tagId': placement,
- 'bidfloor': 2.0,
- 'bidfloorcur': 'USD',
- 'secure': secure,
- 'banner': {
- 'id': utils.generateUUID(),
- 'pos': 0,
- 'w': size['w'],
- 'h': size['h']
- }
- });
- }
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- let { gdprApplies, consentString } = bidderRequest.gdprConsent;
- o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
- o.user.ext = {'consent': consentString};
- }
-
- return o;
-}
-
-registerBidder(spec);
diff --git a/modules/advenueBidAdapter.js b/modules/advenueBidAdapter.js
deleted file mode 100644
index d7fa614b0a7..00000000000
--- a/modules/advenueBidAdapter.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'advenue';
-const URL_MULTI = 'https://ssp.advenuemedia.co.uk/?c=o&m=multi';
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
- /**
- * Determines whether or not the given bid request is valid.
- *
- * @param {object} bid The bid to validate.
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId &&
- bid.params &&
- !isNaN(bid.params.placementId) &&
- spec.supportedMediaTypes.indexOf(bid.params.traffic) !== -1
- );
- },
-
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the Server.
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: (validBidRequests, bidderRequest) => {
- let winTop;
- try {
- winTop = window.top;
- winTop.location.toString();
- } catch (e) {
- utils.logMessage(e);
- winTop = window;
- };
-
- const location = bidderRequest ? new URL(bidderRequest.refererInfo.referer) : winTop.location;
- const placements = [];
- const request = {
- 'secure': (location.protocol === 'https:') ? 1 : 0,
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
-
- for (let i = 0; i < validBidRequests.length; i++) {
- const bid = validBidRequests[i];
- const params = bid.params;
- placements.push({
- placementId: params.placementId,
- bidId: bid.bidId,
- sizes: bid.sizes,
- traffic: params.traffic
- });
- }
- return {
- method: 'POST',
- url: URL_MULTI,
- data: request
- };
- },
-
- /**
- * 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: (serverResponse) => {
- try {
- serverResponse = serverResponse.body;
- } catch (e) {
- utils.logMessage(e);
- };
- return serverResponse;
- },
-};
-
-registerBidder(spec);
diff --git a/modules/advertlyBidAdapter.js b/modules/advertlyBidAdapter.js
deleted file mode 100755
index 973b6dd0742..00000000000
--- a/modules/advertlyBidAdapter.js
+++ /dev/null
@@ -1,127 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { config } from '../src/config.js';
-import * as utils from '../src/utils.js';
-import {BANNER, VIDEO} from '../src/mediaTypes.js';
-import { ajax } from '../src/ajax.js';
-import {Renderer} from '../src/Renderer.js';
-
-const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
-const BIDDER_CODE = 'advertly';
-const DOMAIN = 'https://api.advertly.com/';
-const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';
-
-function isBidRequestValid(bid) {
- return (typeof bid.params !== 'undefined' && parseInt(utils.getValue(bid.params, 'publisherId')) > 0);
-}
-
-function buildRequests(validBidRequests) {
- return {
- method: 'POST',
- url: DOMAIN + 'www/admin/plugins/Prebid/getAd.php',
- options: {
- withCredentials: false,
- crossOrigin: true
- },
- data: validBidRequests,
- };
-}
-
-function interpretResponse(serverResponse, request) {
- const response = serverResponse.body;
- const bidResponses = [];
- var bidRequestResponses = [];
- utils._each(response, function(bidAd) {
- let bnd = {};
- Object.assign(bnd, bidAd);
- bnd.adResponse = {
- content: bidAd.vastXml,
- height: bidAd.height,
- width: bidAd.width
- };
- bnd.ttl = config.getConfig('_bidderTimeout')
- bnd.renderer = bidAd.context === 'outstream' ? createRenderer(bidAd, RENDERER_URL) : undefined;
- bidResponses.push(bnd);
- });
-
- bidRequestResponses.push({
- function: 'saveResponses',
- request: request,
- response: bidResponses
- });
- sendResponseToServer(bidRequestResponses);
- return bidResponses;
-}
-
-function outstreamRender(bidAd) {
- bidAd.renderer.push(() => {
- window.ANOutstreamVideo.renderAd({
- sizes: [bidAd.width, bidAd.height],
- width: bidAd.width,
- height: bidAd.height,
- targetId: bidAd.adUnitCode,
- adResponse: bidAd.adResponse,
- rendererOptions: {
- showVolume: false,
- allowFullscreen: false
- }
- });
- });
-}
-
-function createRenderer(bidAd, url) {
- const renderer = Renderer.install({
- id: bidAd.adUnitCode,
- url: url,
- loaded: false,
- config: {'player_height': bidAd.height, 'player_width': bidAd.width},
- adUnitCode: bidAd.adUnitCode
- });
- try {
- renderer.setRender(outstreamRender);
- } catch (err) {
- utils.logWarn('Prebid Error calling setRender on renderer', err);
- }
- return renderer;
-}
-
-function onBidWon(bid) {
- let wonBids = [];
- wonBids.push(bid);
- wonBids[0].function = 'onBidWon';
- sendResponseToServer(wonBids);
-}
-
-function onTimeout(details) {
- details.unshift({ 'function': 'onTimeout' });
- sendResponseToServer(details);
-}
-
-function sendResponseToServer(data) {
- ajax(DOMAIN + 'www/admin/plugins/Prebid/tracking/track.php', null, JSON.stringify(data), {
- withCredentials: false,
- method: 'POST',
- crossOrigin: true
- });
-}
-
-function getUserSyncs(syncOptions) {
- if (syncOptions.iframeEnabled) {
- return [{
- type: 'iframe',
- url: DOMAIN + 'www/admin/plugins/Prebid/userSync.php'
- }];
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: SUPPORTED_AD_TYPES,
- isBidRequestValid,
- buildRequests,
- interpretResponse,
- getUserSyncs,
- onBidWon,
- onTimeout
-};
-
-registerBidder(spec);
diff --git a/modules/adyoulikeBidAdapter.js b/modules/adyoulikeBidAdapter.js
index 44d8e2e3016..38731fdc91c 100644
--- a/modules/adyoulikeBidAdapter.js
+++ b/modules/adyoulikeBidAdapter.js
@@ -47,7 +47,7 @@ export const spec = {
const sizes = getSize(getSizeArray(bid));
const sizeValid = sizes.width > 0 && sizes.height > 0;
- // allows no size fornative only
+ // allows no size for native only
return (bid.params && bid.params.placement &&
(sizeValid || (bid.mediaTypes && bid.mediaTypes.native)));
},
@@ -86,6 +86,11 @@ export const spec = {
}
if (mediatype === VIDEO) {
accumulator[bidReq.bidId].Video = bidReq.mediaTypes.video;
+
+ const size = bidReq.mediaTypes.video.playerSize;
+ if (Array.isArray(size) && !Array.isArray(size[0])) {
+ accumulator[bidReq.bidId].Video.playerSize = [size];
+ }
}
return accumulator;
}, {}),
@@ -170,16 +175,15 @@ function getCanonicalUrl() {
/* Get mediatype from bidRequest */
function getMediatype(bidRequest) {
- var type = BANNER;
-
- if (utils.deepAccess(bidRequest, 'mediaTypes.native')) {
- type = NATIVE;
- } else if (utils.deepAccess(bidRequest, 'mediaTypes.video')) {
- type = VIDEO;
+ if (utils.deepAccess(bidRequest, 'mediaTypes.video')) {
+ return VIDEO;
+ } else if (utils.deepAccess(bidRequest, 'mediaTypes.banner')) {
+ return BANNER;
+ } else if (utils.deepAccess(bidRequest, 'mediaTypes.native')) {
+ return NATIVE;
}
-
- return type;
}
+
/* Get Floor price information */
function getFloor(bidRequest, size, mediaType) {
const bidFloors = bidRequest.getFloor({
@@ -243,10 +247,19 @@ function createEndpointQS(bidderRequest) {
function getSizeArray(bid) {
let inputSize = bid.sizes || [];
+
if (bid.mediaTypes && bid.mediaTypes.banner) {
inputSize = bid.mediaTypes.banner.sizes || [];
}
+ // handle size in bid.params in formats: [w, h] and [[w,h]].
+ if (bid.params && Array.isArray(bid.params.size)) {
+ inputSize = bid.params.size;
+ if (!Array.isArray(inputSize[0])) {
+ inputSize = [inputSize]
+ }
+ }
+
return utils.parseSizesInput(inputSize);
}
@@ -281,30 +294,31 @@ function getInternalImgUrl(uid) {
function getImageUrl(config, resource, width, height) {
let url = '';
+ if (resource && resource.Kind) {
+ switch (resource.Kind) {
+ case 'INTERNAL':
+ url = getInternalImgUrl(resource.Data.Internal.BlobReference.Uid);
- switch (resource.Kind) {
- case 'INTERNAL':
- url = getInternalImgUrl(resource.Data.Internal.BlobReference.Uid);
-
- break;
-
- case 'EXTERNAL':
- const dynPrefix = config.DynamicPrefix;
- let extUrl = resource.Data.External.Url;
- extUrl = extUrl.replace(/\[height\]/i, '' + height);
- extUrl = extUrl.replace(/\[width\]/i, '' + width);
+ break;
- if (extUrl.indexOf(dynPrefix) >= 0) {
- const urlmatch = (/.*url=([^&]*)/gm).exec(extUrl);
- url = urlmatch ? urlmatch[1] : '';
- if (!url) {
- url = getInternalImgUrl((/.*key=([^&]*)/gm).exec(extUrl)[1]);
+ case 'EXTERNAL':
+ const dynPrefix = config.DynamicPrefix;
+ let extUrl = resource.Data.External.Url;
+ extUrl = extUrl.replace(/\[height\]/i, '' + height);
+ extUrl = extUrl.replace(/\[width\]/i, '' + width);
+
+ if (extUrl.indexOf(dynPrefix) >= 0) {
+ const urlmatch = (/.*url=([^&]*)/gm).exec(extUrl);
+ url = urlmatch ? urlmatch[1] : '';
+ if (!url) {
+ url = getInternalImgUrl((/.*key=([^&]*)/gm).exec(extUrl)[1]);
+ }
+ } else {
+ url = extUrl;
}
- } else {
- url = extUrl;
- }
- break;
+ break;
+ }
}
return url;
@@ -390,33 +404,39 @@ function getNativeAssets(response, nativeConfig) {
imgSize[1] = response.Height || 250;
}
- native[key] = {
- url: getImageUrl(adJson, adJson.Content.Preview.Thumbnail.Image, imgSize[0], imgSize[1]),
- width: imgSize[0],
- height: imgSize[1]
- };
+ const url = getImageUrl(adJson, utils.deepAccess(adJson, 'Content.Preview.Thumbnail.Image'), imgSize[0], imgSize[1]);
+ if (url) {
+ native[key] = {
+ url,
+ width: imgSize[0],
+ height: imgSize[1]
+ };
+ }
+
break;
case 'icon':
- if (adJson.HasSponsorImage) {
- // icon requested size
- const iconSize = nativeConfig.icon.sizes || [];
- if (!iconSize.length) {
- iconSize[0] = 50;
- iconSize[1] = 50;
- }
+ // icon requested size
+ const iconSize = nativeConfig.icon.sizes || [];
+ if (!iconSize.length) {
+ iconSize[0] = 50;
+ iconSize[1] = 50;
+ }
+
+ const icurl = getImageUrl(adJson, utils.deepAccess(adJson, 'Content.Preview.Sponsor.Logo.Resource'), iconSize[0], iconSize[1]);
+ if (url) {
native[key] = {
- url: getImageUrl(adJson, adJson.Content.Preview.Sponsor.Logo.Resource, iconSize[0], iconSize[1]),
+ url: icurl,
width: iconSize[0],
height: iconSize[1]
};
}
break;
case 'privacyIcon':
- native[key] = getImageUrl(adJson, adJson.Content.Preview.Credit.Logo.Resource, 25, 25);
+ native[key] = getImageUrl(adJson, utils.deepAccess(adJson, 'Content.Preview.Credit.Logo.Resource'), 25, 25);
break;
case 'privacyLink':
- native[key] = adJson.Content.Preview.Credit.Url;
+ native[key] = utils.deepAccess(adJson, 'Content.Preview.Credit.Url');
break;
}
});
@@ -426,7 +446,7 @@ function getNativeAssets(response, nativeConfig) {
/* Create bid from response */
function createBid(response, bidRequests) {
- if (!response || (!response.Ad && !response.Native)) {
+ if (!response || (!response.Ad && !response.Native && !response.Vast)) {
return
}
@@ -449,7 +469,8 @@ function createBid(response, bidRequests) {
creativeId: response.CreativeID,
cpm: response.Price,
netRevenue: true,
- currency: CURRENCY
+ currency: CURRENCY,
+ meta: response.Meta || { advertiserDomains: [] }
};
if (request && request.Native) {
diff --git a/modules/ajaBidAdapter.js b/modules/ajaBidAdapter.js
index ce4196fe249..933b06baa23 100644
--- a/modules/ajaBidAdapter.js
+++ b/modules/ajaBidAdapter.js
@@ -62,6 +62,9 @@ export const spec = {
currency: ad.currency || 'USD',
netRevenue: true,
ttl: 300, // 5 minutes
+ meta: {
+ advertiserDomains: ad.adomain || []
+ },
}
if (AD_TYPE.VIDEO === ad.ad_type) {
diff --git a/modules/akamaiDAPIdSystem.js b/modules/akamaiDAPIdSystem.js
new file mode 100644
index 00000000000..a78d65b40a9
--- /dev/null
+++ b/modules/akamaiDAPIdSystem.js
@@ -0,0 +1,115 @@
+/**
+ * This module adds DAP to the User ID module
+ * The {@link module:modules/userId} module is required
+ * @module modules/akamaiDAPIdSubmodule
+ * @requires module:modules/userId
+ */
+
+import * as utils from '../src/utils.js'
+import { ajax } from '../src/ajax.js';
+import { submodule } from '../src/hook.js';
+import { getStorageManager } from '../src/storageManager.js';
+import { uspDataHandler } from '../src/adapterManager.js';
+
+const MODULE_NAME = 'akamaiDAPId';
+const STORAGE_KEY = 'akamai_dap_token';
+
+export const storage = getStorageManager();
+
+/** @type {Submodule} */
+export const akamaiDAPIdSubmodule = {
+ /**
+ * used to link submodule with config
+ * @type {string}
+ */
+ name: MODULE_NAME,
+ /**
+ * decode the stored id value for passing to bid requests
+ * @function
+ * @returns {{dapId:string}}
+ */
+ decode(value) {
+ utils.logMessage('akamaiDAPId [decode] value=', value);
+ return { dapId: value };
+ },
+
+ /**
+ * performs action to obtain id and return a value in the callback's response argument
+ * @function
+ * @param {ConsentData} [consentData]
+ * @param {SubmoduleConfig} [config]
+ * @returns {IdResponse|undefined}
+ */
+ getId(config, consentData) {
+ const configParams = (config && config.params);
+ if (!configParams) {
+ utils.logError('User ID - akamaiDAPId submodule requires a valid configParams');
+ return;
+ } else if (typeof configParams.apiHostname !== 'string') {
+ utils.logError('User ID - akamaiDAPId submodule requires a valid configParams.apiHostname');
+ return;
+ } else if (typeof configParams.domain !== 'string') {
+ utils.logError('User ID - akamaiDAPId submodule requires a valid configParams.domain');
+ return;
+ } else if (typeof configParams.type !== 'string') {
+ utils.logError('User ID - akamaiDAPId submodule requires a valid configParams.type');
+ return;
+ }
+ const hasGdpr = (consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies) ? 1 : 0;
+ const gdprConsentString = hasGdpr ? consentData.consentString : '';
+ const uspConsent = uspDataHandler.getConsentData();
+ if (hasGdpr && (!gdprConsentString || gdprConsentString === '')) {
+ utils.logError('User ID - akamaiDAPId submodule requires consent string to call API');
+ return;
+ }
+ // XXX: retrieve first-party data here if needed
+ let url = '';
+ let postData;
+ let tokenName = '';
+ if (configParams.apiVersion === 'v1') {
+ if (configParams.type.indexOf('dap-signature:') == 0) {
+ let parts = configParams.type.split(':');
+ let v = parts[1];
+ url = `https://${configParams.apiHostname}/data-activation/v1/domain/${configParams.domain}/signature?v=${v}&gdpr=${hasGdpr}&gdpr_consent=${gdprConsentString}&us_privacy=${uspConsent}`;
+ tokenName = 'SigToken';
+ } else {
+ url = `https://${configParams.apiHostname}/data-activation/v1/identity/tokenize?gdpr=${hasGdpr}&gdpr_consent=${gdprConsentString}&us_privacy=${uspConsent}`;
+ postData = {
+ 'version': 1,
+ 'domain': configParams.domain,
+ 'identity': configParams.identity,
+ 'type': configParams.type
+ };
+ tokenName = 'PubToken';
+ }
+ } else {
+ url = `https://${configParams.apiHostname}/data-activation/x1/domain/${configParams.domain}/identity/tokenize?gdpr=${hasGdpr}&gdpr_consent=${gdprConsentString}&us_privacy=${uspConsent}`;
+ postData = {
+ 'version': configParams.apiVersion,
+ 'identity': configParams.identity,
+ 'type': configParams.type,
+ 'attributes': configParams.attributes
+ };
+ tokenName = 'x1Token';
+ }
+
+ let cb = {
+ success: (response, request) => {
+ var token = (response === '') ? request.getResponseHeader('Akamai-DAP-Token') : response;
+ storage.setDataInLocalStorage(STORAGE_KEY, token);
+ },
+ error: error => {
+ utils.logError('akamaiDAPId [getId:ajax.error] failed to retrieve ' + tokenName, error);
+ }
+ };
+
+ ajax(url, cb, JSON.stringify(postData), { contentType: 'application/json' });
+
+ let token = storage.getDataFromLocalStorage(STORAGE_KEY);
+ utils.logMessage('akamaiDAPId [getId] returning', token);
+
+ return { id: token };
+ }
+};
+
+submodule('userId', akamaiDAPIdSubmodule);
diff --git a/modules/akamaiDAPIdSystem.md b/modules/akamaiDAPIdSystem.md
new file mode 100644
index 00000000000..9b35709c3f2
--- /dev/null
+++ b/modules/akamaiDAPIdSystem.md
@@ -0,0 +1,48 @@
+# Akamai Data Activation Platform Audience Segment ID Targeting
+
+The Akamai Data Activation Platform (DAP) is a privacy-first system that protects end-user privacy by only allowing them to be targeted as part of a larger cohort. DAP views hiding individuals in large cohorts as the best mechanism to prevent unauthorized tracking.
+
+The integration of DAP into Prebid.JS consists of creating a UserID plugin that interacts with the DAP API. The UserID module tokenizes the end-user identity into an ephemeral, secure pseudonymization called a dapId. The dapId is then supplied to the bid-stream where the SSP partner looks up cohort membership for that token, and supplies the cohorts to the rest of the bid-stream.
+
+In this system, no end-user identifier is supplied to the bid-stream, only cohorts. This is a foundational privacy principle DAP is built upon.
+
+## Onboarding
+
+Please reach out to your Akamai account representative(Prebid@akamai.com) to get provisioned on the DAP platform.
+
+## DAP Configuration
+
+First, make sure to add the DAP submodule to your Prebid.js package with:
+
+```
+gulp build --modules=akamaiDAPIdSystem,userId
+```
+
+The following configuration parameters are available:
+
+```javascript
+pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: 'akamaiDAPId',
+ params: {
+ apiHostname: '',
+ domain: 'your-domain.com',
+ type: 'email' | 'mobile' | ... | 'dap-signature:1.0.0',
+ identity: ‘your@email.com’ | ‘6175551234' | ...',
+ apiVersion: 'v1' | 'x1',
+ attributes: '{ "cohorts": [ "3:14400", "5:14400", "7:0" ],"first_name": "...","last_name": "..." }'
+ },
+ }],
+ auctionDelay: 50 // 50ms maximum auction delay, applies to all userId modules
+ }
+});
+```
+
+In order to make use of v1 APIs, "apiVersion" needs to explicitly mentioned as 'v1'. The "apiVersion" defaults to x1 if not specified.
+"attributes" can be configured in x1 API only and not v1 APIs. Please ensure that the "attributes" value is in same format as shown above.
+
+Refer to the sample integration example present at below location
+Prebid.js/integrationExamples/gpt/akamaidap_email_example.html
+Prebid.js/integrationExamples/gpt/akamaidap_signature_example.html
+Prebid.js/integrationExamples/gpt/akamaidap_x1_example.html
diff --git a/modules/amxIdSystem.js b/modules/amxIdSystem.js
new file mode 100644
index 00000000000..28323b01188
--- /dev/null
+++ b/modules/amxIdSystem.js
@@ -0,0 +1,153 @@
+/**
+ * This module adds AMX to the User ID Module
+ * The {@link module:modules/userId} is required
+ *
+ * @module modules/amxIdSystem
+ * @requires module:modules/userId
+ */
+import { uspDataHandler } from '../src/adapterManager.js';
+import { ajaxBuilder } from '../src/ajax.js';
+import { submodule } from '../src/hook.js';
+import { getRefererInfo } from '../src/refererDetection.js';
+import { deepAccess, getWindowTop, logError } from '../src/utils.js';
+
+const NAME = 'amxId';
+const GVL_ID = 737;
+const ID_KEY = NAME;
+const version = '1.0';
+const SYNC_URL = 'https://id.a-mx.com/sync/';
+const AJAX_TIMEOUT = 300;
+
+function validateConfig(config) {
+ if (config == null || config.storage == null) {
+ logError(`${NAME}: config.storage is required.`);
+ return false;
+ }
+
+ if (config.storage.type !== 'html5') {
+ logError(
+ `${NAME} only supports storage.type "html5". ${config.storage.type} was provided`
+ );
+ return false;
+ }
+
+ if (
+ typeof config.storage.expires === 'number' &&
+ config.storage.expires > 30
+ ) {
+ logError(
+ `${NAME}: storage.expires must be <= 30. ${config.storage.expires} was provided`
+ );
+ return false;
+ }
+
+ return true;
+}
+
+function handleSyncResponse(client, response, callback) {
+ if (response.id != null && response.id.length > 0) {
+ callback(response.id);
+ return;
+ }
+
+ if (response.u == null || response.u.length === 0) {
+ callback(null);
+ return;
+ }
+
+ client(response.u, {
+ error(e) {
+ logError(`${NAME} failed on ${response.u}`, e);
+ callback(null);
+ },
+ success(complete) {
+ if (complete != null && complete.length > 0) {
+ const value = JSON.parse(complete);
+ if (value.id != null) {
+ callback(value.id);
+ return;
+ }
+ }
+
+ logError(`${NAME} invalid value`, complete);
+ callback(null);
+ },
+ });
+}
+
+export const amxIdSubmodule = {
+ /**
+ * @type {string}
+ */
+ name: NAME,
+
+ /**
+ * @type {string}
+ */
+ version,
+
+ /**
+ * IAB TCF Vendor ID
+ * @type {string}
+ */
+ gvlid: GVL_ID,
+
+ decode: (value) =>
+ value != null && value.length > 0
+ ? { [ID_KEY]: value }
+ : undefined,
+
+ getId(config, consentData, _extant) {
+ if (!validateConfig(config)) {
+ return undefined;
+ }
+
+ const consent = consentData || { gdprApplies: false, consentString: '' };
+ const client = ajaxBuilder(AJAX_TIMEOUT);
+ const usp = uspDataHandler.getConsentData();
+ const ref = getRefererInfo();
+
+ const params = {
+ tagId: deepAccess(config, 'params.tagId', ''),
+ ref: ref.referer,
+ u: ref.stack[0] || getWindowTop().location.href,
+ v: '$prebid.version$',
+ vg: '$$PREBID_GLOBAL$$',
+ us_privacy: usp,
+ gdpr: consent.gdprApplies ? 1 : 0,
+ gdpr_consent: consent.consentString,
+ };
+
+ const callback = (done) =>
+ client(
+ SYNC_URL,
+ {
+ error(e) {
+ logError(`${NAME} failed to load`, e);
+ done(null);
+ },
+ success(responseText) {
+ if (responseText != null && responseText.length > 0) {
+ try {
+ const parsed = JSON.parse(responseText);
+ handleSyncResponse(client, parsed, done);
+ return;
+ } catch (e) {
+ logError(`${NAME} invalid response`, responseText);
+ }
+ }
+
+ done(null);
+ },
+ },
+ params,
+ {
+ method: 'GET'
+ }
+ );
+
+ return { callback };
+ },
+};
+
+submodule('userId', amxIdSubmodule);
diff --git a/modules/amxIdSystem.md b/modules/amxIdSystem.md
new file mode 100644
index 00000000000..9de93c761a1
--- /dev/null
+++ b/modules/amxIdSystem.md
@@ -0,0 +1,51 @@
+# AMX RTB ID
+
+For help adding this module, please contact [prebid@amxrtb.com](prebid@amxrtb.com).
+
+### Prebid Configuration
+
+You can configure this module in your `userSync.userIds[]` configuration:
+
+```javascript
+pbjs.setConfig({
+ userSync: {
+ userIds: [
+ {
+ name: "amxId",
+ storage: {
+ name: "amxId",
+ type: "html5",
+ expires: 14,
+ },
+ params: {
+ tagId: "cHJlYmlkLm9yZw",
+ },
+ },
+ ],
+ },
+});
+```
+
+| Param under `userSync.userIds[]` | Scope | Type | Description | Example |
+| -------------------------------- | -------- | ------ | --------------------------- | ----------------------------------------- |
+| name | Required | string | ID for the amxId module | `"amxId"` |
+| storage | Required | Object | Settings for amxId storage | See [storage settings](#storage-settings) |
+| params | Optional | Object | Parameters for amxId module | See [params](#params) |
+
+### Storage Settings
+
+The following settings are available for the `storage` property in the `userSync.userIds[]` object:
+
+| Param under `storage` | Scope | Type | Description | Example |
+| --------------------- | -------- | ------------ | -------------------------------------------------------------------------------- | --------- |
+| name | Required | String | Where the ID will be stored | `"amxId"` |
+| type | Required | String | This must be `"html5"` | `"html5"` |
+| expires | Required | Number <= 30 | number of days until the stored ID expires. **Must be less than or equal to 30** | `14` |
+
+### Params
+
+The following options are available in the `params` property in `userSync.userIds[]`:
+
+| Param under `params` | Scope | Type | Description | Example |
+| -------------------- | -------- | ------ | ------------------------------------------------------------------------- | ---------------- |
+| tagId | Optional | String | Your AMX tagId (optional) | `cHJlYmlkLm9yZw` |
diff --git a/modules/aniviewBidAdapter.js b/modules/aniviewBidAdapter.js
index b37d105da1a..7f3ad16b4e1 100644
--- a/modules/aniviewBidAdapter.js
+++ b/modules/aniviewBidAdapter.js
@@ -1,6 +1,7 @@
-import { VIDEO } from '../src/mediaTypes.js';
+import { VIDEO, BANNER } from '../src/mediaTypes.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { Renderer } from '../src/Renderer.js';
+import * as utils from '../src/utils.js';
const BIDDER_CODE = 'aniview';
const GVLID = 780;
@@ -172,6 +173,22 @@ function getCpmData(xml) {
}
return ret;
}
+function buildBanner(xmlStr, bidRequest, bidResponse) {
+ var rendererData = JSON.stringify({
+ id: bidRequest.adUnitCode,
+ debug: window.location.href.indexOf('pbjsDebug') >= 0,
+ placement: bidRequest.bidRequest.adUnitCode,
+ width: bidResponse.width,
+ height: bidResponse.height,
+ vastXml: xmlStr,
+ bid: bidResponse,
+ config: bidRequest.bidRequest.params.rendererConfig
+ });
+ var playerDomain = bidRequest.bidRequest.params.playerDomain || 'player.aniview.com';
+ var ad = '';
+ ad += ''
+ return ad;
+}
function interpretResponse(serverResponse, bidRequest) {
let bidResponses = [];
if (serverResponse && serverResponse.body) {
@@ -181,6 +198,10 @@ function interpretResponse(serverResponse, bidRequest) {
try {
let bidResponse = {};
if (bidRequest && bidRequest.data && bidRequest.data.bidId && bidRequest.data.bidId !== '') {
+ let mediaType = VIDEO;
+ if (bidRequest.bidRequest && bidRequest.bidRequest.mediaTypes && !bidRequest.bidRequest.mediaTypes[VIDEO]) {
+ mediaType = BANNER;
+ }
let xmlStr = serverResponse.body;
let xml = new window.DOMParser().parseFromString(xmlStr, 'text/xml');
if (xml && xml.getElementsByTagName('parsererror').length == 0) {
@@ -195,18 +216,27 @@ function interpretResponse(serverResponse, bidRequest) {
bidResponse.creativeId = xml.getElementsByTagName('Ad') && xml.getElementsByTagName('Ad')[0] && xml.getElementsByTagName('Ad')[0].getAttribute('id') ? xml.getElementsByTagName('Ad')[0].getAttribute('id') : 'creativeId';
bidResponse.currency = cpmData.currency;
bidResponse.netRevenue = true;
- var blob = new Blob([xmlStr], {
- type: 'application/xml'
- });
- bidResponse.vastUrl = window.URL.createObjectURL(blob);
- bidResponse.vastXml = xmlStr;
- bidResponse.mediaType = VIDEO;
+ bidResponse.mediaType = mediaType;
+ if (mediaType === VIDEO) {
+ try {
+ var blob = new Blob([xmlStr], {
+ type: 'application/xml'
+ });
+ bidResponse.vastUrl = window.URL.createObjectURL(blob);
+ } catch (ex) {
+ utils.logError('Aniview Debug create vastXml error:\n\n' + ex);
+ }
+ bidResponse.vastXml = xmlStr;
+ if (bidRequest.bidRequest && bidRequest.bidRequest.mediaTypes && bidRequest.bidRequest.mediaTypes.video && bidRequest.bidRequest.mediaTypes.video.context === 'outstream') {
+ bidResponse.renderer = newRenderer(bidRequest);
+ }
+ } else {
+ bidResponse.ad = buildBanner(xmlStr, bidRequest, bidResponse);
+ }
bidResponse.meta = {
advertiserDomains: []
};
- if (bidRequest.bidRequest && bidRequest.bidRequest.mediaTypes && bidRequest.bidRequest.mediaTypes.video && bidRequest.bidRequest.mediaTypes.video.context === 'outstream') { bidResponse.renderer = newRenderer(bidRequest); }
-
bidResponses.push(bidResponse);
}
} else {}
@@ -279,8 +309,8 @@ function getUserSyncs(syncOptions, serverResponses) {
export const spec = {
code: BIDDER_CODE,
gvlid: GVLID,
- aliases: ['avantisvideo', 'selectmediavideo'],
- supportedMediaTypes: [VIDEO],
+ aliases: ['avantisvideo', 'selectmediavideo', 'vidcrunch'],
+ supportedMediaTypes: [VIDEO, BANNER],
isBidRequestValid,
buildRequests,
interpretResponse,
diff --git a/modules/aolBidAdapter.js b/modules/aolBidAdapter.js
index 03e4ac9021a..4ab6f53ebdc 100644
--- a/modules/aolBidAdapter.js
+++ b/modules/aolBidAdapter.js
@@ -86,9 +86,7 @@ function _isOneMobileBidder(bidderCode) {
function _isNexageRequestPost(bid) {
if (_isOneMobileBidder(bid.bidder) && bid.params.id && bid.params.imp && bid.params.imp[0]) {
let imp = bid.params.imp[0];
- return imp.id && imp.tagid &&
- ((imp.banner && imp.banner.w && imp.banner.h) ||
- (imp.video && imp.video.mimes && imp.video.minduration && imp.video.maxduration));
+ return imp.id && imp.tagid && imp.banner && imp.banner.w && imp.banner.h;
}
}
diff --git a/modules/appnexusBidAdapter.js b/modules/appnexusBidAdapter.js
index 404a8c04d14..72cf0baa3bd 100644
--- a/modules/appnexusBidAdapter.js
+++ b/modules/appnexusBidAdapter.js
@@ -14,6 +14,7 @@ const URL = 'https://ib.adnxs.com/ut/v3/prebid';
const URL_SIMPLE = 'https://ib.adnxs-simple.com/ut/v3/prebid';
const VIDEO_TARGETING = ['id', 'minduration', 'maxduration',
'skippable', 'playback_method', 'frameworks', 'context', 'skipoffset'];
+const VIDEO_RTB_TARGETING = ['minduration', 'maxduration', 'skip', 'skipafter', 'playbackmethod', 'api'];
const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language'];
const APP_DEVICE_PARAMS = ['geo', 'device_id']; // appid is collected separately
const DEBUG_PARAMS = ['enabled', 'dongle', 'member_id', 'debug_timeout'];
@@ -215,6 +216,13 @@ export const spec = {
consent_string: bidderRequest.gdprConsent.consentString,
consent_required: bidderRequest.gdprConsent.gdprApplies
};
+
+ if (bidderRequest.gdprConsent.addtlConsent && bidderRequest.gdprConsent.addtlConsent.indexOf('~') !== -1) {
+ let ac = bidderRequest.gdprConsent.addtlConsent;
+ // pull only the ids from the string (after the ~) and convert them to an array of ints
+ let acStr = ac.substring(ac.indexOf('~') + 1);
+ payload.gdpr_consent.addtl_consent = acStr.split('.').map(id => parseInt(id, 10));
+ }
}
if (bidderRequest && bidderRequest.uspConsent) {
@@ -811,6 +819,51 @@ function bidToTag(bid) {
}
}
+ // use IAB ORTB values if the corresponding values weren't already set by bid.params.video
+ if (videoMediaType) {
+ tag.video = tag.video || {};
+ Object.keys(videoMediaType)
+ .filter(param => includes(VIDEO_RTB_TARGETING, param))
+ .forEach(param => {
+ switch (param) {
+ case 'minduration':
+ case 'maxduration':
+ if (typeof tag.video[param] !== 'number') tag.video[param] = videoMediaType[param];
+ break;
+ case 'skip':
+ if (typeof tag.video['skippable'] !== 'boolean') tag.video['skippable'] = (videoMediaType[param] === 1);
+ break;
+ case 'skipafter':
+ if (typeof tag.video['skipoffset'] !== 'number') tag.video['skippoffset'] = videoMediaType[param];
+ break;
+ case 'playbackmethod':
+ if (typeof tag.video['playback_method'] !== 'number') {
+ let type = videoMediaType[param];
+ type = (utils.isArray(type)) ? type[0] : type;
+
+ // we only support iab's options 1-4 at this time.
+ if (type >= 1 && type <= 4) {
+ tag.video['playback_method'] = type;
+ }
+ }
+ break;
+ case 'api':
+ if (!tag['video_frameworks'] && utils.isArray(videoMediaType[param])) {
+ // need to read thru array; remove 6 (we don't support it), swap 4 <> 5 if found (to match our adserver mapping for these specific values)
+ let apiTmp = videoMediaType[param].map(val => {
+ let v = (val === 4) ? 5 : (val === 5) ? 4 : val;
+
+ if (v >= 1 && v <= 5) {
+ return v;
+ }
+ }).filter(v => v);
+ tag['video_frameworks'] = apiTmp;
+ }
+ break;
+ }
+ });
+ }
+
if (bid.renderer) {
tag.video = Object.assign({}, tag.video, { custom_renderer_present: true });
}
diff --git a/modules/appnexusBidAdapter.md b/modules/appnexusBidAdapter.md
index d1f61836297..7ac70e67584 100644
--- a/modules/appnexusBidAdapter.md
+++ b/modules/appnexusBidAdapter.md
@@ -89,7 +89,18 @@ var adUnits = [
mediaTypes: {
video: {
playerSize: [[300, 250]],
- context: 'outstream'
+ context: 'outstream',
+ // Certain ORTB 2.5 video values can be read from the mediatypes object; below are examples of supported params.
+ // To note - appnexus supports additional values for our system that are not part of the ORTB spec. If you want
+ // to use these values, they will have to be declared in the bids[].params.video object instead using the appnexus syntax.
+ // Between the corresponding values of the mediaTypes.video and params.video objects, the properties in params.video will
+ // take precedence if declared; eg in the example below, the `skippable: true` setting will be used instead of the `skip: 0`.
+ minduration: 1,
+ maxduration: 60,
+ skip: 0, // 1 - true, 0 - false
+ skipafter: 5,
+ playbackmethod: [2], // note - we only support options 1-4 at this time
+ api: [1,2,3] // note - option 6 is not supported at this time
}
},
bids: [
diff --git a/modules/asoBidAdapter.js b/modules/asoBidAdapter.js
new file mode 100644
index 00000000000..8f06b8ed856
--- /dev/null
+++ b/modules/asoBidAdapter.js
@@ -0,0 +1,351 @@
+import {registerBidder} from '../src/adapters/bidderFactory.js';
+import * as utils from '../src/utils.js';
+import {config} from '../src/config.js';
+import {BANNER, VIDEO} from '../src/mediaTypes.js';
+import {Renderer} from '../src/Renderer.js';
+
+const BIDDER_CODE = 'aso';
+const DEFAULT_SERVER_URL = 'https://srv.aso1.net';
+const DEFAULT_SERVER_PATH = '/prebid/bidder';
+const OUTSTREAM_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';
+const TTL = 300;
+
+export const spec = {
+
+ code: BIDDER_CODE,
+ supportedMediaTypes: [BANNER, VIDEO],
+
+ isBidRequestValid: bid => {
+ return !!bid.params && !!bid.params.zone;
+ },
+
+ buildRequests: (validBidRequests, bidderRequest) => {
+ let serverRequests = [];
+
+ utils._each(validBidRequests, bidRequest => {
+ const payload = createBasePayload(bidRequest, bidderRequest);
+
+ const bannerParams = utils.deepAccess(bidRequest, 'mediaTypes.banner');
+ const videoParams = utils.deepAccess(bidRequest, 'mediaTypes.video');
+
+ let imp;
+
+ if (bannerParams && videoParams) {
+ utils.logWarn('Please note, multiple mediaTypes are not supported. The only banner will be used.')
+ }
+
+ if (bannerParams) {
+ imp = createBannerImp(bidRequest, bannerParams)
+ } else if (videoParams) {
+ imp = createVideoImp(bidRequest, videoParams)
+ }
+
+ if (imp) {
+ payload.imp.push(imp);
+ } else {
+ return;
+ }
+
+ serverRequests.push({
+ method: 'POST',
+ url: getEnpoint(bidRequest),
+ data: payload,
+ options: {
+ withCredentials: true,
+ crossOrigin: true
+ },
+ bidRequest: bidRequest
+ });
+ });
+
+ return serverRequests;
+ },
+
+ interpretResponse: (serverResponse, {bidRequest}) => {
+ const response = serverResponse && serverResponse.body;
+
+ if (!response) {
+ return [];
+ }
+
+ const serverBids = response.seatbid.reduce((acc, seatBid) => acc.concat(seatBid.bid), []);
+ const serverBid = serverBids[0];
+
+ let bids = [];
+
+ const bid = {
+ requestId: serverBid.impid,
+ cpm: serverBid.price,
+ width: serverBid.w,
+ height: serverBid.h,
+ ttl: TTL,
+ creativeId: serverBid.crid,
+ netRevenue: true,
+ currency: response.cur,
+ mediaType: bidRequest.mediaType,
+ meta: {
+ mediaType: bidRequest.mediaType,
+ advertiserDomains: serverBid.adomain ? serverBid.adomain : []
+ }
+ };
+
+ if (bid.mediaType === BANNER) {
+ bid.ad = serverBid.adm;
+ } else if (bid.mediaType === VIDEO) {
+ bid.vastXml = serverBid.adm;
+ if (utils.deepAccess(bidRequest, 'mediaTypes.video.context') === 'outstream') {
+ bid.adResponse = {
+ content: bid.vastXml,
+ };
+ bid.renderer = createRenderer(bidRequest, OUTSTREAM_RENDERER_URL);
+ }
+ }
+
+ bids.push(bid);
+
+ return bids;
+ },
+
+ getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) {
+ const urls = [];
+
+ if (serverResponses && serverResponses.length !== 0) {
+ let query = '';
+ if (gdprConsent) {
+ query = utils.tryAppendQueryString(query, 'gdpr', (gdprConsent.gdprApplies ? 1 : 0));
+ query = utils.tryAppendQueryString(query, 'consents_str', gdprConsent.consentString);
+ const consentsIds = getConsentsIds(gdprConsent);
+ if (consentsIds) {
+ query = utils.tryAppendQueryString(query, 'consents', consentsIds);
+ }
+ }
+
+ if (uspConsent) {
+ query = utils.tryAppendQueryString(query, 'us_privacy', uspConsent);
+ }
+
+ utils._each(serverResponses, resp => {
+ const userSyncs = utils.deepAccess(resp, 'body.ext.user_syncs');
+ if (!userSyncs) {
+ return;
+ }
+
+ utils._each(userSyncs, us => {
+ urls.push({
+ type: us.type,
+ url: us.url + (query ? '?' + query : '')
+ });
+ });
+ });
+ }
+
+ return urls;
+ }
+};
+
+function outstreamRender(bid) {
+ bid.renderer.push(() => {
+ window.ANOutstreamVideo.renderAd({
+ sizes: [bid.width, bid.height],
+ targetId: bid.adUnitCode,
+ adResponse: bid.adResponse,
+ rendererOptions: bid.renderer.getConfig()
+ });
+ });
+}
+
+function createRenderer(bid, url) {
+ const renderer = Renderer.install({
+ id: bid.bidId,
+ url: url,
+ loaded: false,
+ config: utils.deepAccess(bid, 'renderer.options'),
+ adUnitCode: bid.adUnitCode
+ });
+ renderer.setRender(outstreamRender);
+ return renderer;
+}
+
+function getUrlsInfo(bidderRequest) {
+ let page = '';
+ let referrer = '';
+
+ const {refererInfo} = bidderRequest;
+
+ if (utils.inIframe()) {
+ page = refererInfo.referer;
+ } else {
+ const w = utils.getWindowTop();
+ page = w.location.href;
+ referrer = w.document.referrer || '';
+ }
+
+ page = config.getConfig('pageUrl') || page;
+ const url = utils.parseUrl(page);
+ const domain = url.hostname;
+
+ return {
+ domain,
+ page,
+ referrer
+ };
+}
+
+function getSize(paramSizes) {
+ const parsedSizes = utils.parseSizesInput(paramSizes);
+ const sizes = parsedSizes.map(size => {
+ const [width, height] = size.split('x');
+ const w = parseInt(width, 10);
+ const h = parseInt(height, 10);
+ return {w, h};
+ });
+
+ return sizes[0] || null;
+}
+
+function getBidFloor(bidRequest, size) {
+ if (!utils.isFn(bidRequest.getFloor)) {
+ return null;
+ }
+
+ const bidFloor = bidRequest.getFloor({
+ mediaType: bidRequest.mediaType,
+ size: size ? [size.w, size.h] : '*'
+ });
+
+ if (!isNaN(bidFloor.floor)) {
+ return bidFloor;
+ }
+
+ return null;
+}
+
+function createBaseImp(bidRequest, size) {
+ const imp = {
+ id: bidRequest.bidId,
+ tagid: bidRequest.adUnitCode,
+ secure: 1
+ };
+
+ const bidFloor = getBidFloor(bidRequest, size);
+ if (bidFloor !== null) {
+ imp.bidfloor = bidFloor.floor;
+ imp.bidfloorcur = bidFloor.currency;
+ }
+
+ return imp;
+}
+
+function createBannerImp(bidRequest, bannerParams) {
+ bidRequest.mediaType = BANNER;
+
+ const size = getSize(bannerParams.sizes);
+ const imp = createBaseImp(bidRequest, size);
+
+ imp.banner = {
+ w: size.w,
+ h: size.h,
+ topframe: utils.inIframe() ? 0 : 1
+ }
+
+ return imp;
+}
+
+function createVideoImp(bidRequest, videoParams) {
+ bidRequest.mediaType = VIDEO;
+ const size = getSize(videoParams.playerSize);
+ const imp = createBaseImp(bidRequest, size);
+
+ imp.video = {
+ mimes: videoParams.mimes,
+ minduration: videoParams.minduration,
+ startdelay: videoParams.startdelay,
+ linearity: videoParams.linearity,
+ maxduration: videoParams.maxduration,
+ skip: videoParams.skip,
+ protocols: videoParams.protocols,
+ skipmin: videoParams.skipmin,
+ api: videoParams.api
+ }
+
+ if (size) {
+ imp.video.w = size.w;
+ imp.video.h = size.h;
+ }
+
+ return imp;
+}
+
+function getEnpoint(bidRequest) {
+ const serverUrl = bidRequest.params.serverUrl || DEFAULT_SERVER_URL;
+ const serverPath = bidRequest.params.serverPath || DEFAULT_SERVER_PATH;
+
+ return serverUrl + serverPath + '?zid=' + bidRequest.params.zone + '&pbjs=$prebid.version$';
+}
+
+function getConsentsIds(gdprConsent) {
+ const consents = utils.deepAccess(gdprConsent, 'vendorData.purpose.consents', []);
+ let consentsIds = [];
+
+ Object.keys(consents).forEach(function (key) {
+ if (consents[key] === true) {
+ consentsIds.push(key);
+ }
+ });
+
+ return consentsIds.join(',');
+}
+
+function createBasePayload(bidRequest, bidderRequest) {
+ const urlsInfo = getUrlsInfo(bidderRequest);
+
+ const payload = {
+ id: bidRequest.auctionId + '_' + bidRequest.bidId,
+ at: 1,
+ tmax: bidderRequest.timeout,
+ site: {
+ id: urlsInfo.domain,
+ domain: urlsInfo.domain,
+ page: urlsInfo.page,
+ ref: urlsInfo.referrer
+ },
+ device: {
+ dnt: utils.getDNT() ? 1 : 0,
+ h: window.innerHeight,
+ w: window.innerWidth,
+ },
+ imp: [],
+ ext: {},
+ user: {}
+ };
+
+ if (bidRequest.params.attr) {
+ utils.deepSetValue(payload, 'site.ext.attr', bidRequest.params.attr);
+ }
+
+ if (bidderRequest.gdprConsent) {
+ utils.deepSetValue(payload, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
+ const consentsIds = getConsentsIds(bidderRequest.gdprConsent);
+ if (consentsIds) {
+ utils.deepSetValue(payload, 'user.ext.consents', consentsIds);
+ }
+ utils.deepSetValue(payload, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies & 1);
+ }
+
+ if (bidderRequest.uspConsent) {
+ utils.deepSetValue(payload, 'regs.ext.us_privacy', bidderRequest.uspConsent);
+ }
+
+ if (config.getConfig('coppa')) {
+ utils.deepSetValue(payload, 'regs.coppa', 1);
+ }
+
+ const eids = utils.deepAccess(bidRequest, 'userIdAsEids');
+ if (eids && eids.length) {
+ utils.deepSetValue(payload, 'user.ext.eids', eids);
+ }
+
+ return payload;
+}
+
+registerBidder(spec);
diff --git a/modules/asoBidAdapter.md b/modules/asoBidAdapter.md
new file mode 100644
index 00000000000..32f4ebf5cef
--- /dev/null
+++ b/modules/asoBidAdapter.md
@@ -0,0 +1,78 @@
+# Overview
+
+```
+Module Name: Adserver.Online Bidder Adapter
+Module Type: Bidder Adapter
+Maintainer: support@adsrv.org
+```
+
+# Description
+
+Adserver.Online Bidder Adapter for Prebid.js.
+
+For more information, please visit [Adserver.Online](https://adserver.online).
+
+# Parameters
+
+| Name | Scope | Description | Example | Type |
+|---------------|----------|-------------------------|-----------|-----------|
+| `zone` | required | Zone ID | `73815` | `Integer` |
+| `attr` | optional | Custom targeting params | `{keywords: ["a", "b"]}` | `Object` |
+
+
+
+# Test parameters for banner
+```js
+var adUnits = [
+ {
+ code: 'banner1',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ }
+ },
+ bids: [
+ {
+ bidder: 'aso',
+ params: {
+ zone: 73815
+ }
+ }
+ ]
+ }
+];
+```
+
+# Test parameters for video
+```js
+var videoAdUnit = [
+ {
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ playerSize: [[640, 480]],
+ context: 'instream' // or 'outstream'
+ }
+ },
+ bids: [{
+ bidder: 'aso',
+ params: {
+ zone: 34668
+ }
+ }]
+ }
+];
+```
+
+# Configuration
+
+The Adserver.Online Bid Adapter expects Prebid Cache (for video) to be enabled.
+
+```
+pbjs.setConfig({
+ usePrebidCache: true,
+ cache: {
+ url: 'https://prebid.adnxs.com/pbc/v1/cache'
+ }
+});
+```
diff --git a/modules/atomxBidAdapter.js b/modules/atomxBidAdapter.js
deleted file mode 100644
index e9f15218c4c..00000000000
--- a/modules/atomxBidAdapter.js
+++ /dev/null
@@ -1,107 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'atomx';
-
-function getDomain() {
- var domain = '';
-
- try {
- if ((domain === '') && (window.top == window)) {
- domain = window.location.href;
- }
-
- if ((domain === '') && (window.top == window.parent)) {
- domain = document.referrer;
- }
-
- if (domain == '') {
- var atomxt = 'atomxtest';
-
- // It should be impossible to change the window.location.ancestorOrigins.
- window.location.ancestorOrigins[0] = atomxt;
- if (window.location.ancestorOrigins[0] != atomxt) {
- var ancestorOrigins = window.location.ancestorOrigins;
-
- // If the length is 0 we are a javascript tag running in the main domain.
- // But window.top != window or window.location.hostname is empty.
- if (ancestorOrigins.length == 0) {
- // This browser is so fucked up, just return an empty string.
- return '';
- }
-
- // ancestorOrigins is an array where [0] is our own window.location
- // and [length-1] is the top window.location.
- domain = ancestorOrigins[ancestorOrigins.length - 1];
- }
- }
- } catch (unused) {
- }
-
- if (domain === '') {
- domain = document.referrer;
- }
-
- if (domain === '') {
- domain = window.location.href;
- }
-
- return domain.substr(0, 512);
-}
-
-export const spec = {
- code: BIDDER_CODE,
-
- isBidRequestValid: function(bid) {
- return bid.params && (!!bid.params.id);
- },
-
- buildRequests: function(validBidRequests) {
- return validBidRequests.map(bidRequest => {
- return {
- method: 'GET',
- url: 'https://p.ato.mx/placement',
- data: {
- v: 12,
- id: bidRequest.params.id,
- size: utils.parseSizesInput(bidRequest.sizes)[0],
- prebid: bidRequest.bidId,
- b: 0,
- h: '7t3y9',
- type: 'javascript',
- screen: window.screen.width + 'x' + window.screen.height + 'x' + window.screen.colorDepth,
- timezone: new Date().getTimezoneOffset(),
- domain: getDomain(),
- r: document.referrer.substr(0, 512),
- },
- };
- });
- },
-
- interpretResponse: function (serverResponse, bidRequest) {
- const body = serverResponse.body;
- const res = {
- requestId: body.code,
- cpm: body.cpm * 1000,
- width: body.width,
- height: body.height,
- creativeId: body.creative_id,
- currency: 'USD',
- netRevenue: true,
- ttl: 60,
- };
-
- if (body.adm) {
- res.ad = body.adm;
- } else {
- res.adUrl = body.url;
- }
-
- return [res];
- },
-
- getUserSyncs: function(syncOptions, serverResponses) {
- return [];
- },
-};
-registerBidder(spec);
diff --git a/modules/atsAnalyticsAdapter.js b/modules/atsAnalyticsAdapter.js
index 31e46dead89..0cff7bbd68f 100644
--- a/modules/atsAnalyticsAdapter.js
+++ b/modules/atsAnalyticsAdapter.js
@@ -275,6 +275,7 @@ function sendDataToAnalytic () {
// preflight request, to check did publisher have permission to send data to analytics endpoint
function preflightRequest (envelopeSourceCookieValue) {
+ utils.logInfo('ATS Analytics - preflight request!');
ajax(preflightUrl + atsAnalyticsAdapter.context.pid, function (data) {
let samplingRateObject = JSON.parse(data);
utils.logInfo('ATS Analytics - Sampling Rate: ', samplingRateObject);
@@ -322,7 +323,6 @@ let atsAnalyticsAdapter = Object.assign(adapter(
if (eventType === CONSTANTS.EVENTS.AUCTION_END) {
let envelopeSourceCookieValue = storage.getCookie('_lr_env_src_ats');
try {
- utils.logInfo('ATS Analytics - preflight request!');
let samplingRateCookie = storage.getCookie('_lr_sampling_rate');
if (!samplingRateCookie) {
preflightRequest(envelopeSourceCookieValue);
@@ -341,11 +341,16 @@ let atsAnalyticsAdapter = Object.assign(adapter(
// save the base class function
atsAnalyticsAdapter.originEnableAnalytics = atsAnalyticsAdapter.enableAnalytics;
-// add check to not fire request every time, but instead to send 1/10 events
+// add check to not fire request every time, but instead to send 1/100
atsAnalyticsAdapter.shouldFireRequest = function (samplingRate) {
- let shouldFireRequestValue = (Math.floor((Math.random() * samplingRate + 1)) === samplingRate);
- utils.logInfo('ATS Analytics - Should Fire Request: ', shouldFireRequestValue);
- return shouldFireRequestValue;
+ if (samplingRate !== 0) {
+ let shouldFireRequestValue = (Math.floor((Math.random() * 100 + 1)) === 100);
+ utils.logInfo('ATS Analytics - Should Fire Request: ', shouldFireRequestValue);
+ return shouldFireRequestValue;
+ } else {
+ utils.logInfo('ATS Analytics - Should Fire Request: ', false);
+ return false;
+ }
};
atsAnalyticsAdapter.getUserAgent = function () {
@@ -362,6 +367,7 @@ atsAnalyticsAdapter.enableAnalytics = function (config) {
pid: config.options.pid
};
let initOptions = config.options;
+ utils.logInfo('ATS Analytics - adapter enabled! ');
atsAnalyticsAdapter.originEnableAnalytics(initOptions); // call the base class function
};
diff --git a/modules/audiencerunBidAdapter.js b/modules/audiencerunBidAdapter.js
index b90471ee21a..da0cbb39925 100644
--- a/modules/audiencerunBidAdapter.js
+++ b/modules/audiencerunBidAdapter.js
@@ -4,10 +4,52 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER } from '../src/mediaTypes.js';
const BIDDER_CODE = 'audiencerun';
-const ENDPOINT_URL = 'https://d.audiencerun.com/prebid';
+const BASE_URL = 'https://d.audiencerun.com';
+const AUCTION_URL = `${BASE_URL}/prebid`;
+const TIMEOUT_EVENT_URL = `${BASE_URL}/ps/pbtimeout`;
+const DEFAULT_CURRENCY = 'USD';
+
+let requestedBids = [];
+
+/**
+ * Gets bidder request referer
+ *
+ * @param {Object} bidderRequest
+ * @return {string}
+ */
+function getPageUrl(bidderRequest) {
+ return (
+ config.getConfig('pageUrl') ||
+ utils.deepAccess(bidderRequest, 'refererInfo.referer') ||
+ null
+ );
+}
+
+/**
+ * Returns bidfloor through floors module if available
+ *
+ * @param {Object} bid
+ * @returns {number}
+ */
+function getBidFloor(bid) {
+ if (!utils.isFn(bid.getFloor)) {
+ return utils.deepAccess(bid, 'params.bidfloor', 0);
+ }
+
+ try {
+ const bidFloor = bid.getFloor({
+ currency: DEFAULT_CURRENCY,
+ mediaType: BANNER,
+ size: '*',
+ });
+ return bidFloor.floor;
+ } catch (_) {
+ return 0
+ }
+}
export const spec = {
- version: '1.0.0',
+ version: '1.1.0',
code: BIDDER_CODE,
supportedMediaTypes: [BANNER],
@@ -33,50 +75,53 @@ export const spec = {
* @param {*} bidderRequest
* @return {ServerRequest} Info describing the request to the server.
*/
- buildRequests: function(bidRequests, bidderRequest) {
- const bids = bidRequests.map(bid => {
+ buildRequests: function (bidRequests, bidderRequest) {
+ const bids = bidRequests.map((bid) => {
const sizes = utils.deepAccess(bid, 'mediaTypes.banner.sizes', []);
return {
zoneId: utils.getValue(bid.params, 'zoneId'),
- sizes: sizes.map(size => ({
+ sizes: sizes.map((size) => ({
w: size[0],
- h: size[1]
+ h: size[1],
})),
- bidfloor: bid.params.bidfloor || 0.0,
+ bidfloor: getBidFloor(bid),
bidId: bid.bidId,
bidderRequestId: utils.getBidIdParameter('bidderRequestId', bid),
adUnitCode: utils.getBidIdParameter('adUnitCode', bid),
auctionId: utils.getBidIdParameter('auctionId', bid),
- transactionId: utils.getBidIdParameter('transactionId', bid)
+ transactionId: utils.getBidIdParameter('transactionId', bid),
};
});
const payload = {
libVersion: this.version,
- referer: bidderRequest.refererInfo ? bidderRequest.refererInfo.referer || null : null,
+ referer: getPageUrl(bidderRequest),
currencyCode: config.getConfig('currency.adServerCurrency'),
timeout: config.getConfig('bidderTimeout'),
- bids
+ bids,
};
if (bidderRequest && bidderRequest.gdprConsent) {
payload.gdpr = {
consent: bidderRequest.gdprConsent.consentString,
- applies: bidderRequest.gdprConsent.gdprApplies
+ applies: bidderRequest.gdprConsent.gdprApplies,
+ version: bidderRequest.gdprConsent.apiVersion,
};
} else {
payload.gdpr = {
- consent: ''
- }
+ consent: '',
+ };
}
+ requestedBids = bids;
+
return {
method: 'POST',
- url: ENDPOINT_URL,
+ url: AUCTION_URL,
data: JSON.stringify(payload),
options: {
- withCredentials: true
- }
+ withCredentials: true,
+ },
};
},
@@ -100,15 +145,22 @@ export const spec = {
// Common properties
bid.requestId = bidObject.bidId;
- bid.adId = bidObject.zoneId;
bid.cpm = parseFloat(bidObject.cpm);
bid.creativeId = bidObject.crid;
- bid.currency = bidObject.currency ? bidObject.currency.toUpperCase() : 'USD';
+ bid.currency = bidObject.currency
+ ? bidObject.currency.toUpperCase()
+ : DEFAULT_CURRENCY;
bid.height = bidObject.h;
bid.width = bidObject.w;
bid.netRevenue = bidObject.isNet ? bidObject.isNet : false;
bid.ttl = 300;
+ bid.meta = {
+ advertiserDomains:
+ bidObject.adomain && Array.isArray(bidObject.adomain)
+ ? bidObject.adomain
+ : [],
+ };
bids.push(bid);
});
@@ -122,21 +174,42 @@ export const spec = {
* @param {ServerResponse[]} serverResponses List of server's responses.
* @return {UserSync[]} The user syncs which should be dropped.
*/
- getUserSyncs: function(syncOptions, serverResponses) {
+ getUserSyncs: function (syncOptions, serverResponses) {
if (!serverResponses || !serverResponses.length) return [];
const syncs = [];
- serverResponses.forEach(response => {
- response.body.bid.forEach(bidObject => {
+ serverResponses.forEach((response) => {
+ response.body.bid.forEach((bidObject) => {
syncs.push({
type: 'iframe',
- url: bidObject.syncUrl
+ url: bidObject.syncUrl,
});
});
});
return syncs;
- }
+ },
+
+ /**
+ * Register bidder specific code, which will execute if bidder timed out after an auction
+ *
+ * @param {Array} timeoutData timeout specific data
+ */
+ onTimeout: function (timeoutData) {
+ if (!utils.isArray(timeoutData)) {
+ return;
+ }
+
+ timeoutData.forEach((bid) => {
+ const bidOnTimeout = requestedBids.find((requestedBid) => requestedBid.bidId === bid.bidId);
+
+ if (bidOnTimeout) {
+ utils.triggerPixel(
+ `${TIMEOUT_EVENT_URL}/${bidOnTimeout.zoneId}/${bidOnTimeout.bidId}`
+ );
+ }
+ });
+ },
};
registerBidder(spec);
diff --git a/modules/audiencerunBidAdapter.md b/modules/audiencerunBidAdapter.md
index 3704922fdd5..2257e939f3b 100644
--- a/modules/audiencerunBidAdapter.md
+++ b/modules/audiencerunBidAdapter.md
@@ -2,7 +2,7 @@
**Module Name**: AudienceRun Bidder Adapter
**Module Type**: Bidder Adapter
-**Maintainer**: prebid@audiencerun.com
+**Maintainer**: github@audiencerun.com
# Description
diff --git a/modules/avocetBidAdapter.js b/modules/avocetBidAdapter.js
deleted file mode 100644
index 1283bb865d4..00000000000
--- a/modules/avocetBidAdapter.js
+++ /dev/null
@@ -1,141 +0,0 @@
-import { config } from '../src/config.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'avct';
-const DEFAULT_BASE_URL = 'https://ads.avct.cloud';
-const DEFAULT_PREBID_PATH = '/prebid';
-
-function getPrebidURL() {
- let host = config.getConfig('avct.baseUrl');
- if (host && typeof host === 'string') {
- return `${host}${getPrebidPath()}`;
- }
- return `${DEFAULT_BASE_URL}${getPrebidPath()}`;
-}
-
-function getPrebidPath() {
- let prebidPath = config.getConfig('avct.prebidPath');
- if (prebidPath && typeof prebidPath === 'string') {
- return prebidPath;
- }
- return DEFAULT_PREBID_PATH;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO],
- /**
- * Determines whether or not the given bid request is valid.
- *
- * @param {BidRequest} bid The bid with params to validate.
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: function (bid) {
- return (
- !!bid.params &&
- !!bid.params.placement &&
- typeof bid.params.placement === 'string' &&
- bid.params.placement.length === 24
- );
- },
- /**
- * 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 (bidRequests, bidderRequest) {
- // Get currency from config
- const currency = config.getConfig('currency.adServerCurrency');
-
- // Publisher domain from config
- const publisherDomain = config.getConfig('publisherDomain');
-
- // First-party data from config
- const fpd = config.getLegacyFpd(config.getConfig('ortb2'));
-
- // GDPR status and TCF consent string
- let tcfConsentString;
- let gdprApplies = false;
- if (bidderRequest.gdprConsent) {
- tcfConsentString = bidderRequest.gdprConsent.consentString;
- gdprApplies = !!bidderRequest.gdprConsent.gdprApplies;
- }
-
- // US privacy string
- let usPrivacyString;
- if (bidderRequest.uspConsent) {
- usPrivacyString = bidderRequest.uspConsent;
- }
-
- // Supply chain
- let schain;
- if (bidderRequest.schain) {
- schain = bidderRequest.schain;
- }
-
- // ID5 identifier
- let id5id;
- if (bidRequests[0].userId && bidRequests[0].userId.id5id && bidRequests[0].userId.id5id.uid) {
- id5id = bidRequests[0].userId.id5id.uid;
- }
-
- // Build the avocet ext object
- const ext = {
- currency,
- tcfConsentString,
- gdprApplies,
- usPrivacyString,
- schain,
- publisherDomain,
- fpd,
- id5id,
- };
-
- // Extract properties from bidderRequest
- const {
- auctionId,
- auctionStart,
- bidderCode,
- bidderRequestId,
- refererInfo,
- timeout,
- } = bidderRequest;
-
- // Construct payload
- const payload = JSON.stringify({
- auctionId,
- auctionStart,
- bidderCode,
- bidderRequestId,
- refererInfo,
- timeout,
- bids: bidRequests,
- ext,
- });
-
- return {
- method: 'POST',
- url: getPrebidURL(),
- data: payload,
- };
- },
- interpretResponse: function (serverResponse, bidRequest) {
- if (
- !serverResponse ||
- !serverResponse.body ||
- typeof serverResponse.body !== 'object'
- ) {
- return [];
- }
- if (Array.isArray(serverResponse.body)) {
- return serverResponse.body;
- }
- if (Array.isArray(serverResponse.body.responses)) {
- return serverResponse.body.responses;
- }
- return [];
- },
-};
-registerBidder(spec);
diff --git a/modules/axonixBidAdapter.md b/modules/axonixBidAdapter.md
index 7a4606d5502..acbaae1d4b0 100644
--- a/modules/axonixBidAdapter.md
+++ b/modules/axonixBidAdapter.md
@@ -3,7 +3,7 @@
```
Module Name : Axonix Bidder Adapter
Module Type : Bidder Adapter
-Maintainer : support+prebid@axonix.com
+Maintainer : support.axonix@emodoinc.com
```
# Description
diff --git a/modules/beachfrontBidAdapter.js b/modules/beachfrontBidAdapter.js
index 43df7eef9ae..d633359eb8e 100644
--- a/modules/beachfrontBidAdapter.js
+++ b/modules/beachfrontBidAdapter.js
@@ -6,7 +6,7 @@ import { VIDEO, BANNER } from '../src/mediaTypes.js';
import find from 'core-js-pure/features/array/find.js';
import includes from 'core-js-pure/features/array/includes.js';
-const ADAPTER_VERSION = '1.16';
+const ADAPTER_VERSION = '1.17';
const ADAPTER_NAME = 'BFIO_PREBID';
const OUTSTREAM = 'outstream';
const CURRENCY = 'USD';
@@ -21,7 +21,8 @@ export const DEFAULT_MIMES = ['video/mp4', 'application/javascript'];
export const SUPPORTED_USER_IDS = [
{ key: 'tdid', source: 'adserver.org', rtiPartner: 'TDID', queryParam: 'tdid' },
{ key: 'idl_env', source: 'liveramp.com', rtiPartner: 'idl', queryParam: 'idl' },
- { key: 'uid2.id', source: 'uidapi.com', rtiPartner: 'UID2', queryParam: 'uid2' }
+ { key: 'uid2.id', source: 'uidapi.com', rtiPartner: 'UID2', queryParam: 'uid2' },
+ { key: 'haloId', source: 'audigent.com', atype: 1, queryParam: 'haloid' }
];
let appId = '';
@@ -78,7 +79,7 @@ export const spec = {
cpm: response.bidPrice,
width: firstSize.w,
height: firstSize.h,
- creativeId: response.crid,
+ creativeId: response.crid || response.cmpId,
meta: responseMeta,
renderer: context === OUTSTREAM ? createRenderer(bidRequest) : null,
mediaType: VIDEO,
@@ -294,19 +295,23 @@ function getEids(bid) {
}
function getUserId(bid) {
- return ({ key, source, rtiPartner }) => {
+ return ({ key, source, rtiPartner, atype }) => {
let id = utils.deepAccess(bid, `userId.${key}`);
- return id ? formatEid(id, source, rtiPartner) : null;
+ return id ? formatEid(id, source, rtiPartner, atype) : null;
};
}
-function formatEid(id, source, rtiPartner) {
+function formatEid(id, source, rtiPartner, atype) {
+ let uid = { id };
+ if (rtiPartner) {
+ uid.ext = { rtiPartner };
+ }
+ if (atype) {
+ uid.atype = atype;
+ }
return {
source,
- uids: [{
- id,
- ext: { rtiPartner }
- }]
+ uids: [uid]
};
}
diff --git a/modules/betweenBidAdapter.js b/modules/betweenBidAdapter.js
index 5a351def958..feb6cae437a 100644
--- a/modules/betweenBidAdapter.js
+++ b/modules/betweenBidAdapter.js
@@ -1,5 +1,5 @@
import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { getAdUnitSizes, parseSizesInput, deepAccess } from '../src/utils.js';
+import { getAdUnitSizes, parseSizesInput } from '../src/utils.js';
import { getRefererInfo } from '../src/refererDetection.js';
const BIDDER_CODE = 'between';
@@ -37,8 +37,6 @@ export const spec = {
tz: getTz(),
fl: getFl(),
rr: getRr(),
- shid: getSharedId(i)('id'),
- shid3: getSharedId(i)('third'),
s: i.params.s,
bidid: i.bidId,
transactionid: i.transactionId,
@@ -149,15 +147,6 @@ export const spec = {
}
}
-function getSharedId(bid) {
- const id = deepAccess(bid, 'userId.sharedid.id');
- const third = deepAccess(bid, 'userId.sharedid.third');
- return function(kind) {
- if (kind === 'id') return id || '';
- return third || '';
- }
-}
-
function getRr() {
try {
var td = top.document;
diff --git a/modules/bidfluenceBidAdapter.js b/modules/bidfluenceBidAdapter.js
deleted file mode 100644
index f8a1f9ac92f..00000000000
--- a/modules/bidfluenceBidAdapter.js
+++ /dev/null
@@ -1,131 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { getStorageManager } from '../src/storageManager.js';
-
-const storage = getStorageManager();
-const BIDDER_CODE = 'bidfluence';
-
-function stdTimezoneOffset(t) {
- const jan = new Date(t.getFullYear(), 0, 1);
- const jul = new Date(t.getFullYear(), 6, 1);
- return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
-}
-function dst(t) {
- return t.getTimezoneOffset() < stdTimezoneOffset(t);
-}
-function getBdfTz(d) {
- let tz = d.getTimezoneOffset();
- if (dst(d)) {
- tz += 60;
- }
- return tz.toString();
-}
-function getUTCDate() {
- var m = new Date();
- var dateString = m.getUTCFullYear() + '/' +
- ('0' + (m.getUTCMonth() + 1)).slice(-2) + '/' +
- ('0' + m.getUTCDate()).slice(-2) + ' ' +
- ('0' + m.getUTCHours()).slice(-2) + ':' +
- ('0' + m.getUTCMinutes()).slice(-2) + ':' +
- ('0' + m.getUTCSeconds()).slice(-2);
-
- return dateString;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- isBidRequestValid: function (bid) {
- return !!bid.params.placementId || !!bid.params.publisherId;
- },
-
- buildRequests: function (validBidRequests, bidderRequest) {
- const body = document.getElementsByTagName('body')[0];
- const refInfo = bidderRequest.refererInfo;
- const gdpr = bidderRequest.gdprConsent;
- const vpW = Math.max(window.innerWidth || body.clientWidth || 0) + 2;
- const vpH = Math.max(window.innerHeight || body.clientHeight || 0) + 2;
- const sr = screen.height > screen.width ? screen.height + 'x' + screen.width + 'x' + screen.colorDepth : screen.width + 'x' + screen.height + 'x' + screen.colorDepth;
-
- var payload = {
- v: '2.0',
- azr: true,
- ck: storage.cookiesAreEnabled(),
- re: refInfo ? refInfo.referer : '',
- st: refInfo ? refInfo.stack : [],
- tz: getBdfTz(new Date()),
- sr: sr,
- tm: bidderRequest.timeout,
- vp: vpW + 'x' + vpH,
- sdt: getUTCDate(),
- top: refInfo ? refInfo.reachedTop : false,
- gdpr: gdpr ? gdpr.gdprApplies : false,
- gdprc: gdpr ? gdpr.consentString : '',
- bids: []
- };
-
- utils._each(validBidRequests, function (bidRequest) {
- var params = bidRequest.params;
- var sizes = utils.parseSizesInput(bidRequest.sizes)[0];
- var width = sizes.split('x')[0];
- var height = sizes.split('x')[1];
-
- var currentBidPayload = {
- bid: bidRequest.bidId,
- tid: params.placementId,
- pid: params.publisherId,
- rp: params.reservePrice || 0,
- w: width,
- h: height
- };
-
- payload.bids.push(currentBidPayload);
- });
-
- const payloadString = JSON.stringify(payload);
- return {
- method: 'POST',
- url: `https://bdf${payload.bids[0].pid}.bidfluence.com/Prebid`,
- data: payloadString,
- options: { contentType: 'text/plain' }
- };
- },
-
- interpretResponse: function (serverResponse, bidRequest) {
- const bidResponses = [];
- const response = serverResponse.body;
-
- utils._each(response.Bids, function (currentResponse) {
- var cpm = currentResponse.Cpm || 0;
-
- if (cpm > 0) {
- const bidResponse = {
- requestId: currentResponse.BidId,
- cpm: cpm,
- width: currentResponse.Width,
- height: currentResponse.Height,
- creativeId: currentResponse.CreativeId,
- ad: currentResponse.Ad,
- currency: 'USD',
- netRevenue: true,
- ttl: 360
- };
- bidResponses.push(bidResponse);
- }
- });
-
- return bidResponses;
- },
-
- getUserSyncs: function (serverResponses) {
- if (serverResponses.userSyncs) {
- const syncs = serverResponses.UserSyncs.map((sync) => {
- return {
- type: sync.Type === 'ifr' ? 'iframe' : 'image',
- url: sync.Url
- };
- });
- return syncs;
- }
- }
-};
-registerBidder(spec);
diff --git a/modules/bidglassBidAdapter.js b/modules/bidglassBidAdapter.js
index 44f5cdf4384..b77ca474e13 100644
--- a/modules/bidglassBidAdapter.js
+++ b/modules/bidglassBidAdapter.js
@@ -125,20 +125,31 @@ export const spec = {
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',
+ utils._each(serverResponse.body.bidResponses, function(serverBid) {
+ const bidResponse = {
+ requestId: serverBid.requestId,
+ cpm: parseFloat(serverBid.cpm),
+ width: parseInt(serverBid.width, 10),
+ height: parseInt(serverBid.height, 10),
+ creativeId: serverBid.creativeId,
+ dealId: serverBid.dealId || null,
+ currency: serverBid.currency || 'USD',
+ mediaType: serverBid.mediaType || 'banner',
netRevenue: true,
- ttl: bid.ttl || 10,
- ad: bid.ad
- });
+ ttl: serverBid.ttl || 10,
+ ad: serverBid.ad,
+ meta: {}
+ };
+
+ if (serverBid.meta) {
+ let meta = serverBid.meta;
+
+ if (meta.advertiserDomains && meta.advertiserDomains.length) {
+ bidResponse.meta.advertiserDomains = meta.advertiserDomains;
+ }
+ }
+
+ bidResponses.push(bidResponse);
});
return bidResponses;
diff --git a/modules/bidlabBidAdapter.js b/modules/bidlabBidAdapter.js
deleted file mode 100644
index 8f501505a6d..00000000000
--- a/modules/bidlabBidAdapter.js
+++ /dev/null
@@ -1,112 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'bidlab';
-const AD_URL = 'https://service.bidlab.ai/?c=o&m=multi';
-const URL_SYNC = 'https://service.bidlab.ai/?c=o&m=sync';
-const NO_SYNC = true;
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId ||
- !bid.ttl || !bid.currency) {
- return false;
- }
- switch (bid.mediaType) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- return Boolean(bid.native && bid.native.title && bid.native.image && bid.native.impressionTrackers);
- default:
- return false;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
- noSync: NO_SYNC,
-
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(parseInt(bid.params.placementId)));
- },
-
- buildRequests: (validBidRequests = [], bidderRequest) => {
- let winTop = window;
- let location;
- try {
- location = new URL(bidderRequest.refererInfo.referer)
- winTop = window.top;
- } catch (e) {
- location = winTop.location;
- utils.logMessage(e);
- };
- let placements = [];
- let request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language.split('-')[0] : '',
- 'secure': 1,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
- request.language.indexOf('-') != -1 && (request.language = request.language.split('-')[0])
- if (bidderRequest) {
- if (bidderRequest.uspConsent) {
- request.ccpa = bidderRequest.uspConsent;
- }
- if (bidderRequest.gdprConsent) {
- request.gdpr = bidderRequest.gdprConsent
- }
- }
- const len = validBidRequests.length;
-
- for (let i = 0; i < len; i++) {
- let bid = validBidRequests[i];
- let traff = bid.params.traffic || BANNER
-
- placements.push({
- placementId: bid.params.placementId,
- bidId: bid.bidId,
- sizes: bid.mediaTypes && bid.mediaTypes[traff] && bid.mediaTypes[traff].sizes ? bid.mediaTypes[traff].sizes : [],
- traffic: traff
- });
- if (bid.schain) {
- placements.schain = bid.schain;
- }
- }
- return {
- method: 'POST',
- url: AD_URL,
- data: request
- };
- },
-
- interpretResponse: (serverResponse) => {
- let response = [];
- for (let i = 0; i < serverResponse.body.length; i++) {
- let resItem = serverResponse.body[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- return response;
- },
-
- getUserSyncs: (syncOptions, serverResponses) => {
- if (NO_SYNC) {
- return false
- } else {
- return [{
- type: 'image',
- url: URL_SYNC
- }];
- }
- }
-
-};
-
-registerBidder(spec);
diff --git a/modules/bidphysicsBidAdapter.js b/modules/bidphysicsBidAdapter.js
deleted file mode 100644
index b6b5690ede5..00000000000
--- a/modules/bidphysicsBidAdapter.js
+++ /dev/null
@@ -1,134 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import * as utils from '../src/utils.js';
-import {BANNER} from '../src/mediaTypes.js';
-
-const ENDPOINT_URL = 'https://exchange.bidphysics.com/auction';
-
-const DEFAULT_BID_TTL = 30;
-const DEFAULT_CURRENCY = 'USD';
-const DEFAULT_NET_REVENUE = true;
-
-export const spec = {
- code: 'bidphysics',
- aliases: ['yieldlift'],
- supportedMediaTypes: [BANNER],
-
- isBidRequestValid: function (bid) {
- return (!!bid.params.unitId && typeof bid.params.unitId === 'string') ||
- (!!bid.params.networkId && typeof bid.params.networkId === 'string') ||
- (!!bid.params.publisherId && typeof bid.params.publisherId === 'string');
- },
-
- buildRequests: function (validBidRequests, bidderRequest) {
- if (!validBidRequests || !bidderRequest) {
- return;
- }
- const publisherId = validBidRequests[0].params.publisherId;
- const networkId = validBidRequests[0].params.networkId;
- const impressions = validBidRequests.map(bidRequest => ({
- id: bidRequest.bidId,
- banner: {
- format: bidRequest.sizes.map(sizeArr => ({
- w: sizeArr[0],
- h: sizeArr[1]
- }))
- },
- ext: {
- bidphysics: {
- unitId: bidRequest.params.unitId
- }
- }
- }));
-
- const openrtbRequest = {
- id: bidderRequest.auctionId,
- imp: impressions,
- site: {
- domain: window.location.hostname,
- page: window.location.href,
- ref: bidderRequest.refererInfo ? bidderRequest.refererInfo.referer || null : null
- },
- ext: {
- bidphysics: {
- publisherId: publisherId,
- networkId: networkId,
- }
- }
- };
-
- // apply gdpr
- if (bidderRequest.gdprConsent) {
- openrtbRequest.regs = {ext: {gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0}};
- openrtbRequest.user = {ext: {consent: bidderRequest.gdprConsent.consentString}};
- }
-
- const payloadString = JSON.stringify(openrtbRequest);
- return {
- method: 'POST',
- url: ENDPOINT_URL,
- data: payloadString,
- };
- },
-
- interpretResponse: function (serverResponse, request) {
- const bidResponses = [];
- const response = (serverResponse || {}).body;
- // response is always one seat (bidphysics) with (optional) bids for each impression
- if (response && response.seatbid && response.seatbid.length === 1 && response.seatbid[0].bid && response.seatbid[0].bid.length) {
- response.seatbid[0].bid.forEach(bid => {
- bidResponses.push({
- requestId: bid.impid,
- cpm: bid.price,
- width: bid.w,
- height: bid.h,
- ad: bid.adm,
- ttl: DEFAULT_BID_TTL,
- creativeId: bid.crid,
- netRevenue: DEFAULT_NET_REVENUE,
- currency: DEFAULT_CURRENCY,
- })
- })
- } else {
- utils.logInfo('bidphysics.interpretResponse :: no valid responses to interpret');
- }
- return bidResponses;
- },
- getUserSyncs: function (syncOptions, serverResponses) {
- utils.logInfo('bidphysics.getUserSyncs', 'syncOptions', syncOptions, 'serverResponses', serverResponses);
- let syncs = [];
-
- if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) {
- return syncs;
- }
-
- serverResponses.forEach(resp => {
- const userSync = utils.deepAccess(resp, 'body.ext.usersync');
- if (userSync) {
- let syncDetails = [];
- Object.keys(userSync).forEach(key => {
- const value = userSync[key];
- if (value.syncs && value.syncs.length) {
- syncDetails = syncDetails.concat(value.syncs);
- }
- });
- syncDetails.forEach(syncDetails => {
- syncs.push({
- type: syncDetails.type === 'iframe' ? 'iframe' : 'image',
- url: syncDetails.url
- });
- });
-
- if (!syncOptions.iframeEnabled) {
- syncs = syncs.filter(s => s.type !== 'iframe')
- }
- if (!syncOptions.pixelEnabled) {
- syncs = syncs.filter(s => s.type !== 'image')
- }
- }
- });
- utils.logInfo('bidphysics.getUserSyncs result=%o', syncs);
- return syncs;
- },
-
-};
-registerBidder(spec);
diff --git a/modules/decenteradsBidAdapter.js b/modules/bidscubeBidAdapter.js
similarity index 86%
rename from modules/decenteradsBidAdapter.js
rename to modules/bidscubeBidAdapter.js
index 823a59a3768..d3f27a5ac6d 100644
--- a/modules/decenteradsBidAdapter.js
+++ b/modules/bidscubeBidAdapter.js
@@ -2,16 +2,16 @@ import { registerBidder } from '../src/adapters/bidderFactory.js'
import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js'
import * as utils from '../src/utils.js'
-const BIDDER_CODE = 'decenterads'
-const URL = 'https://supply.decenterads.com/?c=o&m=multi'
-const URL_SYNC = 'https://supply.decenterads.com/?c=o&m=cookie'
+const BIDDER_CODE = 'bidscube'
+const URL = 'https://supply.bidscube.com/?c=o&m=multi'
+const URL_SYNC = 'https://supply.bidscube.com/?c=o&m=cookie'
export const spec = {
code: BIDDER_CODE,
supportedMediaTypes: [BANNER, VIDEO, NATIVE],
isBidRequestValid: function (opts) {
- return Boolean(opts.bidId && opts.params && !isNaN(opts.params.placementId))
+ return Boolean(opts.bidId && opts.params && !isNaN(parseInt(opts.params.placementId)))
},
buildRequests: function (validBidRequests) {
@@ -31,7 +31,8 @@ export const spec = {
placements.push({
placementId: p.params.placementId,
bidId: p.bidId,
- traffic: p.params.traffic || BANNER
+ traffic: p.params.traffic || BANNER,
+ allParams: JSON.stringify(p)
})
}
@@ -57,7 +58,6 @@ export const spec = {
for (let i = 0; i < body.length; i++) {
const item = body[i]
if (isBidResponseValid(item)) {
- delete item.mediaType
response.push(item)
}
}
diff --git a/modules/bidscubeBidAdapter.md b/modules/bidscubeBidAdapter.md
new file mode 100644
index 00000000000..5f3972726ec
--- /dev/null
+++ b/modules/bidscubeBidAdapter.md
@@ -0,0 +1,30 @@
+# Overview
+
+```
+Module Name: BidsCube Bidder Adapter
+Module Type: Bidder Adapter
+Maintainer: publishers@bidscube.com
+```
+
+# Description
+
+Module that connects to BidsCube' demand sources
+
+# Test Parameters
+```
+ var adUnits = [{
+ code: 'placementId_0',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]
+ }
+ },
+ bids: [{
+ bidder: 'bidscube',
+ params: {
+ placementId: 0,
+ traffic: 'banner'
+ }
+ }]
+ }];
+```
diff --git a/modules/bizzclickBidAdapter.js b/modules/bizzclickBidAdapter.js
index 2af9a7afed2..95c53b78de2 100644
--- a/modules/bizzclickBidAdapter.js
+++ b/modules/bizzclickBidAdapter.js
@@ -2,7 +2,6 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
import * as utils from '../src/utils.js';
import {config} from '../src/config.js';
-
const BIDDER_CODE = 'bizzclick';
const ACCOUNTID_MACROS = '[account_id]';
const URL_ENDPOINT = `https://us-e-node1.bizzclick.com/bid?rtb_seat_id=prebidjs&secret_key=${ACCOUNTID_MACROS}`;
@@ -39,11 +38,9 @@ const NATIVE_PARAMS = {
}
};
const NATIVE_VERSION = '1.2';
-
export const spec = {
code: BIDDER_CODE,
supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
/**
* Determines whether or not the given bid request is valid.
*
@@ -53,7 +50,6 @@ export const spec = {
isBidRequestValid: (bid) => {
return Boolean(bid.params.accountId) && Boolean(bid.params.placementId)
},
-
/**
* Make a server request from the list of BidRequests.
*
@@ -64,7 +60,6 @@ export const spec = {
if (validBidRequests && validBidRequests.length === 0) return []
let accuontId = validBidRequests[0].params.accountId;
const endpointURL = URL_ENDPOINT.replace(ACCOUNTID_MACROS, accuontId);
-
let winTop = window;
let location;
try {
@@ -74,7 +69,6 @@ export const spec = {
location = winTop.location;
utils.logMessage(e);
};
-
let bids = [];
for (let bidRequest of validBidRequests) {
let impObject = prepareImpObject(bidRequest);
@@ -103,9 +97,31 @@ export const spec = {
user: {
ext: {}
},
+ ext: {
+ ts: Date.now()
+ },
tmax: bidRequest.timeout,
imp: [impObject],
};
+
+ if (bidderRequest && bidderRequest.uspConsent) {
+ data.regs.ext.us_privacy = bidderRequest.uspConsent;
+ }
+
+ if (bidderRequest && bidderRequest.gdprConsent) {
+ let { gdprApplies, consentString } = bidderRequest.gdprConsent;
+ data.regs.ext.gdpr = gdprApplies ? 1 : 0;
+ data.user.ext.consent = consentString;
+ }
+
+ if (bidRequest.schain) {
+ data.source.ext.schain = bidRequest.schain;
+ }
+
+ let connection = navigator.connection || navigator.webkitConnection;
+ if (connection && connection.effectiveType) {
+ data.device.connectiontype = connection.effectiveType;
+ }
if (bidRequest) {
if (bidRequest.gdprConsent && bidRequest.gdprConsent.gdprApplies) {
utils.deepSetValue(data, 'regs.ext.gdpr', bidRequest.gdprConsent.gdprApplies ? 1 : 0);
@@ -124,7 +140,6 @@ export const spec = {
data: bids
};
},
-
/**
* Unpack the response from the server into a list of bids.
*
@@ -134,11 +149,9 @@ export const spec = {
interpretResponse: (serverResponse) => {
if (!serverResponse || !serverResponse.body) return []
let bizzclickResponse = serverResponse.body;
-
let bids = [];
for (let response of bizzclickResponse) {
let mediaType = response.seatbid[0].bid[0].ext && response.seatbid[0].bid[0].ext.mediaType ? response.seatbid[0].bid[0].ext.mediaType : BANNER;
-
let bid = {
requestId: response.id,
cpm: response.seatbid[0].bid[0].price,
@@ -152,6 +165,11 @@ export const spec = {
mediaType: mediaType
};
+ bid.meta = {};
+ if (response.seatbid[0].bid[0].adomain && response.seatbid[0].bid[0].adomain.length > 0) {
+ bid.meta.advertiserDomains = response.seatbid[0].bid[0].adomain;
+ }
+
switch (mediaType) {
case VIDEO:
bid.vastXml = response.seatbid[0].bid[0].adm
@@ -163,14 +181,11 @@ export const spec = {
default:
bid.ad = response.seatbid[0].bid[0].adm
}
-
bids.push(bid);
}
-
return bids;
},
};
-
/**
* Determine type of request
*
@@ -181,7 +196,6 @@ export const spec = {
const checkRequestType = (bidRequest, type) => {
return (typeof utils.deepAccess(bidRequest, `mediaTypes.${type}`) !== 'undefined');
}
-
const parseNative = admObject => {
const { assets, link, imptrackers, jstracker } = admObject.native;
const result = {
@@ -197,10 +211,8 @@ const parseNative = admObject => {
result[kind] = content.text || content.value || { url: content.url, width: content.w, height: content.h };
}
});
-
return result;
}
-
const prepareImpObject = (bidRequest) => {
let impObject = {
id: bidRequest.transactionId,
@@ -223,13 +235,11 @@ const prepareImpObject = (bidRequest) => {
}
return impObject
};
-
const addNativeParameters = bidRequest => {
let impObject = {
id: bidRequest.transactionId,
ver: NATIVE_VERSION,
};
-
const assets = utils._map(bidRequest.mediaTypes.native, (bidParams, key) => {
const props = NATIVE_PARAMS[key];
const asset = {
@@ -239,34 +249,27 @@ const addNativeParameters = bidRequest => {
asset.id = props.id;
let wmin, hmin;
let aRatios = bidParams.aspect_ratios;
-
if (aRatios && aRatios[0]) {
aRatios = aRatios[0];
wmin = aRatios.min_width || 0;
hmin = aRatios.ratio_height * wmin / aRatios.ratio_width | 0;
}
-
if (bidParams.sizes) {
const sizes = flatten(bidParams.sizes);
wmin = sizes[0];
hmin = sizes[1];
}
-
asset[props.name] = {}
-
if (bidParams.len) asset[props.name]['len'] = bidParams.len;
if (props.type) asset[props.name]['type'] = props.type;
if (wmin) asset[props.name]['wmin'] = wmin;
if (hmin) asset[props.name]['hmin'] = hmin;
-
return asset;
}
}).filter(Boolean);
-
impObject.assets = assets;
return impObject
}
-
const addBannerParameters = (bidRequest) => {
let bannerObject = {};
const size = parseSizes(bidRequest, 'banner');
@@ -274,7 +277,6 @@ const addBannerParameters = (bidRequest) => {
bannerObject.h = size[1];
return bannerObject;
};
-
const parseSizes = (bid, mediaType) => {
let mediaTypes = bid.mediaTypes;
if (mediaType === 'video') {
@@ -299,28 +301,22 @@ const parseSizes = (bid, mediaType) => {
} else {
utils.logWarn('no sizes are setup or found');
}
-
return sizes
}
-
const addVideoParameters = (bidRequest) => {
let videoObj = {};
let supportParamsList = ['mimes', 'minduration', 'maxduration', 'protocols', 'startdelay', 'placement', 'skip', 'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity']
-
for (let param of supportParamsList) {
if (bidRequest.mediaTypes.video[param] !== undefined) {
videoObj[param] = bidRequest.mediaTypes.video[param];
}
}
-
const size = parseSizes(bidRequest, 'video');
videoObj.w = size[0];
videoObj.h = size[1];
return videoObj;
}
-
const flatten = arr => {
return [].concat(...arr);
}
-
registerBidder(spec);
diff --git a/modules/bluebillywigBidAdapter.js b/modules/bluebillywigBidAdapter.js
index cac993b0f8c..3d4eeb058b3 100644
--- a/modules/bluebillywigBidAdapter.js
+++ b/modules/bluebillywigBidAdapter.js
@@ -8,7 +8,7 @@ import { createEidsArray } from './userId/eids.js';
const DEV_MODE = window.location.search.match(/bbpbs_debug=true/);
-// Blue Billywig Constants
+// Blue Billywig Constants
const BB_CONSTANTS = {
BIDDER_CODE: 'bluebillywig',
AUCTION_URL: '$$URL_STARTpbs.bluebillywig.com/openrtb2/auction?pub=$$PUBLICATION',
@@ -122,7 +122,8 @@ const BB_HELPERS = {
if (!bidObject.vastUrl && bid.nurl && !bid.adm) { // ad markup is on win notice url, and adm is ommited according to OpenRTB 2.5
bidObject.vastUrl = bid.nurl;
}
-
+ bidObject.meta = bid.meta || {};
+ if (bid.adomain) { bidObject.meta.advertiserDomains = bid.adomain; }
return bidObject;
},
};
diff --git a/modules/boldwinBidAdapter.js b/modules/boldwinBidAdapter.js
deleted file mode 100644
index 04f4085ba24..00000000000
--- a/modules/boldwinBidAdapter.js
+++ /dev/null
@@ -1,110 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'boldwin';
-const AD_URL = 'https://ssp.videowalldirect.com/?c=o&m=multi';
-const SYNC_URL = 'https://cs.videowalldirect.com/?c=o&m=cookie'
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId ||
- !bid.ttl || !bid.currency) {
- return false;
- }
- switch (bid.mediaType) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- return Boolean(bid.native && bid.native.title && bid.native.image && bid.native.impressionTrackers);
- default:
- return false;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(parseInt(bid.params.placementId)));
- },
-
- buildRequests: (validBidRequests = [], bidderRequest) => {
- let winTop = window;
- let location;
- try {
- location = new URL(bidderRequest.refererInfo.referer)
- winTop = window.top;
- } catch (e) {
- location = winTop.location;
- utils.logMessage(e);
- };
- let placements = [];
- let request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language.split('-')[0] : '',
- 'secure': 1,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
- if (bidderRequest) {
- if (bidderRequest.uspConsent) {
- request.ccpa = bidderRequest.uspConsent;
- }
- if (bidderRequest.gdprConsent) {
- request.gdpr = bidderRequest.gdprConsent
- }
- }
- const len = validBidRequests.length;
-
- for (let i = 0; i < len; i++) {
- let bid = validBidRequests[i];
- let sizes
- if (bid.mediaTypes) {
- if (bid.mediaTypes[BANNER] && bid.mediaTypes[BANNER].sizes) {
- sizes = bid.mediaTypes[BANNER].sizes
- } else if (bid.mediaTypes[VIDEO] && bid.mediaTypes[VIDEO].playerSize) {
- sizes = bid.mediaTypes[VIDEO].playerSize
- }
- }
- placements.push({
- placementId: bid.params.placementId,
- bidId: bid.bidId,
- sizes: sizes || [],
- wPlayer: sizes ? sizes[0] : 0,
- hPlayer: sizes ? sizes[1] : 0,
- traffic: bid.params.traffic || BANNER,
- schain: bid.schain || {}
- });
- }
- return {
- method: 'POST',
- url: AD_URL,
- data: request
- };
- },
-
- interpretResponse: (serverResponse) => {
- let response = [];
- for (let i = 0; i < serverResponse.body.length; i++) {
- let resItem = serverResponse.body[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- return response;
- },
-
- getUserSyncs: () => {
- return [{
- type: 'image',
- url: SYNC_URL
- }];
- }
-};
-
-registerBidder(spec);
diff --git a/modules/bridgewellBidAdapter.js b/modules/bridgewellBidAdapter.js
index 58c4e907328..2034a59242e 100644
--- a/modules/bridgewellBidAdapter.js
+++ b/modules/bridgewellBidAdapter.js
@@ -4,8 +4,8 @@ import { BANNER, NATIVE } from '../src/mediaTypes.js';
import find from 'core-js-pure/features/array/find.js';
const BIDDER_CODE = 'bridgewell';
-const REQUEST_ENDPOINT = 'https://prebid.scupio.com/recweb/prebid.aspx?cb=' + Math.random();
-const BIDDER_VERSION = '0.0.3';
+const REQUEST_ENDPOINT = 'https://prebid.scupio.com/recweb/prebid.aspx?cb=';
+const BIDDER_VERSION = '1.1.0';
export const spec = {
code: BIDDER_CODE,
@@ -37,7 +37,12 @@ export const spec = {
*/
buildRequests: function (validBidRequests, bidderRequest) {
const adUnits = [];
+ var bidderUrl = REQUEST_ENDPOINT + Math.random();
+ var userIds;
+
utils._each(validBidRequests, function (bid) {
+ userIds = bid.userId;
+
if (bid.params.cid) {
adUnits.push({
cid: bid.params.cid,
@@ -47,7 +52,8 @@ export const spec = {
banner: {
sizes: bid.sizes
}
- }
+ },
+ userIds: userIds || {}
});
} else {
adUnits.push({
@@ -58,7 +64,8 @@ export const spec = {
banner: {
sizes: bid.sizes
}
- }
+ },
+ userIds: userIds || {}
});
}
});
@@ -70,7 +77,7 @@ export const spec = {
return {
method: 'POST',
- url: REQUEST_ENDPOINT,
+ url: bidderUrl,
data: {
version: {
prebid: '$prebid.version$',
diff --git a/modules/brightMountainMediaBidAdapter.js b/modules/brightMountainMediaBidAdapter.js
index 531238c7400..51356098b58 100644
--- a/modules/brightMountainMediaBidAdapter.js
+++ b/modules/brightMountainMediaBidAdapter.js
@@ -42,9 +42,10 @@ export const spec = {
'deviceWidth': winTop.screen.width,
'deviceHeight': winTop.screen.height,
'language': (navigator && navigator.language) ? navigator.language : '',
- 'secure': 1,
+ 'secure': document.location.protocol === 'https:' ? 1 : 0,
'host': location.host,
- 'page': location.pathname,
+ 'page': location.href,
+ 'prebidVersion': '$prebid.version$',
'placements': placements
};
if (bidderRequest) {
@@ -59,6 +60,7 @@ export const spec = {
placementId: bid.params.placement_id,
bidId: bid.bidId,
floor: {},
+ userIds: {},
};
if (bid.mediaTypes.hasOwnProperty(BANNER)) {
@@ -108,6 +110,10 @@ export const spec = {
if (bid.schain) {
placement.schain = bid.schain;
}
+
+ if (bid.userIdAsEids) {
+ placement.userIds = { eids: bid.userIdAsEids };
+ }
placements.push(placement);
}
return {
diff --git a/modules/brightcomBidAdapter.js b/modules/brightcomBidAdapter.js
index 2aad211b186..8299a2331cb 100644
--- a/modules/brightcomBidAdapter.js
+++ b/modules/brightcomBidAdapter.js
@@ -46,7 +46,7 @@ function buildRequests(bidReqs, bidderRequest) {
},
tagid: String(bid.adUnitCode)
};
- const bidFloor = utils.getBidIdParameter('bidFloor', bid.params);
+ const bidFloor = _getBidFloor(bid);
if (bidFloor) {
imp.bidfloor = bidFloor;
}
@@ -122,7 +122,10 @@ function interpretResponse(serverResponse) {
netRevenue: true,
mediaType: BANNER,
ad: _getAdMarkup(brightcomBid),
- ttl: 60
+ ttl: 60,
+ meta: {
+ advertiserDomains: brightcomBid && brightcomBid.adomain ? brightcomBid.adomain : []
+ }
});
});
}
@@ -248,4 +251,20 @@ function _getPercentInView(element, topWin, { w, h } = {}) {
return 0;
}
+function _getBidFloor(bid) {
+ if (!utils.isFn(bid.getFloor)) {
+ return bid.params.bidFloor ? bid.params.bidFloor : null;
+ }
+
+ let floor = bid.getFloor({
+ currency: 'USD',
+ mediaType: '*',
+ size: '*'
+ });
+ if (utils.isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'USD') {
+ return floor.floor;
+ }
+ return null;
+}
+
registerBidder(spec);
diff --git a/modules/buzzoolaBidAdapter.js b/modules/buzzoolaBidAdapter.js
index f87607657c3..db4863f7503 100644
--- a/modules/buzzoolaBidAdapter.js
+++ b/modules/buzzoolaBidAdapter.js
@@ -1,6 +1,6 @@
import * as utils from '../src/utils.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
-import {BANNER, VIDEO} from '../src/mediaTypes.js';
+import {BANNER, VIDEO, NATIVE} from '../src/mediaTypes.js';
import {Renderer} from '../src/Renderer.js';
import {OUTSTREAM} from '../src/video.js';
@@ -11,7 +11,7 @@ const RENDERER_SRC = 'https://tube.buzzoola.com/new/build/buzzlibrary.js';
export const spec = {
code: BIDDER_CODE,
aliases: ['buzzoolaAdapter'],
- supportedMediaTypes: [BANNER, VIDEO],
+ supportedMediaTypes: [BANNER, VIDEO, NATIVE],
/**
* Determines whether or not the given bid request is valid.
@@ -21,7 +21,7 @@ export const spec = {
*/
isBidRequestValid: function (bid) {
let types = bid.mediaTypes;
- return !!(bid && bid.mediaTypes && (types.banner || types.video) && bid.params && bid.params.placementId);
+ return !!(bid && bid.mediaTypes && (types.banner || types.video || types.native) && bid.params && bid.params.placementId);
},
/**
diff --git a/modules/buzzoolaBidAdapter.md b/modules/buzzoolaBidAdapter.md
index aec3eda6c58..87f5262af4f 100644
--- a/modules/buzzoolaBidAdapter.md
+++ b/modules/buzzoolaBidAdapter.md
@@ -26,7 +26,7 @@ var adUnits = [
bids: [{
bidder: 'buzzoola',
params: {
- placementId: 417846
+ placementId: 417845
}
}]
},
@@ -45,7 +45,7 @@ var adUnits = [
bids: [{
bidder: 'buzzoola',
params: {
- placementId: 417845
+ placementId: 417846
}
}]
},
@@ -67,6 +67,44 @@ var adUnits = [
placementId: 417845
}
}]
+ },
+ // Native adUnit
+ {
+ code: '/21737252144/prebid_test_native',
+ mediaTypes: {
+ native: {
+ image: {
+ required: true,
+ sizes: [640, 134]
+ },
+ title: {
+ required: true,
+ len: 80
+ },
+ sponsoredBy: {
+ required: true
+ },
+ clickUrl: {
+ required: true
+ },
+ privacyLink: {
+ required: false
+ },
+ body: {
+ required: true
+ },
+ icon: {
+ required: true,
+ sizes: [50, 50]
+ }
+ }
+ },
+ bids: [{
+ bidder: 'buzzoola',
+ params: {
+ placementId: 417845
+ }
+ }]
}
];
```
diff --git a/modules/byplayBidAdapter.js b/modules/byplayBidAdapter.js
deleted file mode 100644
index 6133cdfa647..00000000000
--- a/modules/byplayBidAdapter.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import { config } from '../src/config.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { Renderer } from '../src/Renderer.js';
-import { VIDEO } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'byplay';
-const ENDPOINT_URL = 'https://prebid.byplay.net/bidder';
-const VIDEO_PLAYER_URL = 'https://cdn.byplay.net/prebid-byplay-v2.js';
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [VIDEO],
- isBidRequestValid: (bid) => {
- return !!bid.params.sectionId;
- },
- buildRequests: function(validBidRequests) {
- return validBidRequests.map(req => {
- const payload = {
- requestId: req.bidId,
- sectionId: req.params.sectionId,
- ...(req.params.env ? { env: req.params.env } : {})
- };
-
- return {
- method: 'POST',
- url: ENDPOINT_URL,
- data: JSON.stringify(payload),
- options: {
- withCredentials: false
- }
- };
- });
- },
- interpretResponse: (serverResponse, bidderRequest) => {
- const response = serverResponse.body;
- const data = JSON.parse(bidderRequest.data);
- const bidResponse = {
- requestId: data.requestId,
- cpm: response.cpm,
- width: response.width,
- height: response.height,
- creativeId: response.creativeId || '0',
- ttl: config.getConfig('_bidderTimeout'),
- currency: 'JPY',
- netRevenue: response.netRevenue,
- mediaType: VIDEO,
- vastXml: response.vastXml,
- renderer: createRenderer()
- };
-
- return [bidResponse];
- }
-};
-
-function createRenderer() {
- const renderer = Renderer.install({ url: VIDEO_PLAYER_URL });
-
- renderer.setRender(bid => {
- bid.renderer.push(() => {
- window.adtagRender(bid);
- });
- });
-
- return renderer;
-}
-
-registerBidder(spec);
diff --git a/modules/c1xBidAdapter.js b/modules/c1xBidAdapter.js
deleted file mode 100644
index 8e1f1487ba7..00000000000
--- a/modules/c1xBidAdapter.js
+++ /dev/null
@@ -1,178 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import * as utils from '../src/utils.js';
-import { userSync } from '../src/userSync.js';
-
-const BIDDER_CODE = 'c1x';
-const URL = 'https://ht.c1exchange.com/ht';
-const PIXEL_ENDPOINT = 'https://px.c1exchange.com/pubpixel/';
-const LOG_MSG = {
- invalidBid: 'C1X: [ERROR] bidder returns an invalid bid',
- noSite: 'C1X: [ERROR] no site id supplied',
- noBid: 'C1X: [INFO] creating a NO bid for Adunit: ',
- bidWin: 'C1X: [INFO] creating a bid for Adunit: '
-};
-
-/**
- * Adapter for requesting bids from C1X header tag server.
- * v3.1 (c) C1X Inc., 2018
- */
-
-export const c1xAdapter = {
- code: BIDDER_CODE,
-
- // check the bids sent to c1x bidder
- isBidRequestValid: function(bid) {
- const siteId = bid.params.siteId || '';
- if (!siteId) {
- utils.logError(LOG_MSG.noSite);
- }
- return !!(bid.adUnitCode && siteId);
- },
-
- buildRequests: function(bidRequests, bidderRequest) {
- let payload = {};
- let tagObj = {};
- let pixelUrl = '';
- const adunits = bidRequests.length;
- const rnd = new Date().getTime();
- const c1xTags = bidRequests.map(bidToTag);
- const bidIdTags = bidRequests.map(bidToShortTag); // include only adUnitCode and bidId from request obj
-
- // flattened tags in a tag object
- tagObj = c1xTags.reduce((current, next) => Object.assign(current, next));
- const pixelId = tagObj.pixelId;
-
- payload = {
- adunits: adunits.toString(),
- rnd: rnd.toString(),
- response: 'json',
- compress: 'gzip'
- }
-
- // for GDPR support
- if (bidderRequest && bidderRequest.gdprConsent) {
- payload['consent_string'] = bidderRequest.gdprConsent.consentString;
- payload['consent_required'] = (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') ? bidderRequest.gdprConsent.gdprApplies.toString() : 'true'
- ;
- }
-
- if (pixelId) {
- pixelUrl = PIXEL_ENDPOINT + pixelId;
- if (payload.consent_required) {
- pixelUrl += '&gdpr=' + (bidderRequest.gdprConsent.gdprApplies ? 1 : 0);
- pixelUrl += '&consent=' + encodeURIComponent(bidderRequest.gdprConsent.consentString || '');
- }
- userSync.registerSync('image', BIDDER_CODE, pixelUrl);
- }
-
- Object.assign(payload, tagObj);
-
- let payloadString = stringifyPayload(payload);
- // ServerRequest object
- return {
- method: 'GET',
- url: URL,
- data: payloadString,
- bids: bidIdTags
- };
- },
-
- interpretResponse: function(serverResponse, requests) {
- serverResponse = serverResponse.body;
- requests = requests.bids || [];
- const currency = 'USD';
- const bidResponses = [];
- let netRevenue = false;
-
- if (!serverResponse || serverResponse.error) {
- let errorMessage = serverResponse.error;
- utils.logError(LOG_MSG.invalidBid + errorMessage);
- return bidResponses;
- } else {
- serverResponse.forEach(bid => {
- if (bid.bid) {
- if (bid.bidType === 'NET_BID') {
- netRevenue = !netRevenue;
- }
- const curBid = {
- width: bid.width,
- height: bid.height,
- cpm: bid.cpm,
- ad: bid.ad,
- creativeId: bid.crid,
- currency: currency,
- ttl: 300,
- netRevenue: netRevenue
- };
-
- for (let i = 0; i < requests.length; i++) {
- if (bid.adId === requests[i].adUnitCode) {
- curBid.requestId = requests[i].bidId;
- }
- }
- utils.logInfo(LOG_MSG.bidWin + bid.adId + ' size: ' + curBid.width + 'x' + curBid.height);
- bidResponses.push(curBid);
- } else {
- // no bid
- utils.logInfo(LOG_MSG.noBid + bid.adId);
- }
- });
- }
-
- return bidResponses;
- }
-}
-
-function bidToTag(bid, index) {
- const tag = {};
- const adIndex = 'a' + (index + 1).toString(); // ad unit id for c1x
- const sizeKey = adIndex + 's';
- const priceKey = adIndex + 'p';
- // TODO: Multiple Floor Prices
-
- const sizesArr = bid.sizes;
- const floorPriceMap = bid.params.floorPriceMap || '';
- tag['site'] = bid.params.siteId || '';
-
- // prevent pixelId becoming undefined when publishers don't fill this param in ad units they have on the same page
- if (bid.params.pixelId) {
- tag['pixelId'] = bid.params.pixelId
- }
-
- tag[adIndex] = bid.adUnitCode;
- tag[sizeKey] = sizesArr.reduce((prev, current) => prev + (prev === '' ? '' : ',') + current.join('x'), '');
-
- const newSizeArr = tag[sizeKey].split(',');
- if (floorPriceMap) {
- newSizeArr.forEach(size => {
- if (size in floorPriceMap) {
- tag[priceKey] = floorPriceMap[size].toString();
- } // we only accept one cpm price in floorPriceMap
- });
- }
- if (bid.params.pageurl) {
- tag['pageurl'] = bid.params.pageurl;
- }
-
- return tag;
-}
-
-function bidToShortTag(bid) {
- const tag = {};
- tag.adUnitCode = bid.adUnitCode;
- tag.bidId = bid.bidId;
-
- return tag;
-}
-
-function stringifyPayload(payload) {
- let payloadString = '';
- payloadString = JSON.stringify(payload).replace(/":"|","|{"|"}/g, (foundChar) => {
- if (foundChar == '":"') return '=';
- else if (foundChar == '","') return '&';
- else return '';
- });
- return payloadString;
-}
-
-registerBidder(c1xAdapter);
diff --git a/modules/cedatoBidAdapter.js b/modules/cedatoBidAdapter.js
deleted file mode 100644
index ab381698f01..00000000000
--- a/modules/cedatoBidAdapter.js
+++ /dev/null
@@ -1,229 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-import { getStorageManager } from '../src/storageManager.js';
-
-const storage = getStorageManager();
-
-const BIDDER_CODE = 'cedato';
-const BID_URL = 'https://h.cedatoplayer.com/hb';
-const SYNC_URL = 'https://h.cedatoplayer.com/hb_usync';
-const TTL = 10000;
-const CURRENCY = 'USD';
-const NET_REVENUE = true;
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO],
-
- isBidRequestValid: function(bid) {
- return !!(
- bid &&
- bid.params &&
- bid.params.player_id &&
- utils.checkCookieSupport() &&
- storage.cookiesAreEnabled()
- );
- },
-
- buildRequests: function(bidRequests, bidderRequest) {
- const site = { domain: document.domain };
- const device = { ua: navigator.userAgent, w: screen.width, h: screen.height };
- const currency = CURRENCY;
- const tmax = bidderRequest.timeout;
- const auctionId = bidderRequest.auctionId;
- const auctionStart = bidderRequest.auctionStart;
- const bidderRequestId = bidderRequest.bidderRequestId;
-
- const imp = bidRequests.map(req => {
- const banner = getMediaType(req, 'banner');
- const video = getMediaType(req, 'video');
- const params = req.params;
- const bidId = req.bidId;
- const adUnitCode = req.adUnitCode;
- const bidRequestsCount = req.bidRequestsCount;
- const bidderWinsCount = req.bidderWinsCount;
- const transactionId = req.transactionId;
-
- return {
- bidId,
- banner,
- video,
- adUnitCode,
- bidRequestsCount,
- bidderWinsCount,
- transactionId,
- params
- };
- });
-
- const payload = {
- version: '$prebid.version$',
- site,
- device,
- imp,
- currency,
- tmax,
- auctionId,
- auctionStart,
- bidderRequestId
- };
-
- if (bidderRequest) {
- payload.referer_info = bidderRequest.refererInfo;
- payload.us_privacy = bidderRequest.uspConsent;
-
- if (bidderRequest.gdprConsent) {
- payload.gdpr_consent = {
- consent_string: bidderRequest.gdprConsent.consentString,
- consent_required: bidderRequest.gdprConsent.gdprApplies
- };
- }
- }
-
- return formatRequest(payload, bidderRequest);
- },
-
- interpretResponse: function(resp, {bidderRequest}) {
- resp = resp.body;
- const bids = [];
-
- if (!resp) {
- return bids;
- }
-
- resp.seatbid[0].bid.map(serverBid => {
- const bid = newBid(serverBid, bidderRequest);
- bid.currency = resp.cur;
- bids.push(bid);
- });
-
- return bids;
- },
-
- getUserSyncs: function(syncOptions, resps, gdprConsent, uspConsent) {
- const syncs = [];
- if (syncOptions.iframeEnabled) {
- syncs.push(getSync('iframe', gdprConsent, uspConsent));
- } else if (syncOptions.pixelEnabled) {
- syncs.push(getSync('image', gdprConsent, uspConsent));
- }
- return syncs;
- }
-}
-
-function getMediaType(req, type) {
- const { mediaTypes } = req;
-
- if (!mediaTypes) {
- return;
- }
-
- switch (type) {
- case 'banner':
- if (mediaTypes.banner) {
- const { sizes } = mediaTypes.banner;
- return {
- format: getFormats(sizes)
- };
- }
- break;
-
- case 'video':
- if (mediaTypes.video) {
- const { playerSize, context } = mediaTypes.video;
- return {
- context: context,
- format: getFormats(playerSize)
- };
- }
- }
-}
-
-function newBid(serverBid, bidderRequest) {
- const bidRequest = utils.getBidRequest(serverBid.uuid, [bidderRequest]);
-
- const cpm = serverBid.price;
- const requestId = serverBid.uuid;
- const width = serverBid.w;
- const height = serverBid.h;
- const creativeId = serverBid.crid;
- const dealId = serverBid.dealid;
- const mediaType = serverBid.media_type;
- const netRevenue = NET_REVENUE;
- const ttl = TTL;
-
- const bid = {
- cpm,
- requestId,
- width,
- height,
- mediaType,
- creativeId,
- dealId,
- netRevenue,
- ttl,
- };
-
- if (mediaType == 'video') {
- const videoContext = utils.deepAccess(bidRequest, 'mediaTypes.video.context');
-
- if (videoContext == 'instream') {
- bid.vastUrl = serverBid.vast_url;
- bid.vastImpUrl = serverBid.notify_url;
- }
- } else {
- bid.ad = serverBid.adm;
- }
-
- return bid;
-}
-
-function formatRequest(payload, bidderRequest) {
- const payloadByUrl = {};
- const requests = [];
-
- payload.imp.forEach(imp => {
- const url = imp.params.bid_url || BID_URL;
- if (!payloadByUrl[url]) {
- payloadByUrl[url] = {
- ...payload,
- imp: []
- };
- }
- payloadByUrl[url].imp.push(imp);
- });
-
- for (const url in payloadByUrl) {
- requests.push({
- url,
- method: 'POST',
- data: JSON.stringify(payloadByUrl[url]),
- bidderRequest
- });
- }
-
- return requests;
-}
-
-const getSync = (type, gdprConsent, uspConsent = '') => {
- const syncUrl = SYNC_URL;
- let params = '?type=' + type + '&us_privacy=' + uspConsent;
- if (gdprConsent && typeof gdprConsent.consentString === 'string') {
- if (typeof gdprConsent.gdprApplies === 'boolean') {
- params += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
- } else {
- params += `&gdpr_consent=${gdprConsent.consentString}`;
- }
- }
- return {
- type: type,
- url: syncUrl + params,
- };
-}
-
-const getFormats = arr => arr.map((s) => {
- return { w: s[0], h: s[1] };
-});
-
-registerBidder(spec);
diff --git a/modules/cleanmedianetBidAdapter.js b/modules/cleanmedianetBidAdapter.js
index 80e4f13e7d4..7b36117d404 100644
--- a/modules/cleanmedianetBidAdapter.js
+++ b/modules/cleanmedianetBidAdapter.js
@@ -113,7 +113,7 @@ export const spec = {
id: transactionId,
instl: params.instl === 1 ? 1 : 0,
tagid: adUnitCode,
- bidfloor: params.bidfloor || 0,
+ bidfloor: 0,
bidfloorcur: 'USD',
secure: 1
};
diff --git a/modules/clickforceBidAdapter.js b/modules/clickforceBidAdapter.js
index 20408fe9177..2e758c509f7 100644
--- a/modules/clickforceBidAdapter.js
+++ b/modules/clickforceBidAdapter.js
@@ -88,6 +88,9 @@ export const spec = {
impressionTrackers: response.tag.iu,
},
mediaType: 'native',
+ meta: {
+ advertiserDomains: response.adomain || []
+ },
});
} else {
// display ad
@@ -102,6 +105,9 @@ export const spec = {
ttl: response.ttl,
ad: response.tag,
mediaType: 'banner',
+ meta: {
+ advertiserDomains: response.adomain || []
+ },
});
}
}
diff --git a/modules/clicktripzBidAdapter.js b/modules/clicktripzBidAdapter.js
deleted file mode 100644
index 2149cbe4527..00000000000
--- a/modules/clicktripzBidAdapter.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import {logError, _each} from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'clicktripz';
-const ENDPOINT_URL = 'https://www.clicktripz.com/x/prebid/v1';
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['ctz'], // short code
-
- isBidRequestValid: function (bid) {
- if (bid && bid.params && bid.params.placementId && bid.params.siteId) {
- return true;
- }
-
- return false;
- },
-
- buildRequests: function (validBidRequests) {
- let bidRequests = [];
-
- _each(validBidRequests, function (bid) {
- bidRequests.push({
- bidId: bid.bidId,
- placementId: bid.params.placementId,
- siteId: bid.params.siteId,
- sizes: bid.sizes.map(function (size) {
- return size.join('x')
- })
- });
- });
- return {
- method: 'POST',
- url: ENDPOINT_URL,
- data: bidRequests
- };
- },
-
- interpretResponse: function (serverResponse) {
- let bidResponses = [];
-
- if (serverResponse && serverResponse.body) {
- _each(serverResponse.body, function (bid) {
- if (bid.errors) {
- logError(bid.errors);
- return;
- }
-
- const size = bid.size.split('x');
- bidResponses.push({
- requestId: bid.bidId,
- cpm: bid.cpm,
- width: size[0],
- height: size[1],
- creativeId: bid.creativeId,
- currency: bid.currency,
- netRevenue: bid.netRevenue,
- ttl: bid.ttl,
- adUrl: bid.adUrl
- });
- });
- }
- return bidResponses;
- }
-};
-
-registerBidder(spec);
diff --git a/modules/coinzillaBidAdapter.js b/modules/coinzillaBidAdapter.js
index 240a3f1fcde..e1c2b7d01b2 100644
--- a/modules/coinzillaBidAdapter.js
+++ b/modules/coinzillaBidAdapter.js
@@ -79,7 +79,11 @@ export const spec = {
netRevenue: netRevenue,
ttl: config.getConfig('_bidderTimeout'),
referrer: referrer,
- ad: response.ad
+ ad: response.ad,
+ mediaType: response.mediaType,
+ meta: {
+ advertiserDomains: response.advertiserDomain || []
+ }
};
bidResponses.push(bidResponse);
}
diff --git a/modules/collectcentBidAdapter.js b/modules/collectcentBidAdapter.js
deleted file mode 100644
index add3e06430d..00000000000
--- a/modules/collectcentBidAdapter.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'collectcent';
-const URL_MULTI = 'https://publishers.motionspots.com/?c=o&m=multi';
-const URL_SYNC = 'https://publishers.motionspots.com/?c=o&m=cookie';
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
- /**
- * Determines whether or not the given bid request is valid.
- *
- * @param {object} bid The bid to validate.
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId &&
- bid.params &&
- !isNaN(bid.params.placementId) &&
- spec.supportedMediaTypes.indexOf(bid.params.traffic) !== -1
- );
- },
-
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the Server.
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: (validBidRequests, bidderRequest) => {
- let winTop;
- try {
- winTop = window.top;
- } catch (e) {
- utils.logMessage(e);
- winTop = window;
- };
-
- const placements = [];
- const location = bidderRequest ? new URL(bidderRequest.refererInfo.referer) : winTop.location;
- const request = {
- 'secure': (location.protocol === 'https:') ? 1 : 0,
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
-
- for (let i = 0; i < validBidRequests.length; i++) {
- const bid = validBidRequests[i];
- const params = bid.params;
- placements.push({
- placementId: params.placementId,
- bidId: bid.bidId,
- sizes: bid.sizes,
- traffic: params.traffic
- });
- }
- return {
- method: 'POST',
- url: URL_MULTI,
- data: request
- };
- },
-
- /**
- * 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: (serverResponse) => {
- try {
- serverResponse = serverResponse.body;
- } catch (e) {
- utils.logMessage(e);
- };
- return serverResponse;
- },
-
- getUserSyncs: () => {
- return [{
- type: 'image',
- url: URL_SYNC
- }];
- }
-};
-
-registerBidder(spec);
diff --git a/modules/colombiaBidAdapter.js b/modules/colombiaBidAdapter.js
deleted file mode 100644
index 55109dbaab2..00000000000
--- a/modules/colombiaBidAdapter.js
+++ /dev/null
@@ -1,82 +0,0 @@
-import * as utils from '../src/utils.js';
-import {config} from '../src/config.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { BANNER } from '../src/mediaTypes.js';
-const BIDDER_CODE = 'colombia';
-const ENDPOINT_URL = 'https://ade.clmbtech.com/cde/prebid.htm';
-const HOST_NAME = document.location.protocol + '//' + window.location.host;
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['clmb'],
- supportedMediaTypes: [BANNER],
- isBidRequestValid: function(bid) {
- return !!(bid.params.placementId);
- },
- buildRequests: function(validBidRequests, bidderRequest) {
- return validBidRequests.map(bidRequest => {
- const params = bidRequest.params;
- const sizes = utils.parseSizesInput(bidRequest.sizes)[0];
- const width = sizes.split('x')[0];
- const height = sizes.split('x')[1];
- const placementId = params.placementId;
- const cb = Math.floor(Math.random() * 99999999999);
- const bidId = bidRequest.bidId;
- const referrer = (bidderRequest && bidderRequest.refererInfo) ? bidderRequest.refererInfo.referer : '';
- const payload = {
- v: 'hb1',
- p: placementId,
- w: width,
- h: height,
- cb: cb,
- r: referrer,
- uid: bidId,
- t: 'i',
- d: HOST_NAME,
- };
- return {
- method: 'POST',
- url: ENDPOINT_URL,
- data: payload,
- }
- });
- },
- interpretResponse: function(serverResponse, bidRequest) {
- const bidResponses = [];
- const response = serverResponse.body;
- const crid = response.creativeId || 0;
- const width = response.width || 0;
- const height = response.height || 0;
- let cpm = response.cpm || 0;
- if (width == 300 && height == 250) {
- cpm = cpm * 0.2;
- }
- if (width == 320 && height == 50) {
- cpm = cpm * 0.55;
- }
- if (cpm <= 0) {
- return bidResponses;
- }
- if (width !== 0 && height !== 0 && cpm !== 0 && crid !== 0) {
- const dealId = response.dealid || '';
- const currency = response.currency || 'USD';
- const netRevenue = (response.netRevenue === undefined) ? true : response.netRevenue;
- const bidResponse = {
- requestId: bidRequest.data.uid,
- cpm: cpm,
- width: response.width,
- height: response.height,
- creativeId: crid,
- dealId: dealId,
- currency: currency,
- netRevenue: netRevenue,
- ttl: config.getConfig('_bidderTimeout'),
- referrer: bidRequest.data.r,
- ad: response.ad
- };
- bidResponses.push(bidResponse);
- }
- return bidResponses;
- }
-}
-registerBidder(spec);
diff --git a/modules/colossussspBidAdapter.js b/modules/colossussspBidAdapter.js
deleted file mode 100644
index 1afb343566d..00000000000
--- a/modules/colossussspBidAdapter.js
+++ /dev/null
@@ -1,156 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'colossusssp';
-const G_URL = 'https://colossusssp.com/?c=o&m=multi';
-const G_URL_SYNC = 'https://colossusssp.com/?c=o&m=cookie';
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency) {
- return false;
- }
-
- switch (bid.mediaType) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- return Boolean(bid.native);
- default:
- return false;
- }
-}
-
-function getUserId(eids, id, source, uidExt) {
- if (id) {
- var uid = { id };
- if (uidExt) {
- uid.ext = uidExt;
- }
- eids.push({
- source,
- uids: [ uid ]
- });
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
- /**
- * Determines whether or not the given bid request is valid.
- *
- * @param {object} bid The bid to validate.
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(bid.params.placement_id));
- },
-
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the Server.
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: (validBidRequests, bidderRequest) => {
- const winTop = utils.getWindowTop();
- const location = winTop.location;
- let placements = [];
- let request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language : '',
- 'secure': location.protocol === 'https:' ? 1 : 0,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements,
- };
-
- if (bidderRequest) {
- if (bidderRequest.uspConsent) {
- request.ccpa = bidderRequest.uspConsent;
- }
- if (bidderRequest.gdprConsent) {
- request.gdpr_consent = bidderRequest.gdprConsent.consentString || 'ALL'
- request.gdpr_require = bidderRequest.gdprConsent.gdprApplies ? 1 : 0
- }
- }
-
- for (let i = 0; i < validBidRequests.length; i++) {
- let bid = validBidRequests[i];
- let traff = bid.params.traffic || BANNER
- let placement = {
- placementId: bid.params.placement_id,
- bidId: bid.bidId,
- sizes: bid.mediaTypes[traff].sizes,
- traffic: traff,
- eids: [],
- floor: {}
- };
- if (typeof bid.getFloor === 'function') {
- let tmpFloor = {};
- for (let size of placement.sizes) {
- tmpFloor = bid.getFloor({
- currency: 'USD',
- mediaType: traff,
- size: size
- });
- if (tmpFloor) {
- placement.floor[`${size[0]}x${size[1]}`] = tmpFloor.floor;
- }
- }
- }
- if (bid.schain) {
- placement.schain = bid.schain;
- }
- if (bid.userId) {
- getUserId(placement.eids, bid.userId.britepoolid, 'britepool.com');
- getUserId(placement.eids, bid.userId.idl_env, 'identityLink');
- getUserId(placement.eids, bid.userId.id5id, 'id5-sync.com')
- getUserId(placement.eids, bid.userId.tdid, 'adserver.org', {
- rtiPartner: 'TDID'
- });
- }
- placements.push(placement);
- }
- return {
- method: 'POST',
- url: G_URL,
- data: request
- };
- },
-
- /**
- * 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: (serverResponse) => {
- let response = [];
- try {
- serverResponse = serverResponse.body;
- for (let i = 0; i < serverResponse.length; i++) {
- let resItem = serverResponse[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- } catch (e) {
- utils.logMessage(e);
- };
- return response;
- },
-
- getUserSyncs: () => {
- return [{
- type: 'image',
- url: G_URL_SYNC
- }];
- }
-};
-
-registerBidder(spec);
diff --git a/modules/consumableBidAdapter.js b/modules/consumableBidAdapter.js
index 8eb56f7d0c2..92e2192b925 100644
--- a/modules/consumableBidAdapter.js
+++ b/modules/consumableBidAdapter.js
@@ -122,6 +122,7 @@ export const spec = {
bid.currency = 'USD';
bid.creativeId = decision.adId;
bid.ttl = 30;
+ bid.meta = { advertiserDomains: decision.adomain ? decision.adomain : [] }
bid.netRevenue = true;
bid.referrer = bidRequest.bidderRequest.refererInfo.referer;
diff --git a/modules/convergeBidAdapter.js b/modules/convergeBidAdapter.js
deleted file mode 100644
index bea3b6cb1ab..00000000000
--- a/modules/convergeBidAdapter.js
+++ /dev/null
@@ -1,313 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { Renderer } from '../src/Renderer.js';
-import { VIDEO, BANNER } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'converge';
-const ENDPOINT_URL = 'https://tech.convergd.com/hb';
-const TIME_TO_LIVE = 360;
-const SYNC_URL = 'https://tech.convergd.com/push_sync';
-const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';
-
-let hasSynced = false;
-
-const LOG_ERROR_MESS = {
- noAuid: 'Bid from response has no auid parameter - ',
- noAdm: 'Bid from response has no adm parameter - ',
- noBid: 'Array of bid objects is empty',
- noPlacementCode: "Can't find in requested bids the bid with auid - ",
- emptyUids: 'Uids should be not empty',
- emptySeatbid: 'Seatbid array from response has empty item',
- emptyResponse: 'Response is empty',
- hasEmptySeatbidArray: 'Response has empty seatbid array',
- hasNoArrayOfBids: 'Seatbid from response has no array of bid objects - '
-};
-export const spec = {
- code: BIDDER_CODE,
- 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: function(bid) {
- return !!bid.params.uid;
- },
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} validBidRequests - an array of bids
- * @param {bidderRequest} bidderRequest - bidder request object
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: function(validBidRequests, bidderRequest) {
- const auids = [];
- const bidsMap = {};
- const slotsMapByUid = {};
- const sizeMap = {};
- const bids = validBidRequests || [];
- let priceType = 'net';
- let pageKeywords;
- let reqId;
-
- bids.forEach(bid => {
- if (bid.params.priceType === 'gross') {
- priceType = 'gross';
- }
- reqId = bid.bidderRequestId;
- const {params: {uid}, adUnitCode} = bid;
- auids.push(uid);
- const sizesId = utils.parseSizesInput(bid.sizes);
-
- if (!pageKeywords && !utils.isEmpty(bid.params.keywords)) {
- const keywords = utils.transformBidderParamKeywords(bid.params.keywords);
-
- if (keywords.length > 0) {
- keywords.forEach(deleteValues);
- }
- pageKeywords = keywords;
- }
-
- if (!slotsMapByUid[uid]) {
- slotsMapByUid[uid] = {};
- }
- const slotsMap = slotsMapByUid[uid];
- if (!slotsMap[adUnitCode]) {
- slotsMap[adUnitCode] = {adUnitCode, bids: [bid], parents: []};
- } else {
- slotsMap[adUnitCode].bids.push(bid);
- }
- const slot = slotsMap[adUnitCode];
-
- sizesId.forEach((sizeId) => {
- sizeMap[sizeId] = true;
- if (!bidsMap[uid]) {
- bidsMap[uid] = {};
- }
-
- if (!bidsMap[uid][sizeId]) {
- bidsMap[uid][sizeId] = [slot];
- } else {
- bidsMap[uid][sizeId].push(slot);
- }
- slot.parents.push({parent: bidsMap[uid], key: sizeId, uid});
- });
- });
-
- const payload = {
- pt: priceType,
- auids: auids.join(','),
- sizes: utils.getKeys(sizeMap).join(','),
- r: reqId,
- wrapperType: 'Prebid_js',
- wrapperVersion: '$prebid.version$'
- };
-
- if (pageKeywords) {
- payload.keywords = JSON.stringify(pageKeywords);
- }
-
- if (bidderRequest) {
- if (bidderRequest.refererInfo && bidderRequest.refererInfo.referer) {
- payload.u = bidderRequest.refererInfo.referer;
- }
- if (bidderRequest.timeout) {
- payload.wtimeout = bidderRequest.timeout;
- }
- if (bidderRequest.gdprConsent) {
- if (bidderRequest.gdprConsent.consentString) {
- payload.gdpr_consent = bidderRequest.gdprConsent.consentString;
- }
- payload.gdpr_applies =
- (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean')
- ? Number(bidderRequest.gdprConsent.gdprApplies) : 1;
- }
- if (bidderRequest.uspConsent) {
- payload.us_privacy = bidderRequest.uspConsent;
- }
- }
-
- return {
- method: 'GET',
- url: ENDPOINT_URL,
- data: utils.parseQueryStringParameters(payload).replace(/\&$/, ''),
- bidsMap: bidsMap,
- };
- },
- /**
- * Unpack the response from the server into a list of bids.
- *
- * @param {*} serverResponse A successful response from the server.
- * @param {*} bidRequest
- * @param {Renderer} RendererConst
- * @return {Bid[]} An array of bids which were nested inside the server.
- */
- interpretResponse: function(serverResponse, bidRequest, RendererConst = Renderer) {
- serverResponse = serverResponse && serverResponse.body;
- const bidResponses = [];
- const bidsMap = bidRequest.bidsMap;
- const priceType = bidRequest.data.pt;
-
- let errorMessage;
-
- if (!serverResponse) errorMessage = LOG_ERROR_MESS.emptyResponse;
- else if (serverResponse.seatbid && !serverResponse.seatbid.length) {
- errorMessage = LOG_ERROR_MESS.hasEmptySeatbidArray;
- }
-
- if (!errorMessage && serverResponse.seatbid) {
- serverResponse.seatbid.forEach(respItem => {
- _addBidResponse(_getBidFromResponse(respItem), bidsMap, priceType, bidResponses, RendererConst);
- });
- }
- if (errorMessage) utils.logError(errorMessage);
- return bidResponses;
- },
- getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) {
- if (!hasSynced && syncOptions.pixelEnabled) {
- let params = '';
-
- if (gdprConsent && typeof gdprConsent.consentString === 'string') {
- if (typeof gdprConsent.gdprApplies === 'boolean') {
- params += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
- } else {
- params += `&gdpr_consent=${gdprConsent.consentString}`;
- }
- }
- if (uspConsent) {
- params += `&us_privacy=${uspConsent}`;
- }
-
- hasSynced = true;
- return {
- type: 'image',
- url: SYNC_URL + params
- };
- }
- }
-};
-
-function isPopulatedArray(arr) {
- return !!(utils.isArray(arr) && arr.length > 0);
-}
-
-function deleteValues(keyPairObj) {
- if (isPopulatedArray(keyPairObj.value) && keyPairObj.value[0] === '') {
- delete keyPairObj.value;
- }
-}
-
-function _getBidFromResponse(respItem) {
- if (!respItem) {
- utils.logError(LOG_ERROR_MESS.emptySeatbid);
- } else if (!respItem.bid) {
- utils.logError(LOG_ERROR_MESS.hasNoArrayOfBids + JSON.stringify(respItem));
- } else if (!respItem.bid[0]) {
- utils.logError(LOG_ERROR_MESS.noBid);
- }
- return respItem && respItem.bid && respItem.bid[0];
-}
-
-function _addBidResponse(serverBid, bidsMap, priceType, bidResponses, RendererConst) {
- if (!serverBid) return;
- let errorMessage;
- if (!serverBid.auid) errorMessage = LOG_ERROR_MESS.noAuid + JSON.stringify(serverBid);
- if (!serverBid.adm) errorMessage = LOG_ERROR_MESS.noAdm + JSON.stringify(serverBid);
- else {
- const awaitingBids = bidsMap[serverBid.auid];
- if (awaitingBids) {
- const sizeId = `${serverBid.w}x${serverBid.h}`;
- if (awaitingBids[sizeId]) {
- const slot = awaitingBids[sizeId][0];
-
- const bid = slot.bids.shift();
- const bidResponse = {
- requestId: bid.bidId, // bid.bidderRequestId,
- bidderCode: spec.code,
- cpm: serverBid.price,
- width: serverBid.w,
- height: serverBid.h,
- creativeId: serverBid.auid, // bid.bidId,
- currency: 'EUR',
- netRevenue: priceType !== 'gross',
- ttl: TIME_TO_LIVE,
- dealId: serverBid.dealid
- };
- if (serverBid.content_type === 'video' || (!serverBid.content_type && bid.mediaTypes && bid.mediaTypes.video)) {
- bidResponse.vastXml = serverBid.adm;
- bidResponse.mediaType = VIDEO;
- bidResponse.adResponse = {
- content: bidResponse.vastXml
- };
- if (!bid.renderer && (!bid.mediaTypes || !bid.mediaTypes.video || bid.mediaTypes.video.context === 'outstream')) {
- bidResponse.renderer = createRenderer(bidResponse, {
- id: bid.bidId,
- url: RENDERER_URL
- }, RendererConst);
- }
- } else {
- bidResponse.ad = serverBid.adm;
- bidResponse.mediaType = BANNER;
- }
-
- bidResponses.push(bidResponse);
-
- if (!slot.bids.length) {
- slot.parents.forEach(({parent, key, uid}) => {
- const index = parent[key].indexOf(slot);
- if (index > -1) {
- parent[key].splice(index, 1);
- }
- if (!parent[key].length) {
- delete parent[key];
- if (!utils.getKeys(parent).length) {
- delete bidsMap[uid];
- }
- }
- });
- }
- }
- } else {
- errorMessage = LOG_ERROR_MESS.noPlacementCode + serverBid.auid;
- }
- }
- if (errorMessage) {
- utils.logError(errorMessage);
- }
-}
-
-function outstreamRender (bid) {
- bid.renderer.push(() => {
- window.ANOutstreamVideo.renderAd({
- targetId: bid.adUnitCode,
- adResponse: bid.adResponse
- });
- });
-}
-
-function createRenderer (bid, rendererParams, RendererConst) {
- const rendererInst = RendererConst.install({
- id: rendererParams.id,
- url: rendererParams.url,
- loaded: false
- });
-
- try {
- rendererInst.setRender(outstreamRender);
- } catch (err) {
- utils.logWarn('Prebid Error calling setRender on renderer', err);
- }
-
- return rendererInst;
-}
-
-export function resetUserSync() {
- hasSynced = false;
-}
-
-export function getSyncUrl() {
- return SYNC_URL;
-}
-
-registerBidder(spec);
diff --git a/modules/convergeBidAdapter.md b/modules/convergeBidAdapter.md
deleted file mode 100644
index ab916a8b3b6..00000000000
--- a/modules/convergeBidAdapter.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# Overview
-
-Module Name: Converge Bidder Adapter
-Module Type: Bidder Adapter
-Maintainer: support@converge-digital.com
-
-# Description
-
-Module that connects to Converge demand source to fetch bids.
-Converge Bid Adapter supports Banner and Video (instream and outstream).
-
-# Test Parameters
-```
- var adUnits = [
- {
- code: 'test-div',
- sizes: [[300, 250]],
- bids: [
- {
- bidder: "converge",
- params: {
- uid: '59',
- priceType: 'gross' // by default is 'net'
- }
- }
- ]
- },{
- code: 'test-div',
- sizes: [[728, 90]],
- bids: [
- {
- bidder: "converge",
- params: {
- uid: 1,
- priceType: 'gross',
- keywords: {
- brandsafety: ['disaster'],
- topic: ['stress', 'fear']
- }
- }
- }
- ]
- },{
- code: 'test-div',
- sizes: [[640, 360]],
- mediaTypes: { video: {} },
- bids: [
- {
- bidder: "converge",
- params: {
- uid: 60
- }
- }
- ]
- }
- ];
-```
diff --git a/modules/cosmosBidAdapter.js b/modules/cosmosBidAdapter.js
deleted file mode 100644
index 73ee5c223b3..00000000000
--- a/modules/cosmosBidAdapter.js
+++ /dev/null
@@ -1,392 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'cosmos';
-const BID_ENDPOINT = 'https://bid.cosmoshq.com/openrtb2/bids';
-const USER_SYNC_ENDPOINT = 'https://sync.cosmoshq.com/js/v1/usersync.html';
-const HTTP_POST = 'POST';
-const LOG_PREFIX = 'COSMOS: ';
-const DEFAULT_CURRENCY = 'USD';
-const HTTPS = 'https:';
-const MEDIA_TYPES = 'mediaTypes';
-const MIMES = 'mimes';
-const DEFAULT_NET_REVENUE = false;
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO],
-
- /**
- * generate UUID
- **/
- _createUUID: function () {
- return ('' + new Date().getTime());
- },
-
- /**
- * copy object if not null
- **/
- _copyObject: function (src, dst) {
- if (src) {
- // copy complete object
- Object.keys(src).forEach(param => dst[param] = src[param]);
- }
- },
-
- /**
- * parse object
- **/
- _parse: function (rawPayload) {
- try {
- if (rawPayload) {
- return JSON.parse(rawPayload);
- }
- } catch (ex) {
- utils.logError(LOG_PREFIX, 'Exception: ', ex);
- }
- return null;
- },
-
- /**
- * 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) {
- if (!bid || !bid.params) {
- utils.logError(LOG_PREFIX, 'nil/empty bid object');
- return false;
- }
-
- if (!utils.isEmpty(bid.params.publisherId) ||
- !utils.isNumber(bid.params.publisherId)) {
- utils.logError(LOG_PREFIX, 'publisherId is mandatory and must be numeric. Ad Unit: ', JSON.stringify(bid));
- return false;
- }
- // video bid request validation
- if (bid.hasOwnProperty(MEDIA_TYPES) && bid.mediaTypes.hasOwnProperty(VIDEO)) {
- if (!bid.mediaTypes.video.hasOwnProperty(MIMES) ||
- !utils.isArray(bid.mediaTypes.video.mimes) ||
- bid.mediaTypes.video.mimes.length === 0) {
- utils.logError(LOG_PREFIX, 'mimes are mandatory for video bid request. Ad Unit: ', JSON.stringify(bid));
- return false;
- }
- }
-
- return true;
- },
-
- /**
- * 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) {
- if (validBidRequests.length === 0) {
- return [];
- }
-
- var refererInfo;
- if (bidderRequest && bidderRequest.refererInfo) {
- refererInfo = bidderRequest.refererInfo;
- }
-
- let clonedBidRequests = utils.deepClone(validBidRequests);
- return clonedBidRequests.map(bidRequest => {
- const oRequest = spec._createRequest(bidRequest, refererInfo);
- if (oRequest) {
- spec._setGDPRParams(bidderRequest, oRequest);
- return {
- method: HTTP_POST,
- url: BID_ENDPOINT,
- data: JSON.stringify(oRequest)
- };
- }
- });
- },
-
- /**
- * 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, request) {
- let response = serverResponse.body;
- var bidResponses = [];
- try {
- if (response.seatbid) {
- var currency = response.cur ? response.cur : DEFAULT_CURRENCY;
- response.seatbid.forEach(seatbid => {
- var bids = seatbid.bid ? seatbid.bid : [];
- bids.forEach(bid => {
- var bidResponse = {
- requestId: bid.impid,
- cpm: (parseFloat(bid.price) || 0).toFixed(2),
- width: bid.w,
- height: bid.h,
- creativeId: bid.crid,
- currency: currency,
- netRevenue: DEFAULT_NET_REVENUE,
- ttl: 300
- };
- if (bid.dealid) {
- bidResponse.dealId = bid.dealid;
- }
-
- var req = spec._parse(request.data);
- if (req.imp && req.imp.length > 0) {
- req.imp.forEach(impr => {
- if (impr.id === bid.impid) {
- if (impr.banner) {
- bidResponse.ad = bid.adm;
- bidResponse.mediaType = BANNER;
- } else {
- bidResponse.width = bid.hasOwnProperty('w') ? bid.w : impr.video.w;
- bidResponse.height = bid.hasOwnProperty('h') ? bid.h : impr.video.h;
- bidResponse.vastXml = bid.adm;
- bidResponse.mediaType = VIDEO;
- }
- }
- });
- }
- bidResponses.push(bidResponse);
- });
- });
- }
- } catch (ex) {
- utils.logError(LOG_PREFIX, 'Exception: ', ex);
- }
- return bidResponses;
- },
-
- /**
- * 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: function (syncOptions, serverResponses) {
- if (syncOptions.iframeEnabled) {
- return [{
- type: 'iframe',
- url: USER_SYNC_ENDPOINT
- }];
- } else {
- utils.logWarn(LOG_PREFIX + 'Please enable iframe based user sync.');
- }
- },
-
- /**
- * create IAB standard OpenRTB bid request
- **/
- _createRequest: function (bidRequests, refererInfo) {
- var oRequest = {};
- try {
- oRequest = {
- id: spec._createUUID(),
- imp: spec._createImpressions(bidRequests),
- user: {},
- ext: {}
- };
- var site = spec._createSite(bidRequests, refererInfo);
- var app = spec._createApp(bidRequests);
- var device = spec._createDevice(bidRequests);
- if (app) {
- oRequest.app = app;
- }
- if (site) {
- oRequest.site = site;
- }
- if (device) {
- oRequest.device = device;
- }
- } catch (ex) {
- utils.logError(LOG_PREFIX, 'Exception: ', ex);
- oRequest = null;
- }
- return oRequest;
- },
-
- /**
- * create impression array objects
- **/
- _createImpressions: function (request) {
- var impressions = [];
- var impression = spec._creatImpression(request);
- if (impression) {
- impressions.push(impression);
- }
- return impressions;
- },
-
- /**
- * create impression (single) object
- **/
- _creatImpression: function (request) {
- if (!request.hasOwnProperty(MEDIA_TYPES)) {
- return undefined;
- }
-
- var params = request && request.params ? request.params : null;
- var impression = {
- id: request.bidId ? request.bidId : spec._createUUID(),
- secure: window.location.protocol === HTTPS ? 1 : 0,
- bidfloorcur: request.params.currency ? request.params.currency : DEFAULT_CURRENCY
- };
- if (params.bidFloor) {
- impression.bidfloor = params.bidFloor;
- }
-
- if (params.tagId) {
- impression.tagid = params.tagId.toString();
- }
-
- var banner;
- var video;
- var mediaType;
- for (mediaType in request.mediaTypes) {
- switch (mediaType) {
- case BANNER:
- banner = spec._createBanner(request);
- if (banner) {
- impression.banner = banner;
- }
- break;
- case VIDEO:
- video = spec._createVideo(request);
- if (video) {
- impression.video = video;
- }
- break;
- }
- }
-
- return impression.hasOwnProperty(BANNER) ||
- impression.hasOwnProperty(VIDEO) ? impression : undefined;
- },
-
- /**
- * create the banner object
- **/
- _createBanner: function (request) {
- if (utils.deepAccess(request, 'mediaTypes.banner')) {
- var banner = {};
- var sizes = request.mediaTypes.banner.sizes;
- if (sizes && utils.isArray(sizes) && sizes.length > 0) {
- var format = [];
- banner.w = sizes[0][0];
- banner.h = sizes[0][1];
- sizes.forEach(size => {
- format.push({
- w: size[0],
- h: size[1]
- });
- });
- banner.format = format;
- }
-
- spec._copyObject(request.mediaTypes.banner, banner);
- spec._copyObject(request.params.banner, banner);
- return banner;
- }
- return undefined;
- },
-
- /**
- * create video object
- **/
- _createVideo: function (request) {
- if (utils.deepAccess(request, 'mediaTypes.video')) {
- var video = {};
- var sizes = request.mediaTypes.video.playerSize;
- if (sizes && utils.isArray(sizes) && sizes.length > 1) {
- video.w = sizes[0];
- video.h = sizes[1];
- }
- spec._copyObject(request.mediaTypes.video, video);
- spec._copyObject(request.params.video, video);
- return video;
- }
- return undefined;
- },
-
- /**
- * create site object
- **/
- _createSite: function (request, refererInfo) {
- var rSite = request.params.site;
- if (rSite || !request.params.app) {
- var site = {};
- spec._copyObject(rSite, site);
-
- if (refererInfo) {
- if (refererInfo.referer) {
- site.ref = encodeURIComponent(refererInfo.referer);
- }
- if (utils.isArray(refererInfo.stack) && refererInfo.stack.length > 0) {
- site.page = encodeURIComponent(refererInfo.stack[0]);
- let anchrTag = document.createElement('a');
- anchrTag.href = site.page;
- site.domain = anchrTag.hostname;
- }
- }
-
- // override publisher object
- site.publisher = {
- id: request.params.publisherId.toString()
- };
- return site;
- }
- return undefined;
- },
-
- /**
- * create app object
- **/
- _createApp: function (request) {
- var rApp = request.params.app;
- if (rApp) {
- var app = {};
- spec._copyObject(rApp, app);
- // override publisher object
- app.publisher = {
- id: request.params.publisherId.toString()
- };
- return app;
- }
- return undefined;
- },
-
- /**
- * create device obejct
- **/
- _createDevice: function (request) {
- var device = {};
- var rDevice = request.params.device;
- spec._copyObject(rDevice, device);
- device.dnt = utils.getDNT() ? 1 : 0;
- device.ua = navigator.userAgent;
- device.language = (navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage);
- device.w = (window.screen.width || window.innerWidth);
- device.h = (window.screen.height || window.innerHeigh);
- return device;
- },
-
- /**
- * set GDPR parameters
- **/
- _setGDPRParams: function (bidderRequest, oRequest) {
- if (!bidderRequest || !bidderRequest.gdprConsent) {
- return;
- }
-
- oRequest.regs = { ext: { gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0 } };
- oRequest.user = { ext: { consent: bidderRequest.gdprConsent.consentString } };
- },
-
-}
-registerBidder(spec);
diff --git a/modules/cpmstarBidAdapter.js b/modules/cpmstarBidAdapter.js
deleted file mode 100644
index 61ccc0e786b..00000000000
--- a/modules/cpmstarBidAdapter.js
+++ /dev/null
@@ -1,180 +0,0 @@
-
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { VIDEO, BANNER } from '../src/mediaTypes.js';
-import { config } from '../src/config.js';
-
-const BIDDER_CODE = 'cpmstar';
-
-const ENDPOINT_DEV = 'https://dev.server.cpmstar.com/view.aspx';
-const ENDPOINT_STAGING = 'https://staging.server.cpmstar.com/view.aspx';
-const ENDPOINT_PRODUCTION = 'https://server.cpmstar.com/view.aspx';
-
-const DEFAULT_TTL = 300;
-const DEFAULT_CURRENCY = 'USD';
-
-function fixedEncodeURIComponent(str) {
- return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
- return '%' + c.charCodeAt(0).toString(16);
- });
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO],
- pageID: Math.floor(Math.random() * 10e6),
-
- getMediaType: function (bidRequest) {
- if (bidRequest == null) return BANNER;
- return !utils.deepAccess(bidRequest, 'mediaTypes.video') ? BANNER : VIDEO;
- },
-
- getPlayerSize: function (bidRequest) {
- var playerSize = utils.deepAccess(bidRequest, 'mediaTypes.video.playerSize');
- if (playerSize == null) return [640, 440];
- if (playerSize[0] != null) playerSize = playerSize[0];
- if (playerSize == null || playerSize[0] == null || playerSize[1] == null) return [640, 440];
- return playerSize;
- },
-
- isBidRequestValid: function (bid) {
- return ((typeof bid.params.placementId === 'string') && !!bid.params.placementId.length) || (typeof bid.params.placementId === 'number');
- },
-
- buildRequests: function (validBidRequests, bidderRequest) {
- var requests = [];
- // This reference to window.top can cause issues when loaded in an iframe if not protected with a try/catch.
-
- for (var i = 0; i < validBidRequests.length; i++) {
- var bidRequest = validBidRequests[i];
- var referer = encodeURIComponent(bidderRequest.refererInfo.referer);
- var e = utils.getBidIdParameter('endpoint', bidRequest.params);
- var ENDPOINT = e == 'dev' ? ENDPOINT_DEV : e == 'staging' ? ENDPOINT_STAGING : ENDPOINT_PRODUCTION;
- var mediaType = spec.getMediaType(bidRequest);
- var playerSize = spec.getPlayerSize(bidRequest);
- var videoArgs = '&fv=0' + (playerSize ? ('&w=' + playerSize[0] + '&h=' + playerSize[1]) : '');
- var url = ENDPOINT + '?media=' + mediaType + (mediaType == VIDEO ? videoArgs : '') +
- '&json=c_b&mv=1&poolid=' + utils.getBidIdParameter('placementId', bidRequest.params) +
- '&reachedTop=' + encodeURIComponent(bidderRequest.refererInfo.reachedTop) +
- '&requestid=' + bidRequest.bidId +
- '&referer=' + encodeURIComponent(referer);
-
- if (bidRequest.schain && bidRequest.schain.nodes) {
- var schain = bidRequest.schain;
- var schainString = '';
- schainString += schain.ver + ',' + schain.complete;
- for (var i2 = 0; i2 < schain.nodes.length; i2++) {
- var node = schain.nodes[i2];
- schainString += '!' +
- fixedEncodeURIComponent(node.asi || '') + ',' +
- fixedEncodeURIComponent(node.sid || '') + ',' +
- fixedEncodeURIComponent(node.hp || '') + ',' +
- fixedEncodeURIComponent(node.rid || '') + ',' +
- fixedEncodeURIComponent(node.name || '') + ',' +
- fixedEncodeURIComponent(node.domain || '');
- }
- url += '&schain=' + schainString
- }
-
- if (bidderRequest.gdprConsent) {
- if (bidderRequest.gdprConsent.consentString != null) {
- url += '&gdpr_consent=' + bidderRequest.gdprConsent.consentString;
- }
- if (bidderRequest.gdprConsent.gdprApplies != null) {
- url += '&gdpr=' + (bidderRequest.gdprConsent.gdprApplies ? 1 : 0);
- }
- }
-
- if (bidderRequest.uspConsent != null) {
- url += '&us_privacy=' + bidderRequest.uspConsent;
- }
-
- if (config.getConfig('coppa')) {
- url += '&tfcd=' + (config.getConfig('coppa') ? 1 : 0);
- }
-
- requests.push({
- method: 'GET',
- url: url,
- bidRequest: bidRequest,
- });
- }
-
- return requests;
- },
-
- interpretResponse: function (serverResponse, request) {
- var bidRequest = request.bidRequest;
- var mediaType = spec.getMediaType(bidRequest);
-
- var bidResponses = [];
-
- if (!Array.isArray(serverResponse.body)) {
- serverResponse.body = [serverResponse.body];
- }
-
- for (var i = 0; i < serverResponse.body.length; i++) {
- var raw = serverResponse.body[i];
- var rawBid = raw.creatives[0];
- if (!rawBid) {
- utils.logWarn('cpmstarBidAdapter: server response failed check');
- return;
- }
- var cpm = (parseFloat(rawBid.cpm) || 0);
-
- if (!cpm) {
- utils.logWarn('cpmstarBidAdapter: server response failed check. Missing cpm')
- return;
- }
-
- var bidResponse = {
- requestId: rawBid.requestid,
- cpm: cpm,
- width: rawBid.width || 0,
- height: rawBid.height || 0,
- currency: rawBid.currency ? rawBid.currency : DEFAULT_CURRENCY,
- netRevenue: rawBid.netRevenue ? rawBid.netRevenue : true,
- ttl: rawBid.ttl ? rawBid.ttl : DEFAULT_TTL,
- creativeId: rawBid.creativeid || 0,
- };
-
- if (rawBid.hasOwnProperty('dealId')) {
- bidResponse.dealId = rawBid.dealId
- }
-
- if (mediaType == BANNER && rawBid.code) {
- bidResponse.ad = rawBid.code + (rawBid.px_cr ? "\n " : '');
- } else if (mediaType == VIDEO && rawBid.creativemacros && rawBid.creativemacros.HTML5VID_VASTSTRING) {
- var playerSize = spec.getPlayerSize(bidRequest);
- if (playerSize != null) {
- bidResponse.width = playerSize[0];
- bidResponse.height = playerSize[1];
- }
- bidResponse.mediaType = VIDEO;
- bidResponse.vastXml = rawBid.creativemacros.HTML5VID_VASTSTRING;
- } else {
- return utils.logError('bad response', rawBid);
- }
-
- bidResponses.push(bidResponse);
- }
-
- return bidResponses;
- },
-
- getUserSyncs: function (syncOptions, serverResponses) {
- const syncs = [];
- if (serverResponses.length == 0 || !serverResponses[0].body) return syncs;
- var usersyncs = serverResponses[0].body[0].syncs;
- if (!usersyncs || usersyncs.length < 0) return syncs;
- for (var i = 0; i < usersyncs.length; i++) {
- var us = usersyncs[i];
- if ((us.type === 'image' && syncOptions.pixelEnabled) || (us.type == 'iframe' && syncOptions.iframeEnabled)) {
- syncs.push(us);
- }
- }
- return syncs;
- }
-
-};
-registerBidder(spec);
diff --git a/modules/criteoBidAdapter.js b/modules/criteoBidAdapter.js
index 41cbb0670c8..363b9322204 100644
--- a/modules/criteoBidAdapter.js
+++ b/modules/criteoBidAdapter.js
@@ -4,11 +4,11 @@ import {config} from '../src/config.js';
import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js';
import * as utils from '../src/utils.js';
import find from 'core-js-pure/features/array/find.js';
-import { verify } from 'criteo-direct-rsa-validate/build/verify.js';
+import { verify } from 'criteo-direct-rsa-validate/build/verify.js'; // ref#2
import { getStorageManager } from '../src/storageManager.js';
const GVLID = 91;
-export const ADAPTER_VERSION = 33;
+export const ADAPTER_VERSION = 34;
const BIDDER_CODE = 'criteo';
const CDB_ENDPOINT = 'https://bidder.criteo.com/cdb';
const PROFILE_ID_INLINE = 207;
@@ -16,9 +16,18 @@ export const PROFILE_ID_PUBLISHERTAG = 185;
const storage = getStorageManager(GVLID);
const LOG_PREFIX = 'Criteo: ';
-// Unminified source code can be found in: https://github.com/Prebid-org/prebid-js-external-js-criteo/blob/master/dist/prod.js
-const PUBLISHER_TAG_URL = 'https://static.criteo.net/js/ld/publishertag.prebid.js';
-
+/*
+ If you don't want to use the FastBid adapter feature, you can lighten criteoBidAdapter size by :
+ 1. commenting the tryGetCriteoFastBid function inner content (see ref#1)
+ 2. removing the line 'verify' function import line (see ref#2)
+
+ Unminified source code can be found in the privately shared repo: https://github.com/Prebid-org/prebid-js-external-js-criteo/blob/master/dist/prod.js
+*/
+const FAST_BID_VERSION_PLACEHOLDER = '%FAST_BID_VERSION%';
+export const FAST_BID_VERSION_CURRENT = 105;
+const FAST_BID_VERSION_LATEST = 'latest';
+const FAST_BID_VERSION_NONE = 'none';
+const PUBLISHER_TAG_URL_TEMPLATE = 'https://static.criteo.net/js/ld/publishertag.prebid' + FAST_BID_VERSION_PLACEHOLDER + '.js';
const FAST_BID_PUBKEY_E = 65537;
const FAST_BID_PUBKEY_N = 'ztQYwCE5BU7T9CDM5he6rKoabstXRmkzx54zFPZkWbK530dwtLBDeaWBMxHBUT55CYyboR/EZ4efghPi3CoNGfGWezpjko9P6p2EwGArtHEeS4slhu/SpSIFMjG6fdrpRoNuIAMhq1Z+Pr/+HOd1pThFKeGFr2/NhtAg+TXAzaU=';
@@ -65,15 +74,18 @@ export const spec = {
});
// If publisher tag not already loaded try to get it from fast bid
- if (!publisherTagAvailable()) {
+ const fastBidVersion = config.getConfig('criteo.fastBidVersion');
+ const canLoadPublisherTag = canFastBid(fastBidVersion);
+ if (!publisherTagAvailable() && canLoadPublisherTag) {
window.Criteo = window.Criteo || {};
window.Criteo.usePrebidEvents = false;
tryGetCriteoFastBid();
+ const fastBidUrl = getFastBidUrl(fastBidVersion);
// Reload the PublisherTag after the timeout to ensure FastBid is up-to-date and tracking done properly
setTimeout(() => {
- loadExternalScript(PUBLISHER_TAG_URL, BIDDER_CODE);
+ loadExternalScript(fastBidUrl, BIDDER_CODE);
}, bidderRequest.timeout);
}
@@ -122,11 +134,14 @@ export const spec = {
currency: slot.currency,
netRevenue: true,
ttl: slot.ttl || 60,
- creativeId: bidId,
+ creativeId: slot.creativecode,
width: slot.width,
height: slot.height,
dealId: slot.dealCode,
};
+ if (slot.adomain) {
+ bid.meta = Object.assign({}, bid.meta, { advertiserDomains: slot.adomain });
+ }
if (slot.native) {
if (bidRequest.params.nativeCallback) {
bid.ad = createNativeAd(bidId, slot.native, bidRequest.params.nativeCallback);
@@ -305,15 +320,14 @@ function buildCdbRequest(context, bidRequests, bidderRequest) {
mimes: bidRequest.mediaTypes.video.mimes,
protocols: bidRequest.mediaTypes.video.protocols,
maxduration: bidRequest.mediaTypes.video.maxduration,
- api: bidRequest.mediaTypes.video.api
+ api: bidRequest.mediaTypes.video.api,
+ skip: bidRequest.mediaTypes.video.skip || bidRequest.params.video.skip,
+ placement: bidRequest.mediaTypes.video.placement || bidRequest.params.video.placement,
+ minduration: bidRequest.mediaTypes.video.minduration || bidRequest.params.video.minduration,
+ playbackmethod: bidRequest.mediaTypes.video.playbackmethod || bidRequest.params.video.playbackmethod,
+ startdelay: bidRequest.mediaTypes.video.startdelay || bidRequest.params.video.startdelay
};
- video.skip = bidRequest.params.video.skip;
- video.placement = bidRequest.params.video.placement;
- video.minduration = bidRequest.params.video.minduration;
- video.playbackmethod = bidRequest.params.video.playbackmethod;
- video.startdelay = bidRequest.params.video.startdelay;
-
slot.video = video;
}
return slot;
@@ -367,38 +381,27 @@ function parseNativeSize(size) {
}
function hasVideoMediaType(bidRequest) {
- if (utils.deepAccess(bidRequest, 'params.video') === undefined) {
- return false;
- }
return utils.deepAccess(bidRequest, 'mediaTypes.video') !== undefined;
}
function hasValidVideoMediaType(bidRequest) {
let isValid = true;
- var requiredMediaTypesParams = ['mimes', 'playerSize', 'maxduration', 'protocols', 'api'];
+ var requiredMediaTypesParams = ['mimes', 'playerSize', 'maxduration', 'protocols', 'api', 'skip', 'placement', 'playbackmethod'];
requiredMediaTypesParams.forEach(function(param) {
- if (utils.deepAccess(bidRequest, 'mediaTypes.video.' + param) === undefined) {
+ if (utils.deepAccess(bidRequest, 'mediaTypes.video.' + param) === undefined && utils.deepAccess(bidRequest, 'params.video.' + param) === undefined) {
isValid = false;
utils.logError('Criteo Bid Adapter: mediaTypes.video.' + param + ' is required');
}
});
- var requiredParams = ['skip', 'placement', 'playbackmethod'];
-
- requiredParams.forEach(function(param) {
- if (utils.deepAccess(bidRequest, 'params.video.' + param) === undefined) {
- isValid = false;
- utils.logError('Criteo Bid Adapter: params.video.' + param + ' is required');
- }
- });
-
if (isValid) {
+ const videoPlacement = bidRequest.mediaTypes.video.placement || bidRequest.params.video.placement;
// We do not support long form for now, also we have to check that context & placement are consistent
- if (bidRequest.mediaTypes.video.context == 'instream' && bidRequest.params.video.placement === 1) {
+ if (bidRequest.mediaTypes.video.context == 'instream' && videoPlacement === 1) {
return true;
- } else if (bidRequest.mediaTypes.video.context == 'outstream' && bidRequest.params.video.placement !== 1) {
+ } else if (bidRequest.mediaTypes.video.context == 'outstream' && videoPlacement !== 1) {
return true;
}
}
@@ -454,7 +457,29 @@ for (var i = 0; i < 10; ++i) {
`;
}
+export function canFastBid(fastBidVersion) {
+ return fastBidVersion !== FAST_BID_VERSION_NONE;
+}
+
+export function getFastBidUrl(fastBidVersion) {
+ let version;
+ if (fastBidVersion === FAST_BID_VERSION_LATEST) {
+ version = '';
+ } else if (fastBidVersion) {
+ let majorVersion = String(fastBidVersion).split('.')[0];
+ if (majorVersion < 102) {
+ utils.logWarn('Specifying a Fastbid version which is not supporting version selection.')
+ }
+ version = '.' + fastBidVersion;
+ } else {
+ version = '.' + FAST_BID_VERSION_CURRENT;
+ }
+
+ return PUBLISHER_TAG_URL_TEMPLATE.replace(FAST_BID_VERSION_PLACEHOLDER, version);
+}
+
export function tryGetCriteoFastBid() {
+ // begin ref#1
try {
const fastBidStorageKey = 'criteo_fast_bid';
const hashPrefix = '// Hash: ';
@@ -485,6 +510,7 @@ export function tryGetCriteoFastBid() {
} catch (e) {
// Unable to get fast bid
}
+ // end ref#1
}
registerBidder(spec);
diff --git a/modules/criteoBidAdapter.md b/modules/criteoBidAdapter.md
index 68599f05434..6a165978f3b 100644
--- a/modules/criteoBidAdapter.md
+++ b/modules/criteoBidAdapter.md
@@ -31,7 +31,8 @@ Set the "ceh" property to provides the user's hashed email if available
```
pbjs.setConfig({
criteo: {
- ceh: 'hashed mail'
+ ceh: 'hashed mail',
+ fastBidVersion: "none"|"latest"|
}
});
-```
\ No newline at end of file
+```
diff --git a/modules/dailyhuntBidAdapter.js b/modules/dailyhuntBidAdapter.js
deleted file mode 100644
index 1018417300a..00000000000
--- a/modules/dailyhuntBidAdapter.js
+++ /dev/null
@@ -1,395 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import * as mediaTypes from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-import { ajax } from '../src/ajax.js';
-import find from 'core-js-pure/features/array/find.js';
-import { OUTSTREAM, INSTREAM } from '../src/video.js';
-
-const BIDDER_CODE = 'dailyhunt';
-const BIDDER_ALIAS = 'dh';
-const SUPPORTED_MEDIA_TYPES = [mediaTypes.BANNER, mediaTypes.NATIVE, mediaTypes.VIDEO];
-
-const PROD_PREBID_ENDPOINT_URL = 'https://pbs.dailyhunt.in/openrtb2/auction?partner=';
-const PROD_PREBID_TEST_ENDPOINT_URL = 'https://qa-pbs-van.dailyhunt.in/openrtb2/auction?partner=';
-
-const ORTB_NATIVE_TYPE_MAPPING = {
- img: {
- '3': 'image',
- '1': 'icon'
- },
- data: {
- '1': 'sponsoredBy',
- '2': 'body',
- '3': 'rating',
- '4': 'likes',
- '5': 'downloads',
- '6': 'price',
- '7': 'salePrice',
- '8': 'phone',
- '9': 'address',
- '10': 'body2',
- '11': 'displayUrl',
- '12': 'cta'
- }
-}
-
-const ORTB_NATIVE_PARAMS = {
- title: {
- id: 0,
- name: 'title'
- },
- icon: {
- id: 1,
- type: 1,
- name: 'img'
- },
- image: {
- id: 2,
- type: 3,
- name: 'img'
- },
- sponsoredBy: {
- id: 3,
- name: 'data',
- type: 1
- },
- body: {
- id: 4,
- name: 'data',
- type: 2
- },
- cta: {
- id: 5,
- type: 12,
- name: 'data'
- },
- body2: {
- id: 4,
- name: 'data',
- type: 10
- },
-};
-
-// Encode URI.
-const _encodeURIComponent = function (a) {
- let b = window.encodeURIComponent(a);
- b = b.replace(/'/g, '%27');
- return b;
-}
-
-// Extract key from collections.
-const extractKeyInfo = (collection, key) => {
- for (let i = 0, result; i < collection.length; i++) {
- result = utils.deepAccess(collection[i].params, key);
- if (result) {
- return result;
- }
- }
- return undefined
-}
-
-// Flattern Array.
-const flatten = (arr) => {
- return [].concat(...arr);
-}
-
-const createOrtbRequest = (validBidRequests, bidderRequest) => {
- let device = createOrtbDeviceObj(validBidRequests);
- let user = createOrtbUserObj(validBidRequests)
- let site = createOrtbSiteObj(validBidRequests, bidderRequest.refererInfo.referer)
- return {
- id: bidderRequest.auctionId,
- imp: [],
- site,
- device,
- user,
- };
-}
-
-const createOrtbDeviceObj = (validBidRequests) => {
- let device = { ...extractKeyInfo(validBidRequests, `device`) };
- device.ua = navigator.userAgent;
- return device;
-}
-
-const createOrtbUserObj = (validBidRequests) => ({ ...extractKeyInfo(validBidRequests, `user`) })
-
-const createOrtbSiteObj = (validBidRequests, page) => {
- let site = { ...extractKeyInfo(validBidRequests, `site`), page };
- let publisher = createOrtbPublisherObj(validBidRequests);
- if (publisher) {
- site.publisher = publisher
- }
- return site
-}
-
-const createOrtbPublisherObj = (validBidRequests) => ({ ...extractKeyInfo(validBidRequests, `publisher`) })
-
-const createOrtbImpObj = (bid) => {
- let params = bid.params
- let testMode = !!bid.params.test_mode
-
- // Validate Banner Request.
- let bannerObj = utils.deepAccess(bid.mediaTypes, `banner`);
- let nativeObj = utils.deepAccess(bid.mediaTypes, `native`);
- let videoObj = utils.deepAccess(bid.mediaTypes, `video`);
-
- let imp = {
- id: bid.bidId,
- bidfloor: params.bidfloor ? params.bidfloor : 0,
- ext: {
- dailyhunt: {
- placement_id: params.placement_id,
- publisher_id: params.publisher_id,
- partner: params.partner_name
- }
- }
- };
-
- // Test Mode Campaign.
- if (testMode) {
- imp.ext.test_mode = testMode;
- }
-
- if (bannerObj) {
- imp.banner = {
- ...createOrtbImpBannerObj(bid, bannerObj)
- }
- } else if (nativeObj) {
- imp.native = {
- ...createOrtbImpNativeObj(bid, nativeObj)
- }
- } else if (videoObj) {
- imp.video = {
- ...createOrtbImpVideoObj(bid, videoObj)
- }
- }
- return imp;
-}
-
-const createOrtbImpBannerObj = (bid, bannerObj) => {
- let format = [];
- bannerObj.sizes.forEach(size => format.push({ w: size[0], h: size[1] }))
-
- return {
- id: 'banner-' + bid.bidId,
- format
- }
-}
-
-const createOrtbImpNativeObj = (bid, nativeObj) => {
- const assets = utils._map(bid.nativeParams, (bidParams, key) => {
- const props = ORTB_NATIVE_PARAMS[key];
- const asset = {
- required: bidParams.required & 1,
- };
- if (props) {
- let h = 0;
- let w = 0;
-
- asset.id = props.id;
-
- if (bidParams.sizes) {
- const sizes = flatten(bidParams.sizes);
- w = sizes[0];
- h = sizes[1];
- }
-
- asset[props.name] = {
- len: bidParams.len ? bidParams.len : 20,
- type: props.type,
- w,
- h
- };
-
- return asset;
- }
- }).filter(Boolean);
- let request = {
- assets,
- ver: '1,0'
- }
- return { request: JSON.stringify(request) };
-}
-
-const createOrtbImpVideoObj = (bid, videoObj) => {
- let obj = {};
- let params = bid.params
- if (!utils.isEmpty(bid.params.video)) {
- obj = {
- ...params.video,
- }
- } else {
- obj = {
- mimes: ['video/mp4'],
- };
- }
- obj.ext = {
- ...videoObj,
- }
- return obj;
-}
-
-const createServerRequest = (ortbRequest, validBidRequests, isTestMode = 'false') => ({
- method: 'POST',
- url: isTestMode === 'true' ? PROD_PREBID_TEST_ENDPOINT_URL + validBidRequests[0].params.partner_name : PROD_PREBID_ENDPOINT_URL + validBidRequests[0].params.partner_name,
- data: JSON.stringify(ortbRequest),
- options: {
- contentType: 'application/json',
- withCredentials: true
- },
- bids: validBidRequests
-})
-
-const createPrebidBannerBid = (bid, bidResponse) => ({
- requestId: bid.bidId,
- cpm: bidResponse.price.toFixed(2),
- creativeId: bidResponse.crid,
- width: bidResponse.w,
- height: bidResponse.h,
- ttl: 360,
- netRevenue: bid.netRevenue === 'net',
- currency: 'USD',
- ad: bidResponse.adm,
- mediaType: 'banner',
- winUrl: bidResponse.nurl
-})
-
-const createPrebidNativeBid = (bid, bidResponse) => ({
- requestId: bid.bidId,
- cpm: bidResponse.price.toFixed(2),
- creativeId: bidResponse.crid,
- currency: 'USD',
- ttl: 360,
- netRevenue: bid.netRevenue === 'net',
- native: parseNative(bidResponse),
- mediaType: 'native',
- winUrl: bidResponse.nurl,
- width: bidResponse.w,
- height: bidResponse.h,
-})
-
-const parseNative = (bid) => {
- let adm = JSON.parse(bid.adm)
- const { assets, link, imptrackers, jstracker } = adm.native;
- const result = {
- clickUrl: _encodeURIComponent(link.url),
- clickTrackers: link.clicktrackers || [],
- impressionTrackers: imptrackers || [],
- javascriptTrackers: jstracker ? [ jstracker ] : []
- };
- assets.forEach(asset => {
- if (!utils.isEmpty(asset.title)) {
- result.title = asset.title.text
- } else if (!utils.isEmpty(asset.img)) {
- result[ORTB_NATIVE_TYPE_MAPPING.img[asset.img.type]] = {
- url: asset.img.url,
- height: asset.img.h,
- width: asset.img.w
- }
- } else if (!utils.isEmpty(asset.data)) {
- result[ORTB_NATIVE_TYPE_MAPPING.data[asset.data.type]] = asset.data.value
- }
- });
-
- return result;
-}
-
-const createPrebidVideoBid = (bid, bidResponse) => {
- let videoBid = {
- requestId: bid.bidId,
- cpm: bidResponse.price.toFixed(2),
- creativeId: bidResponse.crid,
- width: bidResponse.w,
- height: bidResponse.h,
- ttl: 360,
- netRevenue: bid.netRevenue === 'net',
- currency: 'USD',
- mediaType: 'video',
- winUrl: bidResponse.nurl,
- };
-
- let videoContext = bid.mediaTypes.video.context;
- switch (videoContext) {
- case OUTSTREAM:
- videoBid.vastXml = bidResponse.adm;
- break;
- case INSTREAM:
- videoBid.videoCacheKey = bidResponse.ext.bidder.cacheKey;
- videoBid.vastUrl = bidResponse.ext.bidder.vastUrl;
- break;
- }
- return videoBid;
-}
-
-const getQueryVariable = (variable) => {
- let query = window.location.search.substring(1);
- let vars = query.split('&');
- for (var i = 0; i < vars.length; i++) {
- let pair = vars[i].split('=');
- if (decodeURIComponent(pair[0]) == variable) {
- return decodeURIComponent(pair[1]);
- }
- }
- return false;
-}
-
-export const spec = {
- code: BIDDER_CODE,
-
- aliases: [BIDDER_ALIAS],
-
- supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
-
- isBidRequestValid: bid => !!bid.params.placement_id && !!bid.params.publisher_id && !!bid.params.partner_name,
-
- buildRequests: function (validBidRequests, bidderRequest) {
- let serverRequests = [];
-
- // ORTB Request.
- let ortbReq = createOrtbRequest(validBidRequests, bidderRequest);
-
- validBidRequests.forEach((bid) => {
- let imp = createOrtbImpObj(bid)
- ortbReq.imp.push(imp);
- });
-
- serverRequests.push({ ...createServerRequest(ortbReq, validBidRequests, getQueryVariable('dh_test')) });
-
- return serverRequests;
- },
-
- interpretResponse: function (serverResponse, request) {
- const { seatbid } = serverResponse.body;
- let bids = request.bids;
- let prebidResponse = [];
-
- let seatBids = seatbid[0].bid;
-
- seatBids.forEach(ortbResponseBid => {
- let bidId = ortbResponseBid.impid;
- let actualBid = find(bids, (bid) => bid.bidId === bidId);
- let bidMediaType = ortbResponseBid.ext.prebid.type
- switch (bidMediaType) {
- case mediaTypes.BANNER:
- prebidResponse.push(createPrebidBannerBid(actualBid, ortbResponseBid));
- break;
- case mediaTypes.NATIVE:
- prebidResponse.push(createPrebidNativeBid(actualBid, ortbResponseBid));
- break;
- case mediaTypes.VIDEO:
- prebidResponse.push(createPrebidVideoBid(actualBid, ortbResponseBid));
- break;
- }
- })
- return prebidResponse;
- },
-
- onBidWon: function(bid) {
- ajax(bid.winUrl, null, null, {
- method: 'GET'
- })
- }
-}
-
-registerBidder(spec);
diff --git a/modules/datablocksBidAdapter.js b/modules/datablocksBidAdapter.js
index 47d2eb2652f..bfbe7a16fc6 100644
--- a/modules/datablocksBidAdapter.js
+++ b/modules/datablocksBidAdapter.js
@@ -1,330 +1,627 @@
-import * as utils from '../src/utils.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-const NATIVE_MAP = {
- 'body': 2,
- 'body2': 10,
- 'price': 6,
- 'displayUrl': 11,
- 'cta': 12
-};
-const NATIVE_IMAGE = [{
- id: 1,
- required: 1,
+import { config } from '../src/config.js';
+import * as utils from '../src/utils.js';
+import { BANNER, NATIVE } from '../src/mediaTypes.js';
+import { getStorageManager } from '../src/storageManager.js';
+import { ajax } from '../src/ajax.js';
+export const storage = getStorageManager();
+
+const NATIVE_ID_MAP = {};
+const NATIVE_PARAMS = {
title: {
- len: 140
- }
-}, {
- id: 2,
- required: 1,
- img: { type: 3 }
-}, {
- id: 3,
- required: 1,
- data: {
- type: 11
- }
-}, {
- id: 4,
- required: 0,
- data: {
+ id: 1,
+ name: 'title'
+ },
+ icon: {
+ id: 2,
+ type: 1,
+ name: 'img'
+ },
+ image: {
+ id: 3,
+ type: 3,
+ name: 'img'
+ },
+ body: {
+ id: 4,
+ name: 'data',
type: 2
+ },
+ sponsoredBy: {
+ id: 5,
+ name: 'data',
+ type: 1
+ },
+ cta: {
+ id: 6,
+ type: 12,
+ name: 'data'
+ },
+ body2: {
+ id: 7,
+ name: 'data',
+ type: 10
+ },
+ rating: {
+ id: 8,
+ name: 'data',
+ type: 3
+ },
+ likes: {
+ id: 9,
+ name: 'data',
+ type: 4
+ },
+ downloads: {
+ id: 10,
+ name: 'data',
+ type: 5
+ },
+ displayUrl: {
+ id: 11,
+ name: 'data',
+ type: 11
+ },
+ price: {
+ id: 12,
+ name: 'data',
+ type: 6
+ },
+ salePrice: {
+ id: 13,
+ name: 'data',
+ type: 7
+ },
+ address: {
+ id: 14,
+ name: 'data',
+ type: 9
+ },
+ phone: {
+ id: 15,
+ name: 'data',
+ type: 8
}
-}, {
- id: 5,
- required: 0,
- img: { type: 1 }
-}, {
- id: 6,
- required: 0,
- data: {
- type: 12
- }
-}];
+};
-const VIDEO_PARAMS = ['mimes', 'minduration', 'maxduration', 'protocols', 'w', 'h', 'startdelay',
- 'placement', 'linearity', 'skip', 'skipmin', 'skipafter', 'sequence', 'battr', 'maxextended',
- 'minbitrate', 'maxbitrate', 'boxingallowed', 'playbackmethod', 'playbackend', 'delivery',
- 'pos', 'companionad', 'api', 'companiontype', 'ext'];
+Object.keys(NATIVE_PARAMS).forEach((key) => {
+ NATIVE_ID_MAP[NATIVE_PARAMS[key].id] = key;
+});
+// DEFINE THE PREBID BIDDER SPEC
export const spec = {
- supportedMediaTypes: [BANNER, NATIVE, VIDEO],
+ supportedMediaTypes: [BANNER, NATIVE],
code: 'datablocks',
+
+ // DATABLOCKS SCOPED OBJECT
+ db_obj: {metrics_host: 'prebid.datablocks.net', metrics: [], metrics_timer: null, metrics_queue_time: 1000, vis_optout: false, source_id: 0},
+
+ // STORE THE DATABLOCKS BUYERID IN STORAGE
+ store_dbid: function(dbid) {
+ let stored = false;
+
+ // CREATE 1 YEAR EXPIRY DATE
+ let d = new Date();
+ d.setTime(Date.now() + (365 * 24 * 60 * 60 * 1000));
+
+ // TRY TO STORE IN COOKIE
+ if (storage.cookiesAreEnabled) {
+ storage.setCookie('_db_dbid', dbid, d.toUTCString(), 'None', null);
+ stored = true;
+ }
+
+ // TRY TO STORE IN LOCAL STORAGE
+ if (storage.localStorageIsEnabled) {
+ storage.setDataInLocalStorage('_db_dbid', dbid);
+ stored = true;
+ }
+
+ return stored;
+ },
+
+ // FETCH DATABLOCKS BUYERID FROM STORAGE
+ get_dbid: function() {
+ let dbId = '';
+ if (storage.cookiesAreEnabled) {
+ dbId = storage.getCookie('_db_dbid') || '';
+ }
+
+ if (!dbId && storage.localStorageIsEnabled) {
+ dbId = storage.getDataFromLocalStorage('_db_dbid') || '';
+ }
+ return dbId;
+ },
+
+ // STORE SYNCS IN STORAGE
+ store_syncs: function(syncs) {
+ if (storage.localStorageIsEnabled) {
+ let syncObj = {};
+ syncs.forEach(sync => {
+ syncObj[sync.id] = sync.uid;
+ });
+
+ // FETCH EXISTING SYNCS AND MERGE NEW INTO STORAGE
+ let storedSyncs = this.get_syncs();
+ storage.setDataInLocalStorage('_db_syncs', JSON.stringify(Object.assign(storedSyncs, syncObj)));
+
+ return true;
+ }
+ },
+
+ // GET SYNCS FROM STORAGE
+ get_syncs: function() {
+ if (storage.localStorageIsEnabled) {
+ let syncData = storage.getDataFromLocalStorage('_db_syncs');
+ if (syncData) {
+ return JSON.parse(syncData);
+ } else {
+ return {};
+ }
+ } else {
+ return {};
+ }
+ },
+
+ // ADD METRIC DATA TO THE METRICS RESPONSE QUEUE
+ queue_metric: function(metric) {
+ if (typeof metric === 'object') {
+ // PUT METRICS IN THE QUEUE
+ this.db_obj.metrics.push(metric);
+
+ // RESET PREVIOUS TIMER
+ if (this.db_obj.metrics_timer) {
+ clearTimeout(this.db_obj.metrics_timer);
+ }
+
+ // SETUP THE TIMER TO FIRE BACK THE DATA
+ let scope = this;
+ this.db_obj.metrics_timer = setTimeout(function() {
+ scope.send_metrics();
+ }, this.db_obj.metrics_queue_time);
+
+ return true;
+ } else {
+ return false;
+ }
+ },
+
+ // POST CONSOLIDATED METRICS BACK TO SERVER
+ send_metrics: function() {
+ // POST TO SERVER
+ ajax(`https://${this.db_obj.metrics_host}/a/pb/`, null, JSON.stringify(this.db_obj.metrics), {method: 'POST', withCredentials: true});
+
+ // RESET THE QUEUE OF METRIC DATA
+ this.db_obj.metrics = [];
+
+ return true;
+ },
+
+ // GET BASIC CLIENT INFORMATION
+ get_client_info: function () {
+ let botTest = new BotClientTests();
+ let win = utils.getWindowTop();
+ return {
+ 'wiw': win.innerWidth,
+ 'wih': win.innerHeight,
+ 'saw': screen ? screen.availWidth : null,
+ 'sah': screen ? screen.availHeight : null,
+ 'scd': screen ? screen.colorDepth : null,
+ 'sw': screen ? screen.width : null,
+ 'sh': screen ? screen.height : null,
+ 'whl': win.history.length,
+ 'wxo': win.pageXOffset,
+ 'wyo': win.pageYOffset,
+ 'wpr': win.devicePixelRatio,
+ 'is_bot': botTest.doTests(),
+ 'is_hid': win.document.hidden,
+ 'vs': win.document.visibilityState
+ };
+ },
+
+ // LISTEN FOR GPT VIEWABILITY EVENTS
+ get_viewability: function(bid) {
+ // ONLY RUN ONCE IF PUBLISHER HAS OPTED IN
+ if (!this.db_obj.vis_optout && !this.db_obj.vis_run) {
+ this.db_obj.vis_run = true;
+
+ // ADD GPT EVENT LISTENERS
+ let scope = this;
+ if (utils.isGptPubadsDefined()) {
+ if (typeof window['googletag'].pubads().addEventListener == 'function') {
+ window['googletag'].pubads().addEventListener('impressionViewable', function(event) {
+ scope.queue_metric({type: 'slot_view', source_id: scope.db_obj.source_id, auction_id: bid.auctionId, div_id: event.slot.getSlotElementId(), slot_id: event.slot.getSlotId().getAdUnitPath()});
+ });
+ window['googletag'].pubads().addEventListener('slotRenderEnded', function(event) {
+ scope.queue_metric({type: 'slot_render', source_id: scope.db_obj.source_id, auction_id: bid.auctionId, div_id: event.slot.getSlotElementId(), slot_id: event.slot.getSlotId().getAdUnitPath()});
+ })
+ }
+ }
+ }
+ },
+
+ // VALIDATE THE BID REQUEST
isBidRequestValid: function(bid) {
- return !!(bid.params.host && bid.params.sourceId &&
- bid.mediaTypes && (bid.mediaTypes.banner || bid.mediaTypes.native || bid.mediaTypes.video));
+ // SET GLOBAL VARS FROM BIDDER CONFIG
+ this.db_obj.source_id = bid.params.source_id;
+ if (bid.params.vis_optout) {
+ this.db_obj.vis_optout = true;
+ }
+
+ return !!(bid.params.source_id && bid.mediaTypes && (bid.mediaTypes.banner || bid.mediaTypes.native));
},
- buildRequests: function(validBidRequests, bidderRequest) {
- if (!validBidRequests.length) { return []; }
- let imps = {};
- let site = {};
- let device = {};
- let refurl = utils.parseUrl(bidderRequest.referrer);
- let requests = [];
+ // GENERATE THE RTB REQUEST
+ buildRequests: function(validRequests, bidderRequest) {
+ // RETURN EMPTY IF THERE ARE NO VALID REQUESTS
+ if (!validRequests.length) {
+ return [];
+ }
- validBidRequests.forEach(bidRequest => {
+ // CONVERT PREBID NATIVE REQUEST OBJ INTO RTB OBJ
+ function createNativeRequest(bid) {
+ const assets = [];
+ if (bid.nativeParams) {
+ Object.keys(bid.nativeParams).forEach((key) => {
+ if (NATIVE_PARAMS[key]) {
+ const {name, type, id} = NATIVE_PARAMS[key];
+ const assetObj = type ? {type} : {};
+ let {len, sizes, required, aspect_ratios: aRatios} = bid.nativeParams[key];
+ if (len) {
+ assetObj.len = len;
+ }
+ if (aRatios && aRatios[0]) {
+ aRatios = aRatios[0];
+ let wmin = aRatios.min_width || 0;
+ let hmin = aRatios.ratio_height * wmin / aRatios.ratio_width | 0;
+ assetObj.wmin = wmin;
+ assetObj.hmin = hmin;
+ }
+ if (sizes && sizes.length) {
+ sizes = [].concat(...sizes);
+ assetObj.w = sizes[0];
+ assetObj.h = sizes[1];
+ }
+ const asset = {required: required ? 1 : 0, id};
+ asset[name] = assetObj;
+ assets.push(asset);
+ }
+ });
+ }
+ return {
+ ver: '1.2',
+ request: {
+ assets: assets,
+ context: 1,
+ plcmttype: 1,
+ ver: '1.2'
+ }
+ }
+ }
+ let imps = [];
+ // ITERATE THE VALID REQUESTS AND GENERATE IMP OBJECT
+ validRequests.forEach(bidRequest => {
+ // BUILD THE IMP OBJECT
let imp = {
id: bidRequest.bidId,
- tagid: bidRequest.adUnitCode,
- secure: window.location.protocol == 'https:'
- };
+ tagid: bidRequest.params.tagid || bidRequest.adUnitCode,
+ placement_id: bidRequest.params.placement_id || 0,
+ secure: window.location.protocol == 'https:',
+ ortb2: utils.deepAccess(bidRequest, `ortb2Imp`) || {},
+ floor: {}
+ }
+ // CHECK FOR FLOORS
+ if (typeof bidRequest.getFloor === 'function') {
+ imp.floor = bidRequest.getFloor({
+ currency: 'USD',
+ mediaType: '*',
+ size: '*'
+ });
+ }
+
+ // BUILD THE SIZES
if (utils.deepAccess(bidRequest, `mediaTypes.banner`)) {
- let sizes = bidRequest.mediaTypes.banner.sizes;
- if (sizes.length == 1) {
+ let sizes = utils.getAdUnitSizes(bidRequest);
+ if (sizes.length) {
imp.banner = {
w: sizes[0][0],
- h: sizes[0][1]
- };
- } else if (sizes.length > 1) {
- imp.banner = {
+ h: sizes[0][1],
format: sizes.map(size => ({ w: size[0], h: size[1] }))
};
- } else {
- return;
- }
- } else if (utils.deepAccess(bidRequest, 'mediaTypes.native')) {
- let nativeImp = bidRequest.mediaTypes.native;
-
- if (nativeImp.type) {
- let nativeAssets = [];
- switch (nativeImp.type) {
- case 'image':
- nativeAssets = NATIVE_IMAGE;
- break;
- default:
- return;
- }
- imp.native = JSON.stringify({ assets: nativeAssets });
- } else {
- let nativeAssets = [];
- let nativeKeys = Object.keys(nativeImp);
- nativeKeys.forEach((nativeKey, index) => {
- let required = !!nativeImp[nativeKey].required;
- let assetId = index + 1;
- switch (nativeKey) {
- case 'title':
- nativeAssets.push({
- id: assetId,
- required: required,
- title: {
- len: nativeImp[nativeKey].len || 140
- }
- });
- break;
- case 'body': // desc
- case 'body2': // desc2
- case 'price':
- case 'display_url':
- let data = {
- id: assetId,
- required: required,
- data: {
- type: NATIVE_MAP[nativeKey]
- }
- }
- if (nativeImp[nativeKey].data && nativeImp[nativeKey].data.len) { data.data.len = nativeImp[nativeKey].data.len; }
-
- nativeAssets.push(data);
- break;
- case 'image':
- if (nativeImp[nativeKey].sizes && nativeImp[nativeKey].sizes.length) {
- nativeAssets.push({
- id: assetId,
- required: required,
- image: {
- type: 3,
- w: nativeImp[nativeKey].sizes[0],
- h: nativeImp[nativeKey].sizes[1]
- }
- })
- }
- }
- });
- imp.native = {
- request: JSON.stringify({native: {assets: nativeAssets}})
- };
- }
- } else if (utils.deepAccess(bidRequest, 'mediaTypes.video')) {
- let video = bidRequest.mediaTypes.video;
- let sizes = video.playerSize || bidRequest.sizes || [];
- if (sizes.length && Array.isArray(sizes[0])) {
- imp.video = {
- w: sizes[0][0],
- h: sizes[0][1]
- };
- } else if (sizes.length == 2 && !Array.isArray(sizes[0])) {
- imp.video = {
- w: sizes[0],
- h: sizes[1]
- };
- } else {
- return;
- }
-
- if (video.durationRangeSec) {
- if (Array.isArray(video.durationRangeSec)) {
- if (video.durationRangeSec.length == 1) {
- imp.video.maxduration = video.durationRangeSec[0];
- } else if (video.durationRangeSec.length == 2) {
- imp.video.minduration = video.durationRangeSec[0];
- imp.video.maxduration = video.durationRangeSec[1];
- }
- } else {
- imp.video.maxduration = video.durationRangeSec;
- }
- }
- if (bidRequest.params.video) {
- Object.keys(bidRequest.params.video).forEach(k => {
- if (VIDEO_PARAMS.indexOf(k) > -1) {
- imp.video[k] = bidRequest.params.video[k];
- }
- });
+ // ADD TO THE LIST OF IMP REQUESTS
+ imps.push(imp);
}
+ } else if (utils.deepAccess(bidRequest, `mediaTypes.native`)) {
+ // ADD TO THE LIST OF IMP REQUESTS
+ imp.native = createNativeRequest(bidRequest);
+ imps.push(imp);
}
- let host = bidRequest.params.host;
- let sourceId = bidRequest.params.sourceId;
- imps[host] = imps[host] || {};
- let hostImp = imps[host][sourceId] = imps[host][sourceId] || { imps: [] };
- hostImp.imps.push(imp);
- hostImp.subid = hostImp.imps.subid || bidRequest.params.subid || 'blank';
- hostImp.path = 'search';
- hostImp.idParam = 'sid';
- hostImp.protocol = '//';
});
- // Generate Site obj
- site.domain = refurl.hostname;
- site.page = refurl.protocol + '://' + refurl.hostname + refurl.pathname;
+ // RETURN EMPTY IF THERE WERE NO PROPER ADUNIT REQUESTS TO BE MADE
+ if (!imps.length) {
+ return [];
+ }
+
+ // GENERATE SITE OBJECT
+ let site = {
+ domain: window.location.host,
+ page: bidderRequest.refererInfo.referer,
+ schain: validRequests[0].schain || {},
+ ext: {
+ p_domain: config.getConfig('publisherDomain'),
+ rt: bidderRequest.refererInfo.reachedTop,
+ frames: bidderRequest.refererInfo.numIframes,
+ stack: bidderRequest.refererInfo.stack,
+ timeout: config.getConfig('bidderTimeout')
+ },
+ }
+
+ // ADD REF URL IF FOUND
if (self === top && document.referrer) {
site.ref = document.referrer;
}
+
+ // ADD META KEYWORDS IF FOUND
let keywords = document.getElementsByTagName('meta')['keywords'];
if (keywords && keywords.content) {
site.keywords = keywords.content;
}
- // Generate Device obj.
- device.ip = 'peer';
- device.ua = window.navigator.userAgent;
- device.js = 1;
- device.language = ((navigator.language || navigator.userLanguage || '').split('-'))[0] || 'en';
-
- RtbRequest(device, site, imps).forEach(formatted => {
- requests.push({
- method: 'POST',
- url: formatted.url,
- data: formatted.body,
- options: {
- withCredentials: false
+ // GENERATE DEVICE OBJECT
+ let device = {
+ ip: 'peer',
+ ua: window.navigator.userAgent,
+ js: 1,
+ language: ((navigator.language || navigator.userLanguage || '').split('-'))[0] || 'en',
+ buyerid: this.get_dbid() || 0,
+ ext: {
+ pb_eids: validRequests[0].userIdAsEids || {},
+ syncs: this.get_syncs() || {},
+ coppa: config.getConfig('coppa') || 0,
+ gdpr: bidderRequest.gdprConsent || {},
+ usp: bidderRequest.uspConsent || {},
+ client_info: this.get_client_info(),
+ ortb2: config.getConfig('ortb2') || {}
+ }
+ };
+
+ let sourceId = validRequests[0].params.source_id || 0;
+ let host = validRequests[0].params.host || 'prebid.datablocks.net';
+
+ // RETURN WITH THE REQUEST AND PAYLOAD
+ return {
+ method: 'POST',
+ url: `https://${sourceId}.${host}/openrtb/?sid=${sourceId}`,
+ data: {
+ id: bidderRequest.auctionId,
+ imp: imps,
+ site: site,
+ device: device
+ },
+ options: {
+ withCredentials: true
+ }
+ };
+ },
+
+ // INITIATE USER SYNCING
+ getUserSyncs: function(options, rtbResponse, gdprConsent) {
+ const syncs = [];
+ let bidResponse = rtbResponse[0].body;
+ let scope = this;
+
+ // LISTEN FOR SYNC DATA FROM IFRAME TYPE SYNC
+ window.addEventListener('message', function (event) {
+ if (event.data.sentinel && event.data.sentinel === 'dblks_syncData') {
+ // STORE FOUND SYNCS
+ if (event.data.syncs) {
+ scope.store_syncs(event.data.syncs);
}
- })
+ }
});
- return requests;
-
- function RtbRequest(device, site, imps) {
- let collection = [];
- Object.keys(imps).forEach(host => {
- let sourceIds = imps[host];
- Object.keys(sourceIds).forEach(sourceId => {
- let impObj = sourceIds[sourceId];
- collection.push({
- url: `https://${host}/${impObj.path}/?${impObj.idParam}=${sourceId}`,
- body: {
- id: bidderRequest.auctionId,
- imp: impObj.imps,
- site: Object.assign({ id: impObj.subid || 'blank' }, site),
- device: Object.assign({}, device)
- }
- })
- })
+
+ // POPULATE GDPR INFORMATION
+ let gdprData = {
+ gdpr: 0,
+ gdprConsent: ''
+ }
+ if (typeof gdprConsent === 'object') {
+ if (typeof gdprConsent.gdprApplies === 'boolean') {
+ gdprData.gdpr = Number(gdprConsent.gdprApplies);
+ gdprData.gdprConsent = gdprConsent.consentString;
+ } else {
+ gdprData.gdprConsent = gdprConsent.consentString;
+ }
+ }
+
+ // EXTRACT BUYERID COOKIE VALUE FROM BID RESPONSE AND PUT INTO STORAGE
+ let dbBuyerId = this.get_dbid() || '';
+ if (bidResponse.ext && bidResponse.ext.buyerid) {
+ dbBuyerId = bidResponse.ext.buyerid;
+ this.store_dbid(dbBuyerId);
+ }
+
+ // EXTRACT USERSYNCS FROM BID RESPONSE
+ if (bidResponse.ext && bidResponse.ext.syncs) {
+ bidResponse.ext.syncs.forEach(sync => {
+ if (checkValid(sync)) {
+ syncs.push(addParams(sync));
+ }
})
+ }
+
+ // APPEND PARAMS TO SYNC URL
+ function addParams(sync) {
+ // PARSE THE URL
+ try {
+ let url = new URL(sync.url);
+ let urlParams = {};
+ for (const [key, value] of url.searchParams.entries()) {
+ urlParams[key] = value;
+ };
- return collection;
+ // APPLY EXTRA VARS
+ urlParams.gdpr = gdprData.gdpr;
+ urlParams.gdprConsent = gdprData.gdprConsent;
+ urlParams.bidid = bidResponse.bidid;
+ urlParams.id = bidResponse.id;
+ urlParams.uid = dbBuyerId;
+
+ // REBUILD URL
+ sync.url = `${url.origin}${url.pathname}?${Object.keys(urlParams).map(key => key + '=' + encodeURIComponent(urlParams[key])).join('&')}`;
+ } catch (e) {};
+
+ // RETURN THE REBUILT URL
+ return sync;
+ }
+
+ // ENSURE THAT THE SYNC TYPE IS VALID AND HAS PERMISSION
+ function checkValid(sync) {
+ if (!sync.type || !sync.url) {
+ return false;
+ }
+ switch (sync.type) {
+ case 'iframe':
+ return options.iframeEnabled;
+ case 'image':
+ return options.pixelEnabled;
+ default:
+ return false;
+ }
}
+ return syncs;
},
- interpretResponse: function(serverResponse, bidRequest) {
- if (!serverResponse || !serverResponse.body || !serverResponse.body.seatbid) {
- return [];
+
+ // DATABLOCKS WON THE AUCTION - REPORT SUCCESS
+ onBidWon: function(bid) {
+ this.queue_metric({type: 'bid_won', source_id: bid.params[0].source_id, req_id: bid.requestId, slot_id: bid.adUnitCode, auction_id: bid.auctionId, size: bid.size, cpm: bid.cpm, pb: bid.adserverTargeting.hb_pb, rt: bid.timeToRespond, ttl: bid.ttl});
+ },
+
+ // TARGETING HAS BEEN SET
+ onSetTargeting: function(bid) {
+ // LISTEN FOR VIEWABILITY EVENTS
+ this.get_viewability(bid);
+ },
+
+ // PARSE THE RTB RESPONSE AND RETURN FINAL RESULTS
+ interpretResponse: function(rtbResponse, bidRequest) {
+ // CONVERT NATIVE RTB RESPONSE INTO PREBID RESPONSE
+ function parseNative(native) {
+ const {assets, link, imptrackers, jstracker} = native;
+ const result = {
+ clickUrl: link.url,
+ clickTrackers: link.clicktrackers || [],
+ impressionTrackers: imptrackers || [],
+ javascriptTrackers: jstracker ? [jstracker] : []
+ };
+
+ (assets || []).forEach((asset) => {
+ const {id, img, data, title} = asset;
+ const key = NATIVE_ID_MAP[id];
+ if (key) {
+ if (!utils.isEmpty(title)) {
+ result.title = title.text
+ } else if (!utils.isEmpty(img)) {
+ result[key] = {
+ url: img.url,
+ height: img.h,
+ width: img.w
+ }
+ } else if (!utils.isEmpty(data)) {
+ result[key] = data.value;
+ }
+ }
+ });
+
+ return result;
}
- let body = serverResponse.body;
-
- let bids = body.seatbid
- .map(seatbid => seatbid.bid)
- .reduce((memo, bid) => memo.concat(bid), []);
- let req = bidRequest.data;
- let reqImps = req.imp;
-
- return bids.map(rtbBid => {
- let imp;
- for (let i in reqImps) {
- let testImp = reqImps[i]
- if (testImp.id == rtbBid.impid) {
- imp = testImp;
+
+ let bids = [];
+ let resBids = utils.deepAccess(rtbResponse, 'body.seatbid') || [];
+ resBids.forEach(bid => {
+ let resultItem = {requestId: bid.id, cpm: bid.price, creativeId: bid.crid, currency: bid.currency || 'USD', netRevenue: true, ttl: bid.ttl || 360, meta: {advertiserDomains: bid.adomain}};
+
+ let mediaType = utils.deepAccess(bid, 'ext.mtype') || '';
+ switch (mediaType) {
+ case 'banner':
+ bids.push(Object.assign({}, resultItem, {mediaType: BANNER, width: bid.w, height: bid.h, ad: bid.adm}));
+ break;
+
+ case 'native':
+ let nativeResult = JSON.parse(bid.adm);
+ bids.push(Object.assign({}, resultItem, {mediaType: NATIVE, native: parseNative(nativeResult.native)}));
+ break;
+
+ default:
break;
- }
}
- let br = {
- requestId: rtbBid.impid,
- cpm: rtbBid.price,
- creativeId: rtbBid.crid,
- currency: rtbBid.currency || 'USD',
- netRevenue: true,
- ttl: 360
- };
- if (!imp) {
- return br;
- } else if (imp.banner) {
- br.mediaType = BANNER;
- br.width = rtbBid.w;
- br.height = rtbBid.h;
- br.ad = rtbBid.adm;
- } else if (imp.native) {
- br.mediaType = NATIVE;
-
- let reverseNativeMap = {};
- let nativeKeys = Object.keys(NATIVE_MAP);
- nativeKeys.forEach(k => {
- reverseNativeMap[NATIVE_MAP[k]] = k;
- });
+ })
+
+ return bids;
+ }
+};
+
+// DETECT BOTS
+export class BotClientTests {
+ constructor() {
+ this.tests = {
+ headless_chrome: function() {
+ if (self.navigator) {
+ if (self.navigator.webdriver) {
+ return true;
+ }
+ }
- let idMap = {};
- let nativeReq = JSON.parse(imp.native.request);
- if (nativeReq.native && nativeReq.native.assets) {
- nativeReq.native.assets.forEach(asset => {
- if (asset.data) { idMap[asset.id] = reverseNativeMap[asset.data.type]; }
+ return false;
+ },
+
+ selenium: function () {
+ let response = false;
+
+ if (window && document) {
+ let results = [
+ 'webdriver' in window,
+ '_Selenium_IDE_Recorder' in window,
+ 'callSelenium' in window,
+ '_selenium' in window,
+ '__webdriver_script_fn' in document,
+ '__driver_evaluate' in document,
+ '__webdriver_evaluate' in document,
+ '__selenium_evaluate' in document,
+ '__fxdriver_evaluate' in document,
+ '__driver_unwrapped' in document,
+ '__webdriver_unwrapped' in document,
+ '__selenium_unwrapped' in document,
+ '__fxdriver_unwrapped' in document,
+ '__webdriver_script_func' in document,
+ document.documentElement.getAttribute('selenium') !== null,
+ document.documentElement.getAttribute('webdriver') !== null,
+ document.documentElement.getAttribute('driver') !== null
+ ];
+
+ results.forEach(result => {
+ if (result === true) {
+ response = true;
+ }
})
}
- const nativeResponse = JSON.parse(rtbBid.adm);
- const { assets, link, imptrackers, jstrackers } = nativeResponse.native;
- const result = {
- clickUrl: link.url,
- clickTrackers: link.clicktrackers || undefined,
- impressionTrackers: imptrackers || undefined,
- javascriptTrackers: jstrackers ? [jstrackers] : undefined
- };
- assets.forEach(asset => {
- if (asset.title) {
- result.title = asset.title.text;
- } else if (asset.img) {
- result.image = asset.img.url;
- } else if (idMap[asset.id]) {
- result[idMap[asset.id]] = asset.data.value;
- }
- })
- br.native = result;
- } else if (imp.video) {
- br.mediaType = VIDEO;
- br.width = rtbBid.w;
- br.height = rtbBid.h;
- if (rtbBid.adm) { br.vastXml = rtbBid.adm; } else if (rtbBid.nurl) { br.vastUrl = rtbBid.nurl; }
+ return response;
+ },
+ }
+ }
+ doTests() {
+ let response = false;
+ for (const i of Object.keys(this.tests)) {
+ if (this.tests[i]() === true) {
+ response = true;
}
- return br;
- });
+ }
+ return response;
}
+}
-};
+// INIT OUR BIDDER WITH PREBID
registerBidder(spec);
diff --git a/modules/datablocksBidAdapter.md b/modules/datablocksBidAdapter.md
index e30cd361974..ad2eb4afc53 100644
--- a/modules/datablocksBidAdapter.md
+++ b/modules/datablocksBidAdapter.md
@@ -8,8 +8,8 @@ Maintainer: support@datablocks.net
# Description
-Connects to Datablocks Version 5 Platform
-Banner Native and Video
+Connects to Datablocks Exchange
+Banner and Native
# Test Parameters
@@ -27,12 +27,13 @@ Banner Native and Video
{
bidder: 'datablocks',
params: {
- sourceId: 12345,
+ source_id: 12345,
host: 'prebid.datablocks.net'
}
}
]
- }, {
+ },
+ {
code: 'native-div',
mediaTypes : {
native: {
@@ -44,30 +45,11 @@ Banner Native and Video
{
bidder: 'datablocks',
params: {
- sourceId: 12345,
+ source_id: 12345,
host: 'prebid.datablocks.net'
}
- }, {
- code: 'video-div',
- mediaTypes : {
- video: {
- playerSize:[500,400],
- durationRangeSec:[15,30],
- context: "linear"
- }
- },
- bids: [
- {
- bidder: 'datablocks',
- params: {
- sourceId: 12345,
- host: 'prebid.datablocks.net',
- video: {
- mimes:["video/flv"]
- }
- }
}
]
}
];
-```
\ No newline at end of file
+```
diff --git a/modules/deepintentBidAdapter.js b/modules/deepintentBidAdapter.js
index a6a6cac6570..25c6ee9b25b 100644
--- a/modules/deepintentBidAdapter.js
+++ b/modules/deepintentBidAdapter.js
@@ -137,6 +137,7 @@ function injectEids(openRtbBidRequest, validBidRequests) {
const bidUserIdAsEids = utils.deepAccess(validBidRequests, '0.userIdAsEids');
if (utils.isArray(bidUserIdAsEids) && bidUserIdAsEids.length > 0) {
utils.deepSetValue(openRtbBidRequest, 'user.eids', bidUserIdAsEids);
+ utils.deepSetValue(openRtbBidRequest, 'user.ext.eids', bidUserIdAsEids);
}
}
diff --git a/modules/dfpAdServerVideo.js b/modules/dfpAdServerVideo.js
index 22c904b604c..79cb03ec001 100644
--- a/modules/dfpAdServerVideo.js
+++ b/modules/dfpAdServerVideo.js
@@ -123,7 +123,7 @@ export function notifyTranslationModule(fn) {
fn.call(this, 'dfp');
}
-getHook('registerAdserver').before(notifyTranslationModule);
+if (config.getConfig('brandCategoryTranslation.translationFile')) { getHook('registerAdserver').before(notifyTranslationModule); }
/**
* @typedef {Object} DfpAdpodOptions
@@ -271,7 +271,7 @@ function getCustParams(bid, options) {
const prebidTargetingSet = Object.assign({},
// Why are we adding standard keys here ? Refer https://github.com/prebid/Prebid.js/issues/3664
{ hb_uuid: bid && bid.videoCacheKey },
- // hb_uuid will be deprecated and replaced by hb_cache_id
+ // hb_cache_id became optional in prebid 5.0 after 4.x enabled the concept of optional keys. Discussion led to reversing the prior expectation of deprecating hb_uuid
{ hb_cache_id: bid && bid.videoCacheKey },
allTargetingData,
adserverTargeting,
diff --git a/modules/dgkeywordRtdProvider.js b/modules/dgkeywordRtdProvider.js
new file mode 100644
index 00000000000..58cec36a6b9
--- /dev/null
+++ b/modules/dgkeywordRtdProvider.js
@@ -0,0 +1,134 @@
+/**
+ * This module adds dgkeyword provider to the real time data module
+ * The {@link module:modules/realTimeData} module is required
+ * The module will get keywords from 1plux profile api.
+ * This module can work only with AppNexusBidAdapter.
+ * @module modules/dgkeywordProvider
+ * @requires module:modules/realTimeData
+ */
+
+import * as utils from '../src/utils.js';
+import { ajax } from '../src/ajax.js';
+import { submodule } from '../src/hook.js';
+import { getGlobal } from '../src/prebidGlobal.js';
+
+/**
+ * get keywords from api server. and set keywords.
+ * @param {Object} reqBidsConfigObj
+ * @param {function} callback
+ * @param {Object} moduleConfig
+ * @param {Object} userConsent
+ */
+export function getDgKeywordsAndSet(reqBidsConfigObj, callback, moduleConfig, userConsent) {
+ const URL = 'https://mediaconsortium.profiles.tagger.opecloud.com/api/v1?url=';
+ const PROFILE_TIMEOUT_MS = 1000;
+ const timeout = (moduleConfig && moduleConfig.params && moduleConfig.params.timeout && Number(moduleConfig.params.timeout) > 0) ? Number(moduleConfig.params.timeout) : PROFILE_TIMEOUT_MS;
+ const url = (moduleConfig && moduleConfig.params && moduleConfig.params.url) ? moduleConfig.params.url : URL + encodeURIComponent(window.location.href);
+ const adUnits = reqBidsConfigObj.adUnits || getGlobal().adUnits;
+ let isFinish = false;
+ utils.logMessage('[dgkeyword sub module]', adUnits, timeout);
+ let setKeywordTargetBidders = getTargetBidderOfDgKeywords(adUnits);
+ if (setKeywordTargetBidders.length <= 0) {
+ utils.logMessage('[dgkeyword sub module] no dgkeyword targets.');
+ callback();
+ } else {
+ utils.logMessage('[dgkeyword sub module] dgkeyword targets:', setKeywordTargetBidders);
+ utils.logMessage('[dgkeyword sub module] get targets from profile api start.');
+ ajax(url, {
+ success: function(response) {
+ const res = JSON.parse(response);
+ if (!isFinish) {
+ utils.logMessage('[dgkeyword sub module] get targets from profile api end.');
+ if (res) {
+ let keywords = {};
+ if (res['s'] != null && res['s'].length > 0) {
+ keywords['opeaud'] = res['s'];
+ }
+ if (res['t'] != null && res['t'].length > 0) {
+ keywords['opectx'] = res['t'];
+ }
+ if (Object.keys(keywords).length > 0) {
+ const targetBidKeys = {}
+ for (let bid of setKeywordTargetBidders) {
+ // set keywords to params
+ bid.params.keywords = keywords;
+ if (!targetBidKeys[bid.bidder]) {
+ targetBidKeys[bid.bidder] = true;
+ }
+ }
+
+ if (!reqBidsConfigObj._ignoreSetOrtb2) {
+ // set keywrods to ortb2
+ let addOrtb2 = {};
+ utils.deepSetValue(addOrtb2, 'site.keywords', keywords);
+ utils.deepSetValue(addOrtb2, 'user.keywords', keywords);
+ const ortb2 = {ortb2: addOrtb2};
+ reqBidsConfigObj.setBidderConfig({ bidders: Object.keys(targetBidKeys), config: ortb2 });
+ }
+ }
+ }
+ isFinish = true;
+ }
+ callback();
+ },
+ error: function(errorStatus) {
+ // error occur
+ utils.logError('[dgkeyword sub module] profile api access error.', errorStatus);
+ callback();
+ }
+ }, null, {
+ withCredentials: true,
+ contentType: 'application/json',
+ });
+ setTimeout(function () {
+ if (!isFinish) {
+ // profile api timeout
+ utils.logInfo('[dgkeyword sub module] profile api timeout. [timeout: ' + timeout + 'ms]');
+ isFinish = true;
+ }
+ callback();
+ }, timeout);
+ }
+}
+
+/**
+ * get all bidder which hava {dgkeyword: true} in params
+ * @param {Object} adUnits
+ */
+export function getTargetBidderOfDgKeywords(adUnits) {
+ let setKeywordTargetBidders = [];
+ for (let adUnit of adUnits) {
+ for (let bid of adUnit.bids) {
+ if (bid.params && bid.params['dgkeyword'] === true) {
+ delete bid.params['dgkeyword'];
+ setKeywordTargetBidders.push(bid);
+ }
+ }
+ }
+ return setKeywordTargetBidders;
+}
+
+/** @type {RtdSubmodule} */
+export const dgkeywordSubmodule = {
+ /**
+ * used to link submodule with realTimeData
+ * @type {string}
+ */
+ name: 'dgkeyword',
+ /**
+ * get data and send back to realTimeData module
+ * @function
+ * @param {string[]} adUnitsCodes
+ */
+ getBidRequestData: getDgKeywordsAndSet,
+ init: init,
+};
+
+function init(moduleConfig) {
+ return true;
+}
+
+function registerSubModule() {
+ submodule('realTimeData', dgkeywordSubmodule);
+}
+registerSubModule();
diff --git a/modules/dgkeywordRtdProvider.md b/modules/dgkeywordRtdProvider.md
new file mode 100644
index 00000000000..314475b45a8
--- /dev/null
+++ b/modules/dgkeywordRtdProvider.md
@@ -0,0 +1,29 @@
+ ## Integration
+
+1) Compile the Digital Garage Keyword Module and Appnexus Bid Adapter into your Prebid build:
+
+```
+gulp build --modules="dgkeywordRtdProvider,appnexusBidAdapter,..."
+```
+
+2) Use `setConfig` to instruct Prebid.js to initilize the dgkeyword module, as specified below.
+
+## Configuration
+
+This module is configured as part of the `realTimeData.dataProviders`
+
+```javascript
+var DGKEYWORD_TIMEOUT = 1000;
+pbjs.setConfig({
+ realTimeData: {
+ auctionDelay: DGKEYWORD_TIMEOUT,
+ dataProviders: [{
+ name: 'dgkeyword',
+ waitForIt: true,
+ params: {
+ timeout: DGKEYWORD_TIMEOUT
+ }
+ }]
+ }
+});
+```
diff --git a/modules/districtmDMXBidAdapter.js b/modules/districtmDMXBidAdapter.js
index ec0a0a2f2e6..a35965c4cb4 100644
--- a/modules/districtmDMXBidAdapter.js
+++ b/modules/districtmDMXBidAdapter.js
@@ -120,7 +120,6 @@ export const spec = {
bindUserId(eids, utils.deepAccess(bidRequest[0], `userId.lotamePanoramaId`), 'lotame.com', 1);
bindUserId(eids, utils.deepAccess(bidRequest[0], `userId.parrableId`), 'parrable.com', 1);
bindUserId(eids, utils.deepAccess(bidRequest[0], `userId.netId`), 'netid.de', 1);
- bindUserId(eids, utils.deepAccess(bidRequest[0], `userId.sharedid`), 'sharedid.org', 1);
dmxRequest.user = dmxRequest.user || {};
dmxRequest.user.ext = dmxRequest.user.ext || {};
dmxRequest.user.ext.eids = eids;
diff --git a/modules/djaxBidAdapter.js b/modules/djaxBidAdapter.js
deleted file mode 100644
index ffaf61a3f15..00000000000
--- a/modules/djaxBidAdapter.js
+++ /dev/null
@@ -1,129 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { config } from '../src/config.js';
-import * as utils from '../src/utils.js';
-import {BANNER, VIDEO} from '../src/mediaTypes.js';
-import { ajax } from '../src/ajax.js';
-import {Renderer} from '../src/Renderer.js';
-
-const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
-const BIDDER_CODE = 'djax';
-const DOMAIN = 'https://demo.reviveadservermod.com/headerbidding_adminshare/';
-const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';
-
-function isBidRequestValid(bid) {
- return (typeof bid.params !== 'undefined' && parseInt(utils.getValue(bid.params, 'publisherId')) > 0);
-}
-
-function buildRequests(validBidRequests) {
- return {
- method: 'POST',
- url: DOMAIN + 'www/admin/plugins/Prebid/getAd.php',
- options: {
- withCredentials: false,
- crossOrigin: true
- },
- data: validBidRequests,
- };
-}
-
-function interpretResponse(serverResponse, request) {
- const response = serverResponse.body;
- const bidResponses = [];
- var bidRequestResponses = [];
-
- utils._each(response, function(bidAd) {
- bidAd.adResponse = {
- content: bidAd.vastXml,
- height: bidAd.height,
- width: bidAd.width
- };
- bidAd.ttl = config.getConfig('_bidderTimeout')
- bidAd.renderer = bidAd.context === 'outstream' ? createRenderer(bidAd, {
- id: bidAd.adUnitCode,
- url: RENDERER_URL
- }, bidAd.adUnitCode) : undefined;
- bidResponses.push(bidAd);
- });
-
- bidRequestResponses.push({
- function: 'saveResponses',
- request: request,
- response: bidResponses
- });
- sendResponseToServer(bidRequestResponses);
- return bidResponses;
-}
-
-function outstreamRender(bidAd) {
- bidAd.renderer.push(() => {
- window.ANOutstreamVideo.renderAd({
- sizes: [bidAd.width, bidAd.height],
- width: bidAd.width,
- height: bidAd.height,
- targetId: bidAd.adUnitCode,
- adResponse: bidAd.adResponse,
- rendererOptions: {
- showVolume: false,
- allowFullscreen: false
- }
- });
- });
-}
-
-function createRenderer(bidAd, rendererParams, adUnitCode) {
- const renderer = Renderer.install({
- id: rendererParams.id,
- url: rendererParams.url,
- loaded: false,
- config: {'player_height': bidAd.height, 'player_width': bidAd.width},
- adUnitCode
- });
- try {
- renderer.setRender(outstreamRender);
- } catch (err) {
- utils.logWarn('Prebid Error calling setRender on renderer', err);
- }
- return renderer;
-}
-
-function onBidWon(bid) {
- let wonBids = [];
- wonBids.push(bid);
- wonBids[0].function = 'onBidWon';
- sendResponseToServer(wonBids);
-}
-
-function onTimeout(details) {
- details.unshift({ 'function': 'onTimeout' });
- sendResponseToServer(details);
-}
-
-function sendResponseToServer(data) {
- ajax(DOMAIN + 'www/admin/plugins/Prebid/tracking/track.php', null, JSON.stringify(data), {
- withCredentials: false,
- method: 'POST',
- crossOrigin: true
- });
-}
-
-function getUserSyncs(syncOptions) {
- if (syncOptions.iframeEnabled) {
- return [{
- type: 'iframe',
- url: DOMAIN + 'www/admin/plugins/Prebid/userSync.php'
- }];
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: SUPPORTED_AD_TYPES,
- isBidRequestValid,
- buildRequests,
- interpretResponse,
- getUserSyncs,
- onBidWon,
- onTimeout
-};
-
-registerBidder(spec);
diff --git a/modules/dmdIdSystem.js b/modules/dmdIdSystem.js
index 7cf7b9fac95..72d3518c20f 100644
--- a/modules/dmdIdSystem.js
+++ b/modules/dmdIdSystem.js
@@ -7,6 +7,9 @@
import * as utils from '../src/utils.js';
import { submodule } from '../src/hook.js';
+import { ajax } from '../src/ajax.js';
+
+const MODULE_NAME = 'dmdId';
/** @type {Submodule} */
export const dmdIdSubmodule = {
@@ -14,7 +17,7 @@ export const dmdIdSubmodule = {
* used to link submodule with config
* @type {string}
*/
- name: 'dmdId',
+ name: MODULE_NAME,
/**
* decode the stored id value for passing to bid requests
@@ -37,22 +40,52 @@ export const dmdIdSubmodule = {
* @returns {IdResponse|undefined}
*/
getId(config, consentData, cacheIdObj) {
- try {
- const configParams = (config && config.params) || {};
- if (
- !configParams ||
- !configParams.api_key ||
- typeof configParams.api_key !== 'string'
- ) {
- utils.logError('dmd submodule requires an api_key.');
- return;
- } else {
- return cacheIdObj;
- }
- } catch (e) {
- utils.logError(`dmdIdSystem encountered an error`, e);
+ const configParams = (config && config.params) || {};
+ if (
+ !configParams ||
+ !configParams.api_key ||
+ typeof configParams.api_key !== 'string'
+ ) {
+ utils.logError('dmd submodule requires an api_key.');
+ return;
}
- },
+ // If cahceIdObj is null or undefined - calling AIX-API
+ if (cacheIdObj) {
+ return cacheIdObj;
+ } else {
+ const url = configParams && configParams.api_url
+ ? configParams.api_url
+ : `https://aix.hcn.health/api/v1/auths`;
+ // Setting headers
+ const headers = {};
+ headers['x-api-key'] = configParams.api_key;
+ headers['x-domain'] = utils.getWindowLocation();
+ // Response callbacks
+ const resp = function (callback) {
+ const callbacks = {
+ success: response => {
+ let responseObj;
+ let responseId;
+ try {
+ responseObj = JSON.parse(response);
+ if (responseObj && responseObj.dgid) {
+ responseId = responseObj.dgid;
+ }
+ } catch (error) {
+ utils.logError(error);
+ }
+ callback(responseId);
+ },
+ error: error => {
+ utils.logError(`${MODULE_NAME}: ID fetch encountered an error`, error);
+ callback();
+ }
+ };
+ ajax(url, callbacks, undefined, { method: 'GET', withCredentials: true, customHeaders: headers });
+ };
+ return { callback: resp };
+ }
+ }
};
submodule('userId', dmdIdSubmodule);
diff --git a/modules/dspxBidAdapter.js b/modules/dspxBidAdapter.js
index dd49a744225..df0f6f3b8ea 100644
--- a/modules/dspxBidAdapter.js
+++ b/modules/dspxBidAdapter.js
@@ -7,9 +7,11 @@ const BIDDER_CODE = 'dspx';
const ENDPOINT_URL = 'https://buyer.dspx.tv/request/';
const ENDPOINT_URL_DEV = 'https://dcbuyer.dspx.tv/request/';
const DEFAULT_VAST_FORMAT = 'vast2';
+const GVLID = 602;
export const spec = {
code: BIDDER_CODE,
+ gvlid: GVLID,
aliases: ['dspx'],
supportedMediaTypes: [BANNER, VIDEO],
isBidRequestValid: function(bid) {
@@ -19,10 +21,6 @@ export const spec = {
return validBidRequests.map(bidRequest => {
const params = bidRequest.params;
- const videoData = utils.deepAccess(bidRequest, 'mediaTypes.video') || {};
- const sizes = utils.parseSizesInput(videoData.playerSize || bidRequest.sizes)[0];
- const [width, height] = sizes.split('x');
-
const placementId = params.placement;
const rnd = Math.floor(Math.random() * 99999999999);
const referrer = bidderRequest.refererInfo.referer;
@@ -32,26 +30,28 @@ export const spec = {
let endpoint = isDev ? ENDPOINT_URL_DEV : ENDPOINT_URL;
let payload = {};
- if (isVideoRequest(bidRequest)) {
- let vastFormat = params.vastFormat || DEFAULT_VAST_FORMAT;
+ if (isBannerRequest(bidRequest)) {
+ let size = getBannerSizes(bidRequest)[0];
payload = {
- _f: vastFormat,
+ _f: 'html',
alternative: 'prebid_js',
inventory_item_id: placementId,
- srw: width,
- srh: height,
+ srw: size.width,
+ srh: size.height,
idt: 100,
rnd: rnd,
ref: referrer,
bid_id: bidId,
};
} else {
+ let size = getVideoSizes(bidRequest)[0];
+ let vastFormat = params.vastFormat || DEFAULT_VAST_FORMAT;
payload = {
- _f: 'html',
+ _f: vastFormat,
alternative: 'prebid_js',
inventory_item_id: placementId,
- srw: width,
- srh: height,
+ srw: size.width,
+ srh: size.height,
idt: 100,
rnd: rnd,
ref: referrer,
@@ -86,6 +86,14 @@ export const spec = {
if (isDev) {
payload.prebidDevMode = 1;
}
+
+ if (bidRequest.userId && bidRequest.userId.netId) {
+ payload.did_netid = bidRequest.userId.netId;
+ }
+ if (bidRequest.userId && bidRequest.userId.uid2) {
+ payload.did_uid2 = bidRequest.userId.uid2;
+ }
+
return {
method: 'GET',
url: endpoint,
@@ -112,7 +120,10 @@ export const spec = {
currency: currency,
netRevenue: netRevenue,
type: response.type,
- ttl: config.getConfig('_bidderTimeout')
+ ttl: config.getConfig('_bidderTimeout'),
+ meta: {
+ advertiserDomains: response.adomain || []
+ }
};
if (response.vastXml) {
bidResponse.vastXml = response.vastXml;
@@ -120,6 +131,7 @@ export const spec = {
} else {
bidResponse.ad = response.adTag;
}
+
bidResponses.push(bidResponse);
}
return bidResponses;
@@ -140,17 +152,19 @@ export const spec = {
}
}
- if (syncOptions.iframeEnabled) {
- serverResponses[0].body.userSync.iframeUrl.forEach((url) => syncs.push({
- type: 'iframe',
- url: appendToUrl(url, gdprParams)
- }));
- }
- if (syncOptions.pixelEnabled && serverResponses.length > 0) {
- serverResponses[0].body.userSync.imageUrl.forEach((url) => syncs.push({
- type: 'image',
- url: appendToUrl(url, gdprParams)
- }));
+ if (serverResponses.length > 0 && serverResponses[0].body.userSync) {
+ if (syncOptions.iframeEnabled) {
+ serverResponses[0].body.userSync.iframeUrl.forEach((url) => syncs.push({
+ type: 'iframe',
+ url: appendToUrl(url, gdprParams)
+ }));
+ }
+ if (syncOptions.pixelEnabled) {
+ serverResponses[0].body.userSync.imageUrl.forEach((url) => syncs.push({
+ type: 'image',
+ url: appendToUrl(url, gdprParams)
+ }));
+ }
}
return syncs;
}
@@ -178,6 +192,16 @@ function objectToQueryString(obj, prefix) {
return str.join('&');
}
+/**
+ * Check if it's a banner bid request
+ *
+ * @param {BidRequest} bid - Bid request generated from ad slots
+ * @returns {boolean} True if it's a banner bid
+ */
+function isBannerRequest(bid) {
+ return bid.mediaType === 'banner' || !!utils.deepAccess(bid, 'mediaTypes.banner') || !isVideoRequest(bid);
+}
+
/**
* Check if it's a video bid request
*
@@ -188,4 +212,48 @@ function isVideoRequest(bid) {
return bid.mediaType === 'video' || !!utils.deepAccess(bid, 'mediaTypes.video');
}
+/**
+ * Get video sizes
+ *
+ * @param {BidRequest} bid - Bid request generated from ad slots
+ * @returns {object} True if it's a video bid
+ */
+function getVideoSizes(bid) {
+ return parseSizes(utils.deepAccess(bid, 'mediaTypes.video.playerSize') || bid.sizes);
+}
+
+/**
+ * Get banner sizes
+ *
+ * @param {BidRequest} bid - Bid request generated from ad slots
+ * @returns {object} True if it's a video bid
+ */
+function getBannerSizes(bid) {
+ return parseSizes(utils.deepAccess(bid, 'mediaTypes.banner.sizes') || bid.sizes);
+}
+
+/**
+ * Parse size
+ * @param sizes
+ * @returns {width: number, h: height}
+ */
+function parseSize(size) {
+ let sizeObj = {}
+ sizeObj.width = parseInt(size[0], 10);
+ sizeObj.height = parseInt(size[1], 10);
+ return sizeObj;
+}
+
+/**
+ * Parse sizes
+ * @param sizes
+ * @returns {{width: number , height: number }[]}
+ */
+function parseSizes(sizes) {
+ if (Array.isArray(sizes[0])) { // is there several sizes ? (ie. [[728,90],[200,300]])
+ return sizes.map(size => parseSize(size));
+ }
+ return [parseSize(sizes)]; // or a single one ? (ie. [728,90])
+}
+
registerBidder(spec);
diff --git a/modules/e_volutionBidAdapter.js b/modules/e_volutionBidAdapter.js
deleted file mode 100644
index 9fc7035db32..00000000000
--- a/modules/e_volutionBidAdapter.js
+++ /dev/null
@@ -1,111 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'e_volution';
-const AD_URL = 'https://service.e-volution.ai/?c=o&m=multi';
-const URL_SYNC = 'https://service.e-volution.ai/?c=o&m=sync';
-const NO_SYNC = true;
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId ||
- !bid.ttl || !bid.currency) {
- return false;
- }
- switch (bid.mediaType) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- return Boolean(bid.native && bid.native.title && bid.native.image && bid.native.impressionTrackers);
- default:
- return false;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
- noSync: NO_SYNC,
-
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(parseInt(bid.params.placementId)));
- },
-
- buildRequests: (validBidRequests = [], bidderRequest) => {
- let winTop = window;
- let location;
- try {
- location = new URL(bidderRequest.refererInfo.referer)
- winTop = window.top;
- } catch (e) {
- location = winTop.location;
- utils.logMessage(e);
- };
- let placements = [];
- let request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language.split('-')[0] : '',
- 'secure': 1,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
- if (bidderRequest) {
- if (bidderRequest.uspConsent) {
- request.ccpa = bidderRequest.uspConsent;
- }
- if (bidderRequest.gdprConsent) {
- request.gdpr = bidderRequest.gdprConsent
- }
- }
- const len = validBidRequests.length;
-
- for (let i = 0; i < len; i++) {
- let bid = validBidRequests[i];
- let traff = bid.params.traffic || BANNER
-
- placements.push({
- placementId: bid.params.placementId,
- bidId: bid.bidId,
- sizes: bid.mediaTypes && bid.mediaTypes[traff] && bid.mediaTypes[traff].sizes ? bid.mediaTypes[traff].sizes : [],
- traffic: traff
- });
- if (bid.schain) {
- placements.schain = bid.schain;
- }
- }
- return {
- method: 'POST',
- url: AD_URL,
- data: request
- };
- },
-
- interpretResponse: (serverResponse) => {
- let response = [];
- for (let i = 0; i < serverResponse.body.length; i++) {
- let resItem = serverResponse.body[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- return response;
- },
-
- getUserSyncs: (syncOptions, serverResponses) => {
- if (NO_SYNC) {
- return false
- } else {
- return [{
- type: 'image',
- url: URL_SYNC
- }];
- }
- }
-
-};
-
-registerBidder(spec);
diff --git a/modules/ebdrBidAdapter.js b/modules/ebdrBidAdapter.js
index c30c10d8a90..cfbbbee61cb 100644
--- a/modules/ebdrBidAdapter.js
+++ b/modules/ebdrBidAdapter.js
@@ -98,7 +98,11 @@ export const spec = {
height: ebdrBid.h,
currency: 'USD',
netRevenue: true,
- ttl: 3600 }
+ ttl: 3600,
+ meta: {
+ advertiserDomains: ebdrBid.adomain || []
+ }
+ };
if (vastURL) {
response.vastUrl = vastURL;
}
diff --git a/modules/edgequeryxBidAdapter.js b/modules/edgequeryxBidAdapter.js
deleted file mode 100644
index ee50946ee18..00000000000
--- a/modules/edgequeryxBidAdapter.js
+++ /dev/null
@@ -1,98 +0,0 @@
-import * as utils from '../src/utils.js';
-import { config } from '../src/config.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'edgequeryx';
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['eqx'], // short code
- 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: function (bid) {
- return !!(bid.params && bid.params.accountId && bid.params.widgetId);
- },
-
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} validBidRequests an array of bids
- * @param {BidderRequest} bidderRequest bidder request object
- * @return {ServerRequest[]} Info describing the request to the server.
- */
- buildRequests: function (validBidRequests, bidderRequest) {
- // use bidderRequest.bids[] to get bidder-dependent request info
- // if your bidder supports multiple currencies, use config.getConfig(currency)
- // to find which one the ad server needs
-
- // pull requested transaction ID from bidderRequest.bids[].transactionId
- return validBidRequests.map(bid => {
- // Common bid request attributes for banner, outstream and instream.
- let payload = {
- accountId: bid.params.accountId,
- widgetId: bid.params.widgetId,
- currencyCode: 'EUR',
- tagId: bid.adUnitCode,
- transactionId: bid.transactionId,
- timeout: config.getConfig('bidderTimeout'),
- bidId: bid.bidId,
- prebidVersion: '$prebid.version$'
- };
-
- const bannerMediaType = utils.deepAccess(bid, 'mediaTypes.banner');
- payload.sizes = bannerMediaType.sizes.map(size => ({
- w: size[0],
- h: size[1]
- }));
-
- var payloadString = JSON.stringify(payload);
-
- return {
- method: 'POST',
- url: (bid.params.domain !== undefined ? bid.params.domain : 'https://deep.edgequery.io') + '/prebid/x',
- data: payloadString,
- };
- });
- },
-
- /**
- * Unpack the response from the server into a list of bids.
- *
- * @param {*} serverResponse A successful response from the server.
- * @param {*} bidRequestString
- * @return {Bid[]} An array of bids which were nested inside the server.
- */
- interpretResponse: function (serverResponse, bidRequestString) {
- const bidResponses = [];
- let response = serverResponse.body;
- try {
- if (response) {
- let bidResponse = {
- requestId: response.requestId,
- cpm: response.cpm,
- currency: response.currency,
- width: response.width,
- height: response.height,
- ad: response.ad,
- ttl: response.ttl,
- creativeId: response.creativeId,
- netRevenue: response.netRevenue
- };
-
- bidResponses.push(bidResponse);
- }
- } catch (error) {
- utils.logError('Error while parsing Edge Query X response', error);
- }
- return bidResponses;
- }
-
-};
-
-registerBidder(spec);
diff --git a/modules/emoteevBidAdapter.js b/modules/emoteevBidAdapter.js
deleted file mode 100644
index e0f88725d8a..00000000000
--- a/modules/emoteevBidAdapter.js
+++ /dev/null
@@ -1,525 +0,0 @@
-/**
- * This file contains Emoteev bid adpater.
- *
- * It is organised as follows:
- * - Constants values;
- * - Spec API functions, which should be pristine pure;
- * - Ancillary functions, which should be as pure as possible;
- * - Adapter API, where unpure side-effects happen.
- *
- * The code style is « functional core, imperative shell ».
- *
- * @link https://www.emoteev.io
- * @file This files defines the spec of EmoteevBidAdapter.
- * @author Emoteev Engineering .
- */
-
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import {BANNER} from '../src/mediaTypes.js';
-import {
- triggerPixel,
- getUniqueIdentifierStr,
- contains,
- deepAccess,
- isArray,
- isInteger,
- getParameterByName,
- buildUrl
-} from '../src/utils.js';
-import {config} from '../src/config.js';
-import { getStorageManager } from '../src/storageManager.js';
-
-export const storage = getStorageManager();
-
-export const BIDDER_CODE = 'emoteev';
-
-/**
- * Version number of the adapter API.
- */
-export const ADAPTER_VERSION = '1.35.0';
-
-export const DOMAIN = 'prebid.emoteev.xyz';
-export const DOMAIN_STAGING = 'prebid-staging.emoteev.xyz';
-export const DOMAIN_DEVELOPMENT = 'localhost:3000';
-
-/**
- * Path of Emoteev endpoint for events.
- */
-export const EVENTS_PATH = '/api/ad_event.json';
-
-/**
- * Path of Emoteev bidder.
- */
-export const BIDDER_PATH = '/api/prebid/bid';
-export const USER_SYNC_IFRAME_PATH = '/api/prebid/sync-iframe';
-export const USER_SYNC_IMAGE_PATH = '/api/prebid/sync-image';
-
-export const PRODUCTION = 'production';
-export const STAGING = 'staging';
-export const DEVELOPMENT = 'development';
-export const DEFAULT_ENV = PRODUCTION;
-
-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.
- *
- * @param {AdUnit.bidRequest} bidRequest
- * @returns {boolean} Is this bidRequest valid?
- */
-export const isBidRequestValid = (bidRequest) => {
- return !!(
- 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')));
-};
-
-/**
- * Pure function. See http://prebid.org/dev-docs/bidder-adaptor.html#serverrequest-objects for detailed semantic.
- *
- * @param {string} env Emoteev environment parameter
- * @param {boolean} debug Pbjs debug parameter.
- * @param {string} currency See http://prebid.org/dev-docs/modules/currency.html for detailed semantic.
- * @param {Array} validBidRequests Takes an array of bid requests, which are guaranteed to have passed the isBidRequestValid() test.
- * @param bidderRequest General context for a bidder request being constructed
- * @returns {ServerRequest}
- */
-export const buildRequests = (env, debug, currency, validBidRequests, bidderRequest) => {
- return {
- method: 'POST',
- url: bidderUrl(env),
- data: JSON.stringify(requestsPayload(debug, currency, validBidRequests, bidderRequest)) // Keys with undefined values will be filtered out.
- };
-};
-
-/**
- * Pure function. See http://prebid.org/dev-docs/bidder-adaptor.html#interpreting-the-response for detailed semantic.
- *
- * @param {Array} serverResponse.body The body of the server response is an array of bid objects.
- * @returns {Array}
- */
-export const interpretResponse = (serverResponse) => serverResponse.body;
-
-/**
- * Pure function. See http://prebid.org/dev-docs/bidder-adaptor.html#registering-on-set-targeting for detailed semantic.
- *
- * @param {string} env Emoteev environment parameter.
- * @param {BidRequest} bidRequest
- * @returns {UrlObject}
- */
-export function onAdapterCalled(env, bidRequest) {
- return {
- protocol: 'https',
- hostname: domain(env),
- pathname: EVENTS_PATH,
- search: {
- eventName: ON_ADAPTER_CALLED,
- pubcId: deepAccess(bidRequest, 'crumbs.pubcid'),
- bidId: bidRequest.bidId,
- adSpaceId: deepAccess(bidRequest, 'params.adSpaceId'),
- cache_buster: getUniqueIdentifierStr()
- }
- };
-}
-
-/**
- * Pure function. See http://prebid.org/dev-docs/bidder-adaptor.html#registering-on-bid-won for detailed semantic.
- *
- * @param {string} env Emoteev environment parameter.
- * @param {string} pubcId Publisher common id. See http://prebid.org/dev-docs/modules/pubCommonId.html for detailed semantic.
- * @param bidObject
- * @returns {UrlObject}
- */
-export const onBidWon = (env, pubcId, bidObject) => {
- const bidId = bidObject.requestId;
- return {
- protocol: 'https',
- hostname: domain(env),
- pathname: EVENTS_PATH,
- search: {
- eventName: ON_BID_WON,
- pubcId,
- bidId,
- cache_buster: getUniqueIdentifierStr()
- }
- };
-};
-
-/**
- * Pure function. See http://prebid.org/dev-docs/bidder-adaptor.html#registering-on-timeout for detailed semantic.
- *
- * @param {string} env Emoteev environment parameter.
- * @param {BidRequest} bidRequest
- * @returns {UrlObject}
- */
-export const onTimeout = (env, bidRequest) => {
- return {
- protocol: 'https',
- hostname: domain(env),
- pathname: EVENTS_PATH,
- search: {
- eventName: ON_BIDDER_TIMEOUT,
- pubcId: deepAccess(bidRequest, 'crumbs.pubcid'),
- bidId: bidRequest.bidId,
- adSpaceId: deepAccess(bidRequest, 'params.adSpaceId'),
- timeout: bidRequest.timeout,
- cache_buster: getUniqueIdentifierStr()
- }
- }
-};
-
-/**
- * Pure function. See http://prebid.org/dev-docs/bidder-adaptor.html#registering-user-syncs for detailed semantic.
- *
- * @param {string} env Emoteev environment parameter
- * @param {SyncOptions} syncOptions
- * @returns userSyncs
- */
-export const getUserSyncs = (env, syncOptions) => {
- let syncs = [];
- if (syncOptions.pixelEnabled) {
- syncs.push({
- type: 'image',
- url: userSyncImageUrl(env),
- });
- }
- if (syncOptions.iframeEnabled) {
- syncs.push({
- type: 'iframe',
- url: userSyncIframeUrl(env),
- });
- }
- return syncs;
-};
-
-/**
- * Pure function.
- *
- * @param {string} env Emoteev environment parameter
- * @returns {string} The domain for network calls to Emoteev.
- */
-export const domain = (env) => {
- switch (env) {
- case DEVELOPMENT:
- return DOMAIN_DEVELOPMENT;
- case STAGING:
- return DOMAIN_STAGING;
- default:
- return DOMAIN;
- }
-};
-
-/**
- * Pure function.
- *
- * @param {string} env Emoteev environment parameter
- * @returns {string} The full URL which events is sent to.
- */
-export const eventsUrl = env => buildUrl({
- protocol: (env === DEVELOPMENT) ? 'http' : 'https',
- hostname: domain(env),
- pathname: EVENTS_PATH
-});
-
-/**
- * Pure function.
- *
- * @param {string} env Emoteev environment parameter
- * @returns {string} The full URL which bidderRequest is sent to.
- */
-export const bidderUrl = env => buildUrl({
- protocol: (env === DEVELOPMENT) ? 'http' : 'https',
- hostname: domain(env),
- pathname: BIDDER_PATH
-});
-
-/**
- * Pure function.
- *
- * @param {string} env Emoteev environment parameter
- * @returns {string} The full URL called for iframe-based user sync
- */
-export const userSyncIframeUrl = env => buildUrl({
- protocol: (env === DEVELOPMENT) ? 'http' : 'https',
- hostname: domain(env),
- pathname: USER_SYNC_IFRAME_PATH
-});
-
-/**
- * Pure function.
- *
- * @param {string} env Emoteev environment parameter
- * @returns {string} The full URL called for image-based user sync
- */
-export const userSyncImageUrl = env => buildUrl({
- protocol: (env === DEVELOPMENT) ? 'http' : 'https',
- hostname: domain(env),
- pathname: USER_SYNC_IMAGE_PATH
-});
-
-/**
- * Pure function.
- *
- * @param {Array>} sizes
- * @returns {boolean} are sizes valid?
- */
-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.
- *
- * @param {BidRequest} bidRequest
- * @returns {object} An object which represents a BidRequest for Emoteev server side.
- */
-export const conformBidRequest = bidRequest => {
- return {
- params: bidRequest.params,
- crumbs: bidRequest.crumbs,
- sizes: bidRequest.sizes,
- bidId: bidRequest.bidId,
- bidderRequestId: bidRequest.bidderRequestId,
- };
-};
-
-/**
- * Pure function.
- *
- * @param {object} bidderRequest
- * @returns {(boolean|undefined)} raw consent data.
- */
-export const gdprConsent = (bidderRequest) => (deepAccess(bidderRequest, 'gdprConsent.vendorData.vendorConsents') || {})[VENDOR_ID];
-
-/**
- * Pure function.
- *
- * @param {boolean} debug Pbjs debug parameter
- * @param {string} currency See http://prebid.org/dev-docs/modules/currency.html for detailed information
- * @param {BidRequest} validBidRequests
- * @param {object} bidderRequest
- * @returns
- */
-export const requestsPayload = (debug, currency, validBidRequests, bidderRequest) => {
- return {
- akPbjsVersion: ADAPTER_VERSION,
- bidRequests: validBidRequests.map(conformBidRequest),
- currency: currency,
- debug: debug,
- language: navigator.language,
- refererInfo: bidderRequest.refererInfo,
- deviceInfo: getDeviceInfo(
- getDeviceDimensions(window),
- getViewDimensions(window, document),
- getDocumentDimensions(document),
- isWebGLEnabled(document)),
- userAgent: navigator.userAgent,
- gdprApplies: deepAccess(bidderRequest, 'gdprConsent.gdprApplies'),
- gdprConsent: gdprConsent(bidderRequest),
- };
-};
-
-/**
- * Pure function
- * @param {Window} window
- * @param {Document} document
- * @returns {{width: number, height: number}} View dimensions
- */
-export const getViewDimensions = (window, document) => {
- let w = window;
- let prefix = 'inner';
-
- if (window.innerWidth === undefined || window.innerWidth === null) {
- w = document.documentElement || document.body;
- prefix = 'client';
- }
-
- return {
- width: w[`${prefix}Width`],
- height: w[`${prefix}Height`],
- };
-};
-
-/**
- * Pure function
- * @param {Window} window
- * @returns {{width: number, height: number}} Device dimensions
- */
-export const getDeviceDimensions = (window) => {
- return {
- width: window.screen ? window.screen.width : '',
- height: window.screen ? window.screen.height : '',
- };
-};
-
-/**
- * Pure function
- * @param {Document} document
- * @returns {{width: number, height: number}} Document dimensions
- */
-export const getDocumentDimensions = (document) => {
- const de = document.documentElement;
- const be = document.body;
-
- const bodyHeight = be ? Math.max(be.offsetHeight, be.scrollHeight) : 0;
-
- const w = Math.max(de.clientWidth, de.offsetWidth, de.scrollWidth);
- const h = Math.max(
- de.clientHeight,
- de.offsetHeight,
- de.scrollHeight,
- bodyHeight
- );
-
- return {
- width: isNaN(w) ? '' : w,
- height: isNaN(h) ? '' : h,
- };
-};
-
-/**
- * Unpure function
- * @param {Document} document
- * @returns {boolean} Is WebGL enabled?
- */
-export const isWebGLEnabled = (document) => {
- // Create test canvas
- let canvas = document.createElement('canvas');
-
- // The gl context
- let gl = null;
-
- // Try to get the regular WebGL
- try {
- gl = canvas.getContext('webgl');
- } catch (ex) {
- canvas = undefined;
- return false;
- }
-
- // No regular WebGL found
- if (!gl) {
- // Try experimental WebGL
- try {
- gl = canvas.getContext('experimental-webgl');
- } catch (ex) {
- canvas = undefined;
- return false;
- }
- }
-
- return !!gl;
-};
-
-/**
- * Pure function
- * @param {{width: number, height: number}} deviceDimensions
- * @param {{width: number, height: number}} viewDimensions
- * @param {{width: number, height: number}} documentDimensions
- * @param {boolean} webGL
- * @returns {object} Device information
- */
-export const getDeviceInfo = (deviceDimensions, viewDimensions, documentDimensions, webGL) => {
- return {
- browserWidth: viewDimensions.width,
- browserHeight: viewDimensions.height,
- deviceWidth: deviceDimensions.width,
- deviceHeight: deviceDimensions.height,
- documentWidth: documentDimensions.width,
- documentHeight: documentDimensions.height,
- webGL: webGL,
- };
-};
-
-/**
- * Pure function
- * @param {object} config pbjs config value
- * @param {string} parameter Environment override from URL query param.
- * @returns {string} One of [PRODUCTION, STAGING, DEVELOPMENT].
- */
-export const resolveEnv = (config, parameter) => {
- const configEnv = deepAccess(config, 'emoteev.env');
-
- if (contains([PRODUCTION, STAGING, DEVELOPMENT], parameter)) return parameter;
- else if (contains([PRODUCTION, STAGING, DEVELOPMENT], configEnv)) return configEnv;
- else return DEFAULT_ENV;
-};
-
-/**
- * Pure function
- * @param {object} config pbjs config value
- * @param {string} parameter Debug override from URL query param.
- * @returns {boolean}
- */
-export const resolveDebug = (config, parameter) => {
- if (parameter && parameter.length && parameter.length > 0) return JSON.parse(parameter);
- else if (config.debug) return config.debug;
- else return false;
-};
-
-/**
- * EmoteevBidAdapter spec
- * @access public
- * @type {BidderSpec}
- */
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER],
- isBidRequestValid: isBidRequestValid,
- buildRequests: (validBidRequests, bidderRequest) =>
- buildRequests(
- resolveEnv(config.getConfig(), getParameterByName('emoteevEnv')),
- resolveDebug(config.getConfig(), getParameterByName('debug')),
- config.getConfig('currency'),
- validBidRequests,
- bidderRequest),
- interpretResponse: interpretResponse,
- onBidWon: (bidObject) =>
- triggerPixel(buildUrl(onBidWon(
- resolveEnv(config.getConfig(), getParameterByName('emoteevEnv')),
- storage.getCookie('_pubcid'),
- bidObject))),
- onTimeout: (bidRequest) =>
- triggerPixel(buildUrl(onTimeout(
- resolveEnv(config.getConfig(), getParameterByName('emoteevEnv')),
- bidRequest))),
- getUserSyncs: (syncOptions) =>
- getUserSyncs(
- resolveEnv(config.getConfig(), getParameterByName('emoteevEnv')),
- syncOptions),
-};
-
-registerBidder(spec);
diff --git a/modules/emx_digitalBidAdapter.js b/modules/emx_digitalBidAdapter.js
index bcdcd7393f7..260ffe105f4 100644
--- a/modules/emx_digitalBidAdapter.js
+++ b/modules/emx_digitalBidAdapter.js
@@ -11,6 +11,11 @@ const RENDERER_URL = 'https://js.brealtime.com/outstream/1.30.0/bundle.js';
const ADAPTER_VERSION = '1.5.1';
const DEFAULT_CUR = 'USD';
+const EIDS_SUPPORTED = [
+ { key: 'idl_env', source: 'liveramp.com', rtiPartner: 'idl', queryParam: 'idl' },
+ { key: 'uid2.id', source: 'uidapi.com', rtiPartner: 'UID2', queryParam: 'uid2' }
+];
+
export const emxAdapter = {
validateSizes: (sizes) => {
if (!utils.isArray(sizes) || typeof sizes[0] === 'undefined') {
@@ -168,6 +173,27 @@ export const emxAdapter = {
}
return emxData;
+ },
+ // supporting eids
+ getEids(bidRequests) {
+ return EIDS_SUPPORTED
+ .map(emxAdapter.getUserId(bidRequests))
+ .filter(x => x);
+ },
+ getUserId(bidRequests) {
+ return ({ key, source, rtiPartner }) => {
+ let id = utils.deepAccess(bidRequests, `userId.${key}`);
+ return id ? emxAdapter.formatEid(id, source, rtiPartner) : null;
+ };
+ },
+ formatEid(id, source, rtiPartner) {
+ return {
+ source,
+ uids: [{
+ id,
+ ext: { rtiPartner }
+ }]
+ };
}
};
@@ -252,6 +278,21 @@ export const spec = {
if (bidderRequest && bidderRequest.uspConsent) {
emxData.us_privacy = bidderRequest.uspConsent
}
+
+ // adding eid support
+ if (bidderRequest.userId) {
+ let eids = emxAdapter.getEids(bidderRequest);
+ if (eids.length > 0) {
+ if (emxData.user && emxData.user.ext) {
+ emxData.user.ext.eids = eids;
+ } else {
+ emxData.user = {
+ ext: {eids}
+ };
+ }
+ }
+ }
+
return {
method: 'POST',
url,
diff --git a/modules/engageyaBidAdapter.js b/modules/engageyaBidAdapter.js
deleted file mode 100644
index 321b3287c2b..00000000000
--- a/modules/engageyaBidAdapter.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import {
- BANNER,
- NATIVE
-} from '../src/mediaTypes.js';
-
-const {
- registerBidder
-} = require('../src/adapters/bidderFactory.js');
-const BIDDER_CODE = 'engageya';
-const ENDPOINT_URL = 'https://recs.engageya.com/rec-api/getrecs.json';
-const ENDPOINT_METHOD = 'GET';
-
-function getPageUrl() {
- var pUrl = window.location.href;
- if (isInIframe()) {
- pUrl = document.referrer ? document.referrer : pUrl;
- }
- pUrl = encodeURIComponent(pUrl);
- return pUrl;
-}
-
-function isInIframe() {
- try {
- var isInIframe = (window.self !== window.top);
- } catch (e) {
- isInIframe = true;
- }
- return isInIframe;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, NATIVE],
- isBidRequestValid: function(bid) {
- return bid && bid.params && bid.params.hasOwnProperty('widgetId') && bid.params.hasOwnProperty('websiteId') && !isNaN(bid.params.widgetId) && !isNaN(bid.params.websiteId);
- },
-
- buildRequests: function(validBidRequests, bidderRequest) {
- var bidRequests = [];
- if (validBidRequests && validBidRequests.length > 0) {
- validBidRequests.forEach(function(bidRequest) {
- if (bidRequest.params) {
- var mediaType = bidRequest.hasOwnProperty('nativeParams') ? 1 : 2;
- var imageWidth = -1;
- var imageHeight = -1;
- if (bidRequest.sizes && bidRequest.sizes.length > 0) {
- imageWidth = bidRequest.sizes[0][0];
- imageHeight = bidRequest.sizes[0][1];
- } else if (bidRequest.nativeParams && bidRequest.nativeParams.image && bidRequest.nativeParams.image.sizes) {
- imageWidth = bidRequest.nativeParams.image.sizes[0];
- imageHeight = bidRequest.nativeParams.image.sizes[1];
- }
-
- var widgetId = bidRequest.params.widgetId;
- var websiteId = bidRequest.params.websiteId;
- var pageUrl = (bidRequest.params.pageUrl && bidRequest.params.pageUrl != '[PAGE_URL]') ? bidRequest.params.pageUrl : '';
- if (!pageUrl) {
- pageUrl = (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer) ? bidderRequest.refererInfo.referer : getPageUrl();
- }
- var bidId = bidRequest.bidId;
- var finalUrl = ENDPOINT_URL + '?pubid=0&webid=' + websiteId + '&wid=' + widgetId + '&url=' + pageUrl + '&ireqid=' + bidId + '&pbtpid=' + mediaType + '&imw=' + imageWidth + '&imh=' + imageHeight;
- if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprApplies && bidderRequest.consentString) {
- finalUrl += '&is_gdpr=1&gdpr_consent=' + bidderRequest.consentString;
- }
- bidRequests.push({
- url: finalUrl,
- method: ENDPOINT_METHOD,
- data: ''
- });
- }
- });
- }
-
- return bidRequests;
- },
-
- interpretResponse: function(serverResponse, bidRequest) {
- const bidResponses = [];
- if (serverResponse.body && serverResponse.body.recs && serverResponse.body.recs.length > 0) {
- var response = serverResponse.body;
- var isNative = response.pbtypeId == 1;
- response.recs.forEach(function(rec) {
- var imageSrc = rec.thumbnail_path.indexOf('http') == -1 ? 'https:' + rec.thumbnail_path : rec.thumbnail_path;
- if (isNative) {
- bidResponses.push({
- requestId: response.ireqId,
- cpm: rec.ecpm,
- width: response.imageWidth,
- height: response.imageHeight,
- creativeId: rec.postId,
- currency: 'USD',
- netRevenue: false,
- ttl: 360,
- native: {
- title: rec.title,
- body: '',
- image: {
- url: imageSrc,
- width: response.imageWidth,
- height: response.imageHeight
- },
- privacyLink: '',
- clickUrl: rec.clickUrl,
- displayUrl: rec.url,
- cta: '',
- sponsoredBy: rec.displayName,
- impressionTrackers: [],
- },
- });
- } else {
- // var htmlTag = " ";
- var htmlTag = ' ';
- var tag = rec.tag ? rec.tag : htmlTag;
- bidResponses.push({
- requestId: response.ireqId,
- cpm: rec.ecpm,
- width: response.imageWidth,
- height: response.imageHeight,
- creativeId: rec.postId,
- currency: 'USD',
- netRevenue: false,
- ttl: 360,
- ad: tag,
- });
- }
- });
- }
-
- return bidResponses;
- }
-};
-
-registerBidder(spec);
diff --git a/modules/envivoBidAdapter.js b/modules/envivoBidAdapter.js
deleted file mode 100644
index b9c80ffd468..00000000000
--- a/modules/envivoBidAdapter.js
+++ /dev/null
@@ -1,129 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { config } from '../src/config.js';
-import * as utils from '../src/utils.js';
-import {BANNER, VIDEO} from '../src/mediaTypes.js';
-import { ajax } from '../src/ajax.js';
-import {Renderer} from '../src/Renderer.js';
-
-const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
-const BIDDER_CODE = 'envivo';
-const DOMAIN = 'https://ad.nvivo.tv/';
-const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';
-
-function isBidRequestValid(bid) {
- return (typeof bid.params !== 'undefined' && parseInt(utils.getValue(bid.params, 'publisherId')) > 0);
-}
-
-function buildRequests(validBidRequests) {
- return {
- method: 'POST',
- url: DOMAIN + 'ads/www/admin/plugins/Prebid/getAd.php',
- options: {
- withCredentials: false,
- crossOrigin: true
- },
- data: validBidRequests,
- };
-}
-
-function interpretResponse(serverResponse, request) {
- const response = serverResponse.body;
- const bidResponses = [];
- var bidRequestResponses = [];
-
- utils._each(response, function(bidAd) {
- bidAd.adResponse = {
- content: bidAd.vastXml,
- height: bidAd.height,
- width: bidAd.width
- };
- bidAd.ttl = config.getConfig('_bidderTimeout')
- bidAd.renderer = bidAd.context === 'outstream' ? createRenderer(bidAd, {
- id: bidAd.adUnitCode,
- url: RENDERER_URL
- }, bidAd.adUnitCode) : undefined;
- bidResponses.push(bidAd);
- });
-
- bidRequestResponses.push({
- function: 'saveResponses',
- request: request,
- response: bidResponses
- });
- sendResponseToServer(bidRequestResponses);
- return bidResponses;
-}
-
-function outstreamRender(bidAd) {
- bidAd.renderer.push(() => {
- window.ANOutstreamVideo.renderAd({
- sizes: [bidAd.width, bidAd.height],
- width: bidAd.width,
- height: bidAd.height,
- targetId: bidAd.adUnitCode,
- adResponse: bidAd.adResponse,
- rendererOptions: {
- showVolume: false,
- allowFullscreen: false
- }
- });
- });
-}
-
-function createRenderer(bidAd, rendererParams, adUnitCode) {
- const renderer = Renderer.install({
- id: rendererParams.id,
- url: rendererParams.url,
- loaded: false,
- config: {'player_height': bidAd.height, 'player_width': bidAd.width},
- adUnitCode
- });
- try {
- renderer.setRender(outstreamRender);
- } catch (err) {
- utils.logWarn('Prebid Error calling setRender on renderer', err);
- }
- return renderer;
-}
-
-function onBidWon(bid) {
- let wonBids = [];
- wonBids.push(bid);
- wonBids[0].function = 'onBidWon';
- sendResponseToServer(wonBids);
-}
-
-function onTimeout(details) {
- details.unshift({ 'function': 'onTimeout' });
- sendResponseToServer(details);
-}
-
-function sendResponseToServer(data) {
- ajax(DOMAIN + 'ads/www/admin/plugins/Prebid/tracking/track.php', null, JSON.stringify(data), {
- withCredentials: false,
- method: 'POST',
- crossOrigin: true
- });
-}
-
-function getUserSyncs(syncOptions) {
- if (syncOptions.iframeEnabled) {
- return [{
- type: 'iframe',
- url: DOMAIN + 'ads/www/admin/plugins/Prebid/userSync.php'
- }];
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: SUPPORTED_AD_TYPES,
- isBidRequestValid,
- buildRequests,
- interpretResponse,
- getUserSyncs,
- onBidWon,
- onTimeout
-};
-
-registerBidder(spec);
diff --git a/modules/etargetBidAdapter.js b/modules/etargetBidAdapter.js
index 8a1b25cec70..a7e79b2fd9b 100644
--- a/modules/etargetBidAdapter.js
+++ b/modules/etargetBidAdapter.js
@@ -42,13 +42,16 @@ export const spec = {
request.unshift('https://' + lastCountry + '.search.etargetnet.com/hb/?hbget=1');
netRevenue = 'net';
- if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) {
- gdprObject = {
- gdpr: bidderRequest.gdprConsent.gdprApplies,
- gdpr_consent: bidderRequest.gdprConsent.consentString
- };
- request.push('gdpr=' + gdprObject.gdpr);
- request.push('gdpr_consent=' + gdprObject.gdpr_consent);
+ if (bidderRequest) {
+ if (bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) {
+ gdprObject = {
+ gdpr: bidderRequest.gdprConsent.gdprApplies,
+ gdpr_consent: bidderRequest.gdprConsent.consentString
+ };
+ request.push('gdpr=' + gdprObject.gdpr);
+ request.push('gdpr_consent=' + gdprObject.gdpr_consent);
+ }
+ bidderRequest.metaData = getMetaData();
}
return {
@@ -57,7 +60,6 @@ export const spec = {
data: bidderRequest,
bids: validBidRequests,
netRevenue: netRevenue,
- metaData: getMetaData(),
bidder: 'etarget',
gdpr: gdprObject
};
diff --git a/modules/fidelityBidAdapter.js b/modules/fidelityBidAdapter.js
deleted file mode 100644
index fac273721ff..00000000000
--- a/modules/fidelityBidAdapter.js
+++ /dev/null
@@ -1,146 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'fidelity';
-const BIDDER_SERVER = 'x.fidelity-media.com';
-const FIDELITY_VENDOR_ID = 408;
-export const spec = {
- code: BIDDER_CODE,
- gvlid: 408,
- isBidRequestValid: function isBidRequestValid(bid) {
- return !!(bid && bid.params && bid.params.zoneid);
- },
- buildRequests: function buildRequests(validBidRequests, bidderRequest) {
- return validBidRequests.map(bidRequest => {
- var server = bidRequest.params.server || BIDDER_SERVER;
-
- const payload = {
- from: 'hb',
- v: '1.0',
- requestid: bidRequest.bidderRequestId,
- impid: bidRequest.bidId,
- zoneid: bidRequest.params.zoneid,
- floor: parseFloat(bidRequest.params.floor) > 0 ? bidRequest.params.floor : 0,
- charset: document.charSet || document.characterSet,
- subid: 'hb',
- flashver: getFlashVersion(),
- tmax: bidderRequest.timeout,
- defloc: bidderRequest.refererInfo.referer,
- referrer: getTopWindowReferrer(),
- schain: getSupplyChain(bidRequest.schain),
- };
- setConsentParams(bidderRequest.gdprConsent, bidderRequest.uspConsent, payload);
-
- return {
- method: 'GET',
- url: 'https://' + server + '/delivery/hb.php',
- data: payload
- };
- });
- },
- interpretResponse: function interpretResponse(serverResponse) {
- serverResponse = serverResponse.body;
- const bidResponses = [];
- if (serverResponse && serverResponse.seatbid) {
- serverResponse.seatbid.forEach(seatBid => seatBid.bid.forEach(bid => {
- const bidResponse = {
- requestId: bid.impid,
- creativeId: bid.impid,
- cpm: bid.price,
- width: bid.width,
- height: bid.height,
- ad: bid.adm,
- netRevenue: bid.netRevenue,
- currency: bid.cur,
- ttl: bid.ttl,
- };
-
- bidResponses.push(bidResponse);
- }));
- }
- return bidResponses;
- },
- getUserSyncs: function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) {
- if (syncOptions.iframeEnabled) {
- var url = 'https://' + BIDDER_SERVER + '/delivery/matches.php';
- var payload = {
- type: 'iframe'
- };
- setConsentParams(gdprConsent, uspConsent, payload);
-
- return [{
- type: 'iframe',
- url: url + '?' + utils.parseQueryStringParameters(payload).replace(/\&$/, '')
- }];
- }
- }
-}
-
-function getFlashVersion() {
- var plugins, plugin, result;
-
- if (navigator.plugins && navigator.plugins.length > 0) {
- plugins = navigator.plugins;
- for (var i = 0; i < plugins.length && !result; i++) {
- plugin = plugins[i];
- if (plugin.name.indexOf('Shockwave Flash') > -1) {
- result = plugin.description.split('Shockwave Flash ')[1];
- }
- }
- }
- return result || '';
-}
-
-function getTopWindowReferrer() {
- try {
- return window.top.document.referrer;
- } catch (e) {
- return '';
- }
-}
-
-function setConsentParams(gdprConsent, uspConsent, payload) {
- if (gdprConsent) {
- payload.gdpr = 0;
- payload.consent_str = '';
- payload.consent_given = 0;
- if (typeof gdprConsent.gdprApplies !== 'undefined') {
- payload.gdpr = gdprConsent.gdprApplies ? 1 : 0;
- }
- if (typeof gdprConsent.consentString !== 'undefined') {
- payload.consent_str = gdprConsent.consentString;
- }
- if (gdprConsent.apiVersion === 1 && gdprConsent.vendorData && gdprConsent.vendorData.vendorConsents && typeof gdprConsent.vendorData.vendorConsents[FIDELITY_VENDOR_ID.toString(10)] !== 'undefined') {
- payload.consent_given = gdprConsent.vendorData.vendorConsents[FIDELITY_VENDOR_ID.toString(10)] ? 1 : 0;
- }
- if (gdprConsent.apiVersion === 2 && gdprConsent.vendorData && gdprConsent.vendorData.vendor && gdprConsent.vendorData.vendor.consents && typeof gdprConsent.vendorData.vendor.consents[FIDELITY_VENDOR_ID.toString(10)] !== 'undefined') {
- payload.consent_given = gdprConsent.vendorData.vendor.consents[FIDELITY_VENDOR_ID.toString(10)] ? 1 : 0;
- }
- }
- if (typeof uspConsent !== 'undefined') {
- payload.us_privacy = uspConsent;
- }
-}
-
-function getSupplyChain(schain) {
- var supplyChain = '';
- if (schain != null && schain.nodes) {
- supplyChain = schain.ver + ',' + schain.complete;
- for (let i = 0; i < schain.nodes.length; i++) {
- supplyChain += '!';
- supplyChain += (schain.nodes[i].asi) ? encodeURIComponent(schain.nodes[i].asi) : '';
- supplyChain += ',';
- supplyChain += (schain.nodes[i].sid) ? encodeURIComponent(schain.nodes[i].sid) : '';
- supplyChain += ',';
- supplyChain += (schain.nodes[i].hp) ? encodeURIComponent(schain.nodes[i].hp) : '';
- supplyChain += ',';
- supplyChain += (schain.nodes[i].rid) ? encodeURIComponent(schain.nodes[i].rid) : '';
- supplyChain += ',';
- supplyChain += (schain.nodes[i].name) ? encodeURIComponent(schain.nodes[i].name) : '';
- supplyChain += ',';
- supplyChain += (schain.nodes[i].domain) ? encodeURIComponent(schain.nodes[i].domain) : '';
- }
- }
- return supplyChain;
-}
-registerBidder(spec);
diff --git a/modules/fluctBidAdapter.js b/modules/fluctBidAdapter.js
deleted file mode 100644
index 420fe04ddcb..00000000000
--- a/modules/fluctBidAdapter.js
+++ /dev/null
@@ -1,121 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'fluct';
-const END_POINT = 'https://hb.adingo.jp/prebid';
-const VERSION = '1.2';
-const NET_REVENUE = true;
-const TTL = 300;
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['adingo'],
-
- /**
- * 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 !!(bid.params.groupId && bid.params.tagId);
- },
-
- /**
- * 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 serverRequests = [];
- const referer = bidderRequest.refererInfo.referer;
-
- utils._each(validBidRequests, (request) => {
- const data = Object();
-
- data.referer = referer;
- data.adUnitCode = request.adUnitCode;
- data.bidId = request.bidId;
- data.transactionId = request.transactionId;
-
- data.sizes = [];
- utils._each(request.sizes, (size) => {
- data.sizes.push({
- w: size[0],
- h: size[1]
- });
- });
-
- data.params = request.params;
-
- serverRequests.push({
- method: 'POST',
- url: END_POINT,
- options: {
- contentType: 'application/json',
- withCredentials: true,
- customHeaders: {
- 'x-fluct-app': 'prebid/fluctBidAdapter',
- 'x-fluct-version': VERSION,
- 'x-openrtb-version': 2.5
- }
- },
- data: data
- });
- });
-
- return serverRequests;
- },
-
- /*
- * Unpack the respnse from the server into a list of bids.
- *
- * @param {serverResponse} serverResponse A successful response from the server.
- * @return {bid[]} An array of bids which weer nested inside the server.
- */
- interpretResponse: (serverResponse, serverRequest) => {
- const bidResponses = [];
-
- const res = serverResponse.body;
- if (!utils.isEmpty(res) && !utils.isEmpty(res.seatbid) && !utils.isEmpty(res.seatbid[0].bid)) {
- const bid = res.seatbid[0].bid[0];
- const dealId = bid.dealid;
- const beaconUrl = bid.burl;
- const callImpBeacon = ``;
- let data = {
- bidderCode: BIDDER_CODE,
- requestId: res.id,
- currency: res.cur,
- cpm: parseFloat(bid.price) || 0,
- netRevenue: NET_REVENUE,
- width: bid.w,
- height: bid.h,
- creativeId: bid.crid,
- ttl: TTL,
- ad: bid.adm + callImpBeacon,
- };
- if (!utils.isEmpty(dealId)) {
- data.dealId = dealId;
- }
- bidResponses.push(data);
- }
- return bidResponses;
- },
-
- /*
- * Register the user sync pixels which should be dropped after the auction.
- *
- * @params {syncOptions} syncOptions which user syncs are allowed?
- * @params {ServerResponse[]} serverResponses List of server's responses.
- * @return {UserSync[]} The user syncs which should be dropped.
- *
- */
- getUserSyncs: (syncOptions, serverResponses) => {
- return [];
- },
-};
-
-registerBidder(spec);
diff --git a/modules/freewheel-sspBidAdapter.js b/modules/freewheel-sspBidAdapter.js
index 1c9cd75f76f..fa2f7b4cd6b 100644
--- a/modules/freewheel-sspBidAdapter.js
+++ b/modules/freewheel-sspBidAdapter.js
@@ -420,6 +420,7 @@ export const spec = {
currency: princingData.currency,
netRevenue: true,
ttl: 360,
+ meta: { advertiserDomains: princingData.adomain && utils.isArray(princingData.adomain) ? princingData.adomain : [] },
dealId: dealId,
campaignId: campaignId,
bannerId: bannerId
diff --git a/modules/gammaBidAdapter.js b/modules/gammaBidAdapter.js
index 5fd3c56b2c6..3e1298b7e23 100644
--- a/modules/gammaBidAdapter.js
+++ b/modules/gammaBidAdapter.js
@@ -84,7 +84,10 @@ function newBid(serverBid) {
mediaType: serverBid.type,
netRevenue: true,
requestId: serverBid.id,
- ttl: serverBid.seatbid[0].bid[0].ttl || 300
+ ttl: serverBid.seatbid[0].bid[0].ttl || 300,
+ meta: {
+ advertiserDomains: serverBid.seatbid[0].bid[0].adomain && serverBid.seatbid[0].bid[0].adomain.length ? serverBid.seatbid[0].bid[0].adomain : []
+ }
};
if (serverBid.type == 'video') {
diff --git a/modules/gamoshiBidAdapter.js b/modules/gamoshiBidAdapter.js
index de839219897..68233ce7814 100644
--- a/modules/gamoshiBidAdapter.js
+++ b/modules/gamoshiBidAdapter.js
@@ -38,6 +38,23 @@ export const helper = {
}
}
return BANNER;
+ },
+ getBidFloor(bid) {
+ if (!utils.isFn(bid.getFloor)) {
+ return bid.params.bidfloor ? bid.params.bidfloor : null;
+ }
+
+ let bidFloor = bid.getFloor({
+ mediaType: '*',
+ size: '*',
+ currency: 'USD'
+ });
+
+ if (utils.isPlainObject(bidFloor) && !isNaN(bidFloor.floor) && bidFloor.currency === 'USD') {
+ return bidFloor.floor;
+ }
+
+ return null;
}
};
@@ -106,7 +123,7 @@ export const spec = {
id: transactionId,
instl: params.instl === 1 ? 1 : 0,
tagid: adUnitCode,
- bidfloor: params.bidfloor || 0,
+ bidfloor: helper.getBidFloor(bidRequest) || 0,
bidfloorcur: 'USD',
secure: 1
};
@@ -133,11 +150,19 @@ export const spec = {
const playerSize = mediaTypes.video.playerSize || sizes;
const videoImp = Object.assign({}, imp, {
video: {
- protocols: params.protocols || [1, 2, 3, 4, 5, 6],
+ protocols: bidRequest.mediaTypes.video.protocols || params.protocols || [1, 2, 3, 4, 5, 6],
pos: params.pos || 0,
ext: {
context: mediaTypes.video.context
- }
+ },
+ mimes: bidRequest.mediaTypes.video.mimes,
+ maxduration: bidRequest.mediaTypes.video.maxduration,
+ api: bidRequest.mediaTypes.video.api,
+ skip: bidRequest.mediaTypes.video.skip || bidRequest.params.video.skip,
+ placement: bidRequest.mediaTypes.video.placement || bidRequest.params.video.placement,
+ minduration: bidRequest.mediaTypes.video.minduration || bidRequest.params.video.minduration,
+ playbackmethod: bidRequest.mediaTypes.video.playbackmethod || bidRequest.params.video.playbackmethod,
+ startdelay: bidRequest.mediaTypes.video.startdelay || bidRequest.params.video.startdelay
}
});
@@ -198,9 +223,15 @@ export const spec = {
creativeId: bid.crid || bid.adid,
netRevenue: true,
currency: bid.cur || response.cur,
- mediaType: helper.getMediaType(bid)
+ mediaType: helper.getMediaType(bid),
};
+ if (bid.adomain && bid.adomain.length) {
+ outBid.meta = {
+ advertiserDomains: bid.adomain
+ }
+ }
+
if (utils.deepAccess(bidRequest.bidRequest, 'mediaTypes.' + outBid.mediaType)) {
if (outBid.mediaType === BANNER) {
outBids.push(Object.assign({}, outBid, {ad: bid.adm}));
diff --git a/modules/getintentBidAdapter.js b/modules/getintentBidAdapter.js
index 134dd0b4fc9..9127bc4be6e 100644
--- a/modules/getintentBidAdapter.js
+++ b/modules/getintentBidAdapter.js
@@ -1,5 +1,6 @@
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { isInteger } from '../src/utils.js';
+import * as utils from '../src/utils.js';
const BIDDER_CODE = 'getintent';
const IS_NET_REVENUE = true;
@@ -7,11 +8,25 @@ const BID_HOST = 'px.adhigh.net';
const BID_BANNER_PATH = '/rtb/direct_banner';
const BID_VIDEO_PATH = '/rtb/direct_vast';
const BID_RESPONSE_TTL_SEC = 360;
-const VIDEO_PROPERTIES = [
- 'protocols', 'mimes', 'min_dur', 'max_dur', 'min_btr', 'max_btr', 'vi_format', 'api', 'skippable'
-];
+const FLOOR_PARAM = 'floor';
+const CURRENCY_PARAM = 'cur';
+const DEFAULT_CURRENCY = 'RUB';
+const VIDEO_PROPERTIES = {
+ 'protocols': 'protocols',
+ 'mimes': 'mimes',
+ 'min_dur': 'minduration',
+ 'max_dur': 'maxduration',
+ 'min_btr': 'minbitrate',
+ 'max_btr': 'maxbitrate',
+ 'vi_format': null,
+ 'api': 'api',
+ 'skippable': 'skip',
+};
+const SKIPPABLE_ALLOW = 'ALLOW';
+const SKIPPABLE_NOT_ALLOW = 'NOT_ALLOW';
+
const OPTIONAL_PROPERTIES = [
- 'cur', 'floor', 'sid'
+ 'sid'
];
export const spec = {
@@ -66,7 +81,10 @@ export const spec = {
creativeId: responseBody.creative_id,
cpm: responseBody.cpm,
width: size[0],
- height: size[1]
+ height: size[1],
+ meta: {
+ advertiserDomains: responseBody.adomain || [],
+ }
};
if (responseBody.vast_url) {
bid.mediaType = 'video';
@@ -105,19 +123,61 @@ function buildGiBidRequest(bidRequest) {
if (bidRequest.sizes) {
giBidRequest.size = produceSize(bidRequest.sizes);
}
- addVideo(bidRequest.params.video, giBidRequest);
+
+ const currency = utils.getBidIdParameter(CURRENCY_PARAM, bidRequest.params);
+ const floorInfo = getBidFloor(bidRequest, currency);
+ if (floorInfo.floor) {
+ giBidRequest[FLOOR_PARAM] = floorInfo.floor;
+ }
+ if (floorInfo.currency) {
+ giBidRequest[CURRENCY_PARAM] = floorInfo.currency;
+ }
+
+ if (giBidRequest.is_video) {
+ addVideo(bidRequest.params.video, bidRequest.mediaTypes.video, giBidRequest);
+ }
addOptional(bidRequest.params, giBidRequest, OPTIONAL_PROPERTIES);
return giBidRequest;
}
-function addVideo(video, giBidRequest) {
- if (giBidRequest.is_video && video) {
- for (let i = 0, l = VIDEO_PROPERTIES.length; i < l; i++) {
- let key = VIDEO_PROPERTIES[i];
- if (video.hasOwnProperty(key)) {
- giBidRequest[key] = Array.isArray(video[key]) ? video[key].join(',') : video[key];
+function getBidFloor(bidRequest, currency) {
+ let floorInfo = {};
+
+ if (utils.isFn(bidRequest.getFloor)) {
+ floorInfo = bidRequest.getFloor({
+ currency: currency || DEFAULT_CURRENCY,
+ mediaType: bidRequest.mediaType,
+ size: bidRequest.sizes || '*'
+ });
+ }
+
+ return {
+ floor: floorInfo.floor || bidRequest.params[FLOOR_PARAM] || 0,
+ currency: floorInfo.currency || currency || '',
+ };
+}
+
+function addVideo(videoParams, mediaTypesVideoParams, giBidRequest) {
+ videoParams = videoParams || {};
+ mediaTypesVideoParams = mediaTypesVideoParams || {};
+
+ for (let videoParam in VIDEO_PROPERTIES) {
+ let paramValue;
+
+ const mediaTypesVideoParam = VIDEO_PROPERTIES[videoParam];
+ if (videoParams.hasOwnProperty(videoParam)) {
+ paramValue = videoParams[videoParam];
+ } else if (mediaTypesVideoParam !== null && mediaTypesVideoParams.hasOwnProperty(mediaTypesVideoParam)) {
+ if (mediaTypesVideoParam === 'skip') {
+ paramValue = mediaTypesVideoParams[mediaTypesVideoParam] === 1 ? SKIPPABLE_ALLOW : SKIPPABLE_NOT_ALLOW;
+ } else {
+ paramValue = mediaTypesVideoParams[mediaTypesVideoParam];
}
}
+
+ if (typeof paramValue !== 'undefined') {
+ giBidRequest[videoParam] = Array.isArray(paramValue) ? paramValue.join(',') : paramValue;
+ }
}
}
diff --git a/modules/glimpseBidAdapter.js b/modules/glimpseBidAdapter.js
index 969c04bb451..9ef46f62f1d 100644
--- a/modules/glimpseBidAdapter.js
+++ b/modules/glimpseBidAdapter.js
@@ -3,6 +3,17 @@ import { BANNER } from '../src/mediaTypes.js';
const BIDDER_CODE = 'glimpse';
+function transformEachBidResponse(glimpseBid) {
+ const bid = glimpseBid;
+ bid.meta = { advertiserDomains: [] };
+
+ if (glimpseBid.adomain) {
+ bid.meta.advertiserDomains = glimpseBid.adomain;
+ }
+
+ return bid;
+}
+
export const spec = {
code: BIDDER_CODE,
url: 'https://api.glimpseprotocol.io/cloud/v1/vault/prebid',
@@ -45,10 +56,10 @@ export const spec = {
},
interpretResponse: (serverResponse, _) => {
- const bids = [];
+ let bids = [];
try {
const { body } = serverResponse;
- bids.push(...body);
+ bids = body.map(transformEachBidResponse);
} catch (error) {}
return bids;
diff --git a/modules/glomexBidAdapter.js b/modules/glomexBidAdapter.js
index 8de3d3724ce..617a1a3d721 100644
--- a/modules/glomexBidAdapter.js
+++ b/modules/glomexBidAdapter.js
@@ -73,7 +73,10 @@ export const spec = {
currency: matchedBid.currency,
netRevenue: matchedBid.netRevenue,
ttl: matchedBid.ttl,
- ad: matchedBid.ad
+ ad: matchedBid.ad,
+ meta: {
+ advertiserDomains: matchedBid.adomain ? matchedBid.adomain : []
+ }
}
bidResponses.push(bidResponse)
diff --git a/modules/gmosspBidAdapter.js b/modules/gmosspBidAdapter.js
index bf57e63d53c..2b9bd6db034 100644
--- a/modules/gmosspBidAdapter.js
+++ b/modules/gmosspBidAdapter.js
@@ -2,9 +2,11 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
import * as utils from '../src/utils.js';
import { config } from '../src/config.js';
import { BANNER } from '../src/mediaTypes.js';
+import { getStorageManager } from '../src/storageManager.js';
const BIDDER_CODE = 'gmossp';
const ENDPOINT = 'https://sp.gmossp-sp.jp/hb/prebid/query.ad';
+const storage = getStorageManager();
export const spec = {
code: BIDDER_CODE,
@@ -32,6 +34,7 @@ export const spec = {
const urlInfo = getUrlInfo(bidderRequest.refererInfo);
const cur = getCurrencyType();
const dnt = utils.getDNT() ? '1' : '0';
+ const imuid = storage.getCookie('_im_uid.1000283') || '';
for (let i = 0; i < validBidRequests.length; i++) {
let queryString = '';
@@ -46,6 +49,7 @@ export const spec = {
queryString = utils.tryAppendQueryString(queryString, 'bid', bid);
queryString = utils.tryAppendQueryString(queryString, 'ver', ver);
queryString = utils.tryAppendQueryString(queryString, 'sid', sid);
+ queryString = utils.tryAppendQueryString(queryString, 'im_uid', imuid);
queryString = utils.tryAppendQueryString(queryString, 'url', urlInfo.url);
queryString = utils.tryAppendQueryString(queryString, 'ref', urlInfo.ref);
queryString = utils.tryAppendQueryString(queryString, 'cur', cur);
diff --git a/modules/gnetBidAdapter.js b/modules/gnetBidAdapter.js
index 3469c897a6a..f45c10195cd 100644
--- a/modules/gnetBidAdapter.js
+++ b/modules/gnetBidAdapter.js
@@ -16,7 +16,7 @@ export const spec = {
* @return boolean True if this is a valid bid, and false otherwise.
*/
isBidRequestValid: function (bid) {
- return !!(bid.params.websiteId && bid.params.externalId);
+ return !!(bid.params.websiteId);
},
/**
@@ -85,6 +85,9 @@ export const spec = {
height: bidData.height,
ad: bidData.ad,
ttl: 300,
+ meta: {
+ advertiserDomains: bidData.adomain ? bidData.adomain : []
+ },
creativeId: bidData.creativeId,
netRevenue: true,
};
diff --git a/modules/gnetBidAdapter.md b/modules/gnetBidAdapter.md
index 6dac9be17b6..447d00d8ff2 100644
--- a/modules/gnetBidAdapter.md
+++ b/modules/gnetBidAdapter.md
@@ -8,7 +8,7 @@ Maintainer: roberto.wu@grumft.com
# Description
-Module that connects to Example's demand sources
+Connect to Gnet Project exchange for bids.
# Test Parameters
```
@@ -24,8 +24,7 @@ Module that connects to Example's demand sources
{
bidder: 'gnet',
params: {
- websiteId: '4',
- externalId: '4d52cccf30309282256012cf30309282'
+ websiteId: '4'
}
}
]
diff --git a/modules/gridBidAdapter.js b/modules/gridBidAdapter.js
index dbeba27d836..0da15499e0c 100644
--- a/modules/gridBidAdapter.js
+++ b/modules/gridBidAdapter.js
@@ -78,9 +78,6 @@ export const spec = {
}
const {params: {uid, keywords}, mediaTypes, bidId, adUnitCode, rtd, ortb2Imp} = bid;
bidsMap[bidId] = bid;
- if (!pageKeywords && !utils.isEmpty(keywords)) {
- pageKeywords = utils.transformBidderParamKeywords(keywords);
- }
const bidFloor = _getFloor(mediaTypes || {}, bid);
const jwTargeting = rtd && rtd.jwplayer && rtd.jwplayer.targeting;
if (jwTargeting) {
@@ -104,6 +101,12 @@ export const spec = {
impObj.ext.gpid = impObj.ext.data.adserver.adslot;
}
}
+ if (!utils.isEmpty(keywords)) {
+ if (!pageKeywords) {
+ pageKeywords = keywords;
+ }
+ impObj.ext.bidder = { keywords };
+ }
if (bidFloor) {
impObj.bidfloor = bidFloor;
@@ -185,23 +188,37 @@ export const spec = {
request.user = user;
}
- const configKeywords = utils.transformBidderParamKeywords({
- 'user': utils.deepAccess(config.getConfig('ortb2.user'), 'keywords') || null,
- 'context': utils.deepAccess(config.getConfig('ortb2.site'), 'keywords') || null
- });
+ const userKeywords = utils.deepAccess(config.getConfig('ortb2.user'), 'keywords') || null;
+ const siteKeywords = utils.deepAccess(config.getConfig('ortb2.site'), 'keywords') || null;
- if (configKeywords.length) {
- pageKeywords = (pageKeywords || []).concat(configKeywords);
+ if (userKeywords) {
+ pageKeywords = pageKeywords || {};
+ pageKeywords.user = pageKeywords.user || {};
+ pageKeywords.user.ortb2 = [
+ {
+ name: 'keywords',
+ keywords: userKeywords.split(','),
+ }
+ ];
}
-
- if (pageKeywords && pageKeywords.length > 0) {
- pageKeywords.forEach(deleteValues);
+ if (siteKeywords) {
+ pageKeywords = pageKeywords || {};
+ pageKeywords.site = pageKeywords.site || {};
+ pageKeywords.site.ortb2 = [
+ {
+ name: 'keywords',
+ keywords: siteKeywords.split(','),
+ }
+ ];
}
if (pageKeywords) {
- request.ext = {
- keywords: pageKeywords
- };
+ pageKeywords = reformatKeywords(pageKeywords);
+ if (pageKeywords) {
+ request.ext = {
+ keywords: pageKeywords
+ };
+ }
}
if (gdprConsent && gdprConsent.gdprApplies) {
@@ -311,16 +328,6 @@ function _getFloor (mediaTypes, bid) {
return floor;
}
-function isPopulatedArray(arr) {
- return !!(utils.isArray(arr) && arr.length > 0);
-}
-
-function deleteValues(keyPairObj) {
- if (isPopulatedArray(keyPairObj.value) && keyPairObj.value[0] === '') {
- delete keyPairObj.value;
- }
-}
-
function _getBidFromResponse(respItem) {
if (!respItem) {
utils.logError(LOG_ERROR_MESS.emptySeatbid);
@@ -341,13 +348,13 @@ function _addBidResponse(serverBid, bidRequest, bidResponses) {
const bid = bidRequest.bidsMap[serverBid.impid];
if (bid) {
const bidResponse = {
- requestId: bid.bidId, // bid.bidderRequestId,
+ requestId: bid.bidId, // bid.bidderRequestId
cpm: serverBid.price,
width: serverBid.w,
height: serverBid.h,
- creativeId: serverBid.auid, // bid.bidId,
+ creativeId: serverBid.auid, // bid.bidId
currency: 'USD',
- netRevenue: false,
+ netRevenue: true,
ttl: TIME_TO_LIVE,
meta: {
advertiserDomains: serverBid.adomain ? serverBid.adomain : []
@@ -355,6 +362,11 @@ function _addBidResponse(serverBid, bidRequest, bidResponses) {
dealId: serverBid.dealid
};
+ if (serverBid.ext && serverBid.ext.bidder && serverBid.ext.bidder.grid && serverBid.ext.bidder.grid.demandSource) {
+ bidResponse.adserverTargeting = { 'hb_ds': serverBid.ext.bidder.grid.demandSource };
+ bidResponse.meta.demandSource = serverBid.ext.bidder.grid.demandSource;
+ }
+
if (serverBid.content_type === 'video') {
bidResponse.vastXml = serverBid.adm;
bidResponse.mediaType = VIDEO;
@@ -415,6 +427,51 @@ function createBannerRequest(bid, mediaType) {
return result;
}
+function reformatKeywords(pageKeywords) {
+ const formatedPageKeywords = {};
+ Object.keys(pageKeywords).forEach((name) => {
+ const keywords = pageKeywords[name];
+ if (keywords) {
+ if (name === 'site' || name === 'user') {
+ const formatedKeywords = {};
+ Object.keys(keywords).forEach((pubName) => {
+ if (Array.isArray(keywords[pubName])) {
+ const formatedPublisher = [];
+ keywords[pubName].forEach((pubItem) => {
+ if (typeof pubItem === 'object' && pubItem.name) {
+ const formatedPubItem = { name: pubItem.name, segments: [] };
+ Object.keys(pubItem).forEach((key) => {
+ if (Array.isArray(pubItem[key])) {
+ pubItem[key].forEach((keyword) => {
+ if (keyword) {
+ if (typeof keyword === 'string') {
+ formatedPubItem.segments.push({ name: key, value: keyword });
+ } else if (key === 'segments' && typeof keyword.name === 'string' && typeof keyword.value === 'string') {
+ formatedPubItem.segments.push(keyword);
+ }
+ }
+ });
+ }
+ });
+ if (formatedPubItem.segments.length) {
+ formatedPublisher.push(formatedPubItem);
+ }
+ }
+ });
+ if (formatedPublisher.length) {
+ formatedKeywords[pubName] = formatedPublisher;
+ }
+ }
+ });
+ formatedPageKeywords[name] = formatedKeywords;
+ } else {
+ formatedPageKeywords[name] = keywords;
+ }
+ }
+ });
+ return Object.keys(formatedPageKeywords).length && formatedPageKeywords;
+}
+
function outstreamRender (bid) {
bid.renderer.push(() => {
window.ANOutstreamVideo.renderAd({
diff --git a/modules/gridNMBidAdapter.js b/modules/gridNMBidAdapter.js
index af1e9f84f43..4ab8464b115 100644
--- a/modules/gridNMBidAdapter.js
+++ b/modules/gridNMBidAdapter.js
@@ -24,6 +24,8 @@ const LOG_ERROR_MESS = {
hasNoArrayOfBids: 'Seatbid from response has no array of bid objects - '
};
+const VIDEO_KEYS = ['mimes', 'protocols', 'startdelay', 'placement', 'linearity', 'skip', 'skipmin', 'skipafter', 'sequence', 'battr', 'maxextended', 'minbitrate', 'maxbitrate', 'boxingallowed', 'playbackmethod', 'playbackend', 'delivery', 'pos', 'companionad', 'api', 'companiontype'];
+
export const spec = {
code: BIDDER_CODE,
supportedMediaTypes: [ VIDEO ],
@@ -39,11 +41,12 @@ export const spec = {
!bid.params.secid || !utils.isStr(bid.params.secid) ||
!bid.params.pubid || !utils.isStr(bid.params.pubid);
+ const video = utils.deepAccess(bid, 'mediaTypes.video') || {};
+ const { protocols = video.protocols, mimes = video.mimes } = utils.deepAccess(bid, 'params.video') || {};
if (!invalid) {
- invalid = !bid.params.video || !bid.params.video.protocols || !bid.params.video.mimes;
+ invalid = !protocols || !mimes;
}
if (!invalid) {
- const {protocols, mimes} = bid.params.video;
invalid = !utils.isArray(mimes) || !mimes.length || mimes.filter((it) => !(it && utils.isStr(it))).length;
if (!invalid) {
invalid = !utils.isArray(protocols) || !protocols.length || protocols.filter((it) => !(utils.isNumber(it) && it > 0 && !(it % 1))).length;
@@ -63,7 +66,7 @@ export const spec = {
const requests = [];
bids.forEach(bid => {
- const {params, bidderRequestId, sizes} = bid;
+ const { params, bidderRequestId, sizes } = bid;
const payload = {
sizes: utils.parseSizesInput(sizes).join(','),
r: bidderRequestId,
@@ -91,11 +94,32 @@ export const spec = {
}
}
+ const video = utils.deepAccess(bid, 'mediaTypes.video') || {};
+ const paramsVideo = Object.assign({}, params.video);
+ VIDEO_KEYS.forEach((key) => {
+ if (!(key in paramsVideo) && key in video) {
+ paramsVideo[key] = video[key];
+ }
+ });
+
+ if (!paramsVideo.size && video.playerSize && video.playerSize.length === 2) {
+ paramsVideo.size = video.playerSize.join('x');
+ }
+
+ if (!('mind' in paramsVideo) && 'minduration' in video) {
+ paramsVideo.mind = video.minduration;
+ }
+ if (!('maxd' in paramsVideo) && 'maxduration' in video) {
+ paramsVideo.maxd = video.maxduration;
+ }
+
+ const paramsToSend = Object.assign({}, params, {video: paramsVideo});
+
requests.push({
method: 'POST',
url: ENDPOINT_URL + '?' + utils.parseQueryStringParameters(payload).replace(/\&$/, ''),
bid: bid,
- data: params // content
+ data: paramsToSend // content
});
});
@@ -139,11 +163,14 @@ export const spec = {
height: serverBid.h,
creativeId: serverBid.auid || bid.bidderRequestId,
currency: 'USD',
- netRevenue: false,
+ netRevenue: true,
ttl: TIME_TO_LIVE,
dealId: serverBid.dealid,
vastXml: serverBid.adm,
mediaType: VIDEO,
+ meta: {
+ advertiserDomains: serverBid.adomain ? serverBid.adomain : []
+ },
adResponse: {
content: serverBid.adm
}
diff --git a/modules/growadvertisingBidAdapter.js b/modules/growadvertisingBidAdapter.js
new file mode 100644
index 00000000000..0626b137a1b
--- /dev/null
+++ b/modules/growadvertisingBidAdapter.js
@@ -0,0 +1,163 @@
+'use strict';
+
+import * as utils from '../src/utils.js';
+import {registerBidder} from '../src/adapters/bidderFactory.js';
+import {BANNER, NATIVE} from '../src/mediaTypes.js';
+import {triggerPixel} from '../src/utils.js';
+
+const BIDDER_CODE = 'growads';
+
+export const spec = {
+ code: BIDDER_CODE,
+ supportedMediaTypes: [BANNER, NATIVE],
+
+ isBidRequestValid: function (bid) {
+ return bid.params && !!bid.params.zoneId;
+ },
+
+ buildRequests: function (validBidRequests) {
+ let zoneId;
+ let domain;
+ let requestURI;
+ let data = {};
+ const zoneCounters = {};
+
+ return validBidRequests.map(bidRequest => {
+ zoneId = utils.getBidIdParameter('zoneId', bidRequest.params);
+ domain = utils.getBidIdParameter('domain', bidRequest.params);
+
+ if (!(zoneId in zoneCounters)) {
+ zoneCounters[zoneId] = 0;
+ }
+
+ if (typeof domain === 'undefined' || domain.length === 0) {
+ domain = 'portal.growadvertising.com';
+ }
+
+ requestURI = 'https://' + domain + '/adserve/bid';
+ data = {
+ type: 'prebidjs',
+ zoneId: zoneId,
+ i: zoneCounters[zoneId]
+ };
+ zoneCounters[zoneId]++;
+
+ return {
+ method: 'GET',
+ url: requestURI,
+ data: data,
+ bidRequest: bidRequest
+ };
+ });
+ },
+
+ interpretResponse: function (serverResponse, bidRequest) {
+ const request = bidRequest.bidRequest;
+ let bidResponses = [];
+ let CPM;
+ let width;
+ let height;
+ let response;
+ let isCorrectSize = false;
+ let isCorrectCPM = true;
+ let minCPM;
+ let maxCPM;
+ let bid = {};
+
+ let body = serverResponse.body;
+
+ try {
+ response = JSON.parse(body);
+ } catch (ex) {
+ response = body;
+ }
+
+ if (response && response.status === 'success' && request) {
+ CPM = parseFloat(response.cpm);
+ width = parseInt(response.width);
+ height = parseInt(response.height);
+
+ minCPM = utils.getBidIdParameter('minCPM', request.params);
+ maxCPM = utils.getBidIdParameter('maxCPM', request.params);
+ width = parseInt(response.width);
+ height = parseInt(response.height);
+
+ // Ensure response CPM is within the given bounds
+ if (minCPM !== '' && CPM < parseFloat(minCPM)) {
+ isCorrectCPM = false;
+ }
+ if (maxCPM !== '' && CPM > parseFloat(maxCPM)) {
+ isCorrectCPM = false;
+ }
+
+ if (isCorrectCPM) {
+ bid = {
+ requestId: request.bidId,
+ bidderCode: request.bidder,
+ creativeId: response.creativeId,
+ cpm: CPM,
+ width: width,
+ height: height,
+ currency: response.currency,
+ netRevenue: true,
+ ttl: response.ttl,
+ adUnitCode: request.adUnitCode,
+ referrer: utils.deepAccess(request, 'refererInfo.referer')
+ };
+
+ if (response.hasOwnProperty(NATIVE)) {
+ bid[NATIVE] = {
+ title: response[NATIVE].title,
+ body: response[NATIVE].body,
+ body2: response[NATIVE].body2,
+ cta: response[NATIVE].cta,
+ sponsoredBy: response[NATIVE].sponsoredBy,
+ clickUrl: response[NATIVE].clickUrl,
+ impressionTrackers: response[NATIVE].impressionTrackers,
+ };
+
+ if (response[NATIVE].image) {
+ bid[NATIVE].image = {
+ url: response[NATIVE].image.url,
+ height: response[NATIVE].image.height,
+ width: response[NATIVE].image.width
+ };
+ }
+
+ if (response[NATIVE].icon) {
+ bid[NATIVE].icon = {
+ url: response[NATIVE].icon.url,
+ height: response[NATIVE].icon.height,
+ width: response[NATIVE].icon.width
+ };
+ }
+ bid.mediaType = NATIVE;
+ isCorrectSize = true;
+ } else {
+ bid.ad = response.ad;
+ bid.mediaType = BANNER;
+ // Ensure that response ad matches one of the placement sizes.
+ utils._each(utils.deepAccess(request, 'mediaTypes.banner.sizes', []), function (size) {
+ if (width === size[0] && height === size[1]) {
+ isCorrectSize = true;
+ }
+ });
+ }
+
+ if (isCorrectSize) {
+ bidResponses.push(bid);
+ }
+ }
+ }
+
+ return bidResponses;
+ },
+
+ onBidWon: function (bid) {
+ if (bid.vurl) {
+ triggerPixel(bid.vurl);
+ }
+ },
+};
+
+registerBidder(spec);
diff --git a/modules/growadvertisingBidAdapter.md b/modules/growadvertisingBidAdapter.md
new file mode 100644
index 00000000000..f17691e9b9f
--- /dev/null
+++ b/modules/growadvertisingBidAdapter.md
@@ -0,0 +1,70 @@
+---
+layout: bidder
+title: GrowAdvertising
+description: Prebid GrowAdvertising Bidder Adapter
+pbjs: true
+biddercode: growads
+media_types: banner
+---
+
+### Bid Params
+
+| Name | Scope | Description | Example | Type |
+|----------|----------|-----------|--------------------|----------|
+| `zoneId` | required | ZoneId ID | `'unique-zone-id'` | `string` |
+| `domain` | optional | Domain | `'example.org'` | `string` |
+| `minCPM` | optional | Minimum CPM | `1.5` | `float` |
+| `maxCPM` | optional | Maximum CPM | `10.8` | `float` |
+
+# Test Parameters
+```
+var adUnits = [
+ {
+ code: 'test-div',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]
+ }
+ },
+ bids: [
+ {
+ bidder: "growads",
+ params: {
+ zoneId: '6WG9JK8-RvKai86-yL980YC-kQFoqXZ',
+ domain: 'native-test.growadvertising.com'
+ }
+ }
+ ]
+ },
+ // Native adUnit
+ {
+ code: 'native-div',
+ sizes: [[1, 1]],
+ mediaTypes: {
+ native: {
+ title: {
+ required: true
+ },
+ body: {
+ required: true
+ },
+ image: {
+ required: true
+ },
+ sponsoredBy: {
+ required: true
+ },
+ }
+ },
+ bids: [
+ {
+ bidder: 'growads',
+ params: {
+ zoneId: 'YpQobqT-vEybhHx-1qaNMFx-Wj3Kwc2',
+ domain: 'native-test.growadvertising.com'
+ }
+ }
+ ]
+ },
+ ];
+```
diff --git a/modules/gumgumBidAdapter.js b/modules/gumgumBidAdapter.js
index 4786fd04b15..9b4ec41049c 100644
--- a/modules/gumgumBidAdapter.js
+++ b/modules/gumgumBidAdapter.js
@@ -83,14 +83,6 @@ function getWrapperCode(wrapper, data) {
return wrapper.replace('AD_JSON', window.btoa(JSON.stringify(data)))
}
-function _getTradeDeskIDParam(userId) {
- const unifiedIdObj = {};
- if (userId.tdid) {
- unifiedIdObj.tdid = userId.tdid;
- }
- return unifiedIdObj;
-}
-
function _getDigiTrustQueryParams(userId) {
let digiTrustId = userId.digitrustid && userId.digitrustid.data;
// Verify there is an ID and this user has not opted out
@@ -208,7 +200,7 @@ function _getVidParams (attributes) {
* @param {Object} bid
* @returns {Number} floor
*/
-function _getFloor (mediaTypes, staticBidfloor, bid) {
+function _getFloor (mediaTypes, staticBidFloor, bid) {
const curMediaType = Object.keys(mediaTypes)[0] || 'banner';
const bidFloor = { floor: 0, currency: 'USD' };
@@ -220,14 +212,39 @@ function _getFloor (mediaTypes, staticBidfloor, bid) {
floor && (bidFloor.floor = floor);
currency && (bidFloor.currency = currency);
- if (staticBidfloor && floor && currency === 'USD') {
- bidFloor.floor = Math.max(staticBidfloor, parseFloat(floor));
+ if (staticBidFloor && floor && currency === 'USD') {
+ bidFloor.floor = Math.max(staticBidFloor, parseFloat(floor));
}
+ } else if (staticBidFloor) {
+ bidFloor.floor = staticBidFloor
}
return bidFloor;
}
+function getEids (userId) {
+ const idProperties = [
+ 'uid',
+ 'eid',
+ 'lipbid'
+ ];
+
+ return Object.keys(userId).reduce(function (eids, provider) {
+ const eid = userId[provider];
+ switch (typeof eid) {
+ case 'string':
+ eids[provider] = eid;
+ break;
+
+ case 'object':
+ const idProp = idProperties.filter(prop => eid.hasOwnProperty(prop));
+ idProp.length && (eids[provider] = eid[idProp[0]]);
+ break;
+ }
+ return eids;
+ }, {});
+}
+
/**
* Make a server request from the list of BidRequests.
*
@@ -247,11 +264,22 @@ function buildRequests (validBidRequests, bidderRequest) {
params = {},
schain,
transactionId,
- userId = {}
+ userId = {},
+ ortb2Imp
} = bidRequest;
const { currency, floor } = _getFloor(mediaTypes, params.bidfloor, bidRequest);
+ const eids = getEids(userId);
let sizes = [1, 1];
let data = {};
+ let gpid = '';
+
+ // ADTS-134 Retrieve ID envelopes
+ for (const eid in eids) data[eid] = eids[eid];
+
+ // ADJS-1024
+ if (utils.deepAccess(ortb2Imp, 'ext.data.adserver.name')) {
+ gpid = ortb2Imp.ext.data.adserver.adslot
+ }
if (mediaTypes.banner) {
sizes = mediaTypes.banner.sizes;
@@ -318,7 +346,8 @@ function buildRequests (validBidRequests, bidderRequest) {
sizes,
url: BID_ENDPOINT,
method: 'GET',
- data: Object.assign(data, _getBrowserParams(topWindowUrl), _getDigiTrustQueryParams(userId), _getTradeDeskIDParam(userId))
+ gpid: gpid,
+ data: Object.assign(data, _getBrowserParams(topWindowUrl), _getDigiTrustQueryParams(userId))
})
});
return bids;
diff --git a/modules/haloIdSystem.js b/modules/haloIdSystem.js
index 4a0330367f5..3011569a17d 100644
--- a/modules/haloIdSystem.js
+++ b/modules/haloIdSystem.js
@@ -15,6 +15,20 @@ const AU_GVLID = 561;
export const storage = getStorageManager(AU_GVLID, 'halo');
+/**
+ * Param or default.
+ * @param {String} param
+ * @param {String} defaultVal
+ */
+function paramOrDefault(param, defaultVal, arg) {
+ if (utils.isFn(param)) {
+ return param(arg);
+ } else if (utils.isStr(param)) {
+ return param;
+ }
+ return defaultVal;
+}
+
/** @type {Submodule} */
export const haloIdSubmodule = {
/**
@@ -42,7 +56,12 @@ export const haloIdSubmodule = {
* @returns {IdResponse|undefined}
*/
getId(config) {
- const url = `https://id.halo.ad.gt/api/v1/pbhid`;
+ if (!utils.isPlainObject(config.params)) {
+ config.params = {};
+ }
+ const url = paramOrDefault(config.params.url,
+ `https://id.halo.ad.gt/api/v1/pbhid`,
+ config.params.urlArg);
const resp = function (callback) {
let haloId = storage.getDataFromLocalStorage('auHaloId');
diff --git a/modules/haloIdSystem.md b/modules/haloIdSystem.md
index 0be0be27f5d..f740ae58048 100644
--- a/modules/haloIdSystem.md
+++ b/modules/haloIdSystem.md
@@ -30,3 +30,6 @@ The below parameters apply only to the HaloID User ID Module integration.
| storage.name | Required | String | The name of the cookie or html5 local storage where the user ID will be stored. | `"haloid"` |
| storage.expires | Optional | Integer | How long (in days) the user ID information will be stored. | `365` |
| value | Optional | Object | Used only if the page has a separate mechanism for storing the Halo ID. The value is an object containing the values to be sent to the adapters. In this scenario, no URL is called and nothing is added to local storage | `{"haloId": "eb33b0cb-8d35-4722-b9c0-1a31d4064888"}` |
+| params | Optional | Object | Used to store params for the id system |
+| params.url | Optional | String | Set an alternate GET url for HaloId with this parameter |
+| params.urlArg | Optional | Object | Optional url parameter for params.url |
diff --git a/modules/haloRtdProvider.js b/modules/haloRtdProvider.js
index b57787aab14..d889310a7c2 100644
--- a/modules/haloRtdProvider.js
+++ b/modules/haloRtdProvider.js
@@ -10,7 +10,7 @@ import {config} from '../src/config.js';
import {getGlobal} from '../src/prebidGlobal.js';
import {getStorageManager} from '../src/storageManager.js';
import {submodule} from '../src/hook.js';
-import {isFn, isStr, isPlainObject, mergeDeep, logError} from '../src/utils.js';
+import {isFn, isStr, isArray, deepEqual, isPlainObject, logError} from '../src/utils.js';
const MODULE_NAME = 'realTimeData';
const SUBMODULE_NAME = 'halo';
@@ -26,25 +26,67 @@ export const storage = getStorageManager(AU_GVLID, SUBMODULE_NAME);
* @param {String} path
* @param {Object} val
*/
-const set = (obj, path, val) => {
+function set(obj, path, val) {
const keys = path.split('.');
const lastKey = keys.pop();
const lastObj = keys.reduce((obj, key) => obj[key] = obj[key] || {}, obj);
lastObj[lastKey] = lastObj[lastKey] || val;
-};
+}
+
+/**
+ * Deep object merging with array deduplication.
+ * @param {Object} target
+ * @param {Object} sources
+ */
+function mergeDeep(target, ...sources) {
+ if (!sources.length) return target;
+ const source = sources.shift();
+
+ if (isPlainObject(target) && isPlainObject(source)) {
+ for (const key in source) {
+ if (isPlainObject(source[key])) {
+ if (!target[key]) Object.assign(target, { [key]: {} });
+ mergeDeep(target[key], source[key]);
+ } else if (isArray(source[key])) {
+ if (!target[key]) {
+ Object.assign(target, { [key]: source[key] });
+ } else if (isArray(target[key])) {
+ source[key].forEach(obj => {
+ let e = 1;
+ for (let i = 0; i < target[key].length; i++) {
+ if (deepEqual(target[key][i], obj)) {
+ e = 0;
+ break;
+ }
+ }
+ if (e) {
+ target[key].push(obj);
+ }
+ });
+ }
+ } else {
+ Object.assign(target, { [key]: source[key] });
+ }
+ }
+ }
+
+ return mergeDeep(target, ...sources);
+}
/**
* Lazy merge objects.
- * @param {String} target
- * @param {String} source
+ * @param {Object} target
+ * @param {Object} source
*/
function mergeLazy(target, source) {
if (!isPlainObject(target)) {
target = {};
}
+
if (!isPlainObject(source)) {
source = {};
}
+
return mergeDeep(target, source);
}
@@ -69,12 +111,31 @@ function paramOrDefault(param, defaultVal, arg) {
* @param {Object} rtdConfig
*/
export function addRealTimeData(bidConfig, rtd, rtdConfig) {
- let ortb2 = config.getConfig('ortb2') || {};
-
if (rtdConfig.params && rtdConfig.params.handleRtd) {
rtdConfig.params.handleRtd(bidConfig, rtd, rtdConfig, config);
- } else if (rtd.ortb2) {
- config.setConfig({ortb2: mergeLazy(ortb2, rtd.ortb2)});
+ } else {
+ if (isPlainObject(rtd.ortb2)) {
+ let ortb2 = config.getConfig('ortb2') || {};
+ config.setConfig({ortb2: mergeLazy(ortb2, rtd.ortb2)});
+ }
+
+ if (isPlainObject(rtd.ortb2b)) {
+ let bidderConfig = config.getBidderConfig();
+
+ Object.keys(rtd.ortb2b).forEach(bidder => {
+ let rtdOptions = rtd.ortb2b[bidder] || {};
+
+ let bidderOptions = {};
+ if (isPlainObject(bidderConfig[bidder])) {
+ bidderOptions = bidderConfig[bidder];
+ }
+
+ config.setBidderConfig({
+ bidders: [bidder],
+ config: mergeLazy(bidderOptions, rtdOptions)
+ });
+ });
+ }
}
}
@@ -104,6 +165,7 @@ export function getRealTimeData(bidConfig, onDone, rtdConfig, userConsent) {
let haloId = storage.getDataFromLocalStorage(HALOID_LOCAL_NAME);
if (isStr(haloId)) {
+ (getGlobal()).refreshUserIds({submoduleNames: 'haloId'});
userIds.haloId = haloId;
getRealTimeDataAsync(bidConfig, onDone, rtdConfig, userConsent, userIds);
} else {
diff --git a/modules/haloRtdProvider.md b/modules/haloRtdProvider.md
index 4307618bb60..4a264af9e2e 100644
--- a/modules/haloRtdProvider.md
+++ b/modules/haloRtdProvider.md
@@ -1,16 +1,23 @@
## Audigent Halo Real-time Data Submodule
-Audigent is a next-generation data management platform and a first-of-a-kind
-"data agency" containing some of the most exclusive content-consuming audiences
-across desktop, mobile and social platforms.
-
-This real-time data module provides quality segmentation that can be
-provided to bid request objects destined for different SSPs in order to optimize
-targeting. Audigent maintains a large database of first-party Tradedesk Unified
-ID, Audigent Halo ID and other id provider mappings to various third-party
-segment types that are utilizable across different SSPs. With this module,
-these segments and other data can be retrieved and supplied to your pages
-and the bidstream in real-time during the bid request cycle.
+Audigent is a next-generation, 1st party data management platform and the
+world’s first "data agency", powering the programmatic landscape and DTC
+eCommerce with actionable 1st party audience and contextual data from the
+world’s most influential retailers, lifestyle publishers, content creators,
+athletes and artists.
+
+The Halo real-time data module in Prebid has been built so that publishers
+can maximize the power of their first-party audiences and contextual data.
+This module provides both an integrated cookieless Halo identity with real-time
+contextual and audience segmentation solution that seamlessly and easily
+integrates into your existing Prebid deployment.
+
+Users, devices, content, cohorts and other features are identified and utilized
+to augment every bid request with targeted, 1st party data-derived segments
+before being submitted to supply-side platforms. Enriching the bid request with
+robust 1st party audience and contextual data, Audigent's Halo RTD module
+optimizes targeting, increases the number of bids, increases bid value,
+and drives additional incremental revenue for publishers.
### Publisher Usage
@@ -29,7 +36,7 @@ and segment configurations.
pbjs.setConfig(
...
realTimeData: {
- auctionDelay: auctionDelay,
+ auctionDelay: 5000,
dataProviders: [
{
name: "halo",
@@ -117,7 +124,3 @@ To view an example of available segments returned by Audigent's backends:
and then point your browser at:
`http://localhost:9999/integrationExamples/gpt/haloRtdProvider_example.html`
-
-
-
-
diff --git a/modules/haxmediaBidAdapter.js b/modules/haxmediaBidAdapter.js
deleted file mode 100644
index c4ce2eb3663..00000000000
--- a/modules/haxmediaBidAdapter.js
+++ /dev/null
@@ -1,107 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'haxmedia';
-const AD_URL = 'https://balancer.haxmedia.io/?c=o&m=multi';
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId ||
- !bid.ttl || !bid.currency) {
- return false;
- }
- switch (bid.mediaType) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- return Boolean(bid.native && bid.native.impressionTrackers);
- default:
- return false;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(parseInt(bid.params.placementId)));
- },
-
- buildRequests: (validBidRequests = [], bidderRequest) => {
- let winTop = window;
- let location;
- try {
- location = new URL(bidderRequest.refererInfo.referer)
- winTop = window.top;
- } catch (e) {
- location = winTop.location;
- utils.logMessage(e);
- };
-
- const placements = [];
- const request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language.split('-')[0] : '',
- 'secure': 1,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
-
- if (bidderRequest) {
- if (bidderRequest.uspConsent) {
- request.ccpa = bidderRequest.uspConsent;
- }
- if (bidderRequest.gdprConsent) {
- request.gdpr = bidderRequest.gdprConsent
- }
- }
-
- const len = validBidRequests.length;
- for (let i = 0; i < len; i++) {
- const bid = validBidRequests[i];
- const placement = {
- placementId: bid.params.placementId,
- bidId: bid.bidId,
- schain: bid.schain || {},
- };
- const mediaType = bid.mediaTypes
-
- if (mediaType && mediaType[BANNER] && mediaType[BANNER].sizes) {
- placement.sizes = mediaType[BANNER].sizes;
- placement.traffic = BANNER;
- } else if (mediaType && mediaType[VIDEO] && mediaType[VIDEO].playerSize) {
- placement.wPlayer = mediaType[VIDEO].playerSize[0];
- placement.hPlayer = mediaType[VIDEO].playerSize[1];
- placement.traffic = VIDEO;
- } else if (mediaType && mediaType[NATIVE]) {
- placement.native = mediaType[NATIVE];
- placement.traffic = NATIVE;
- }
- placements.push(placement);
- }
-
- return {
- method: 'POST',
- url: AD_URL,
- data: request
- };
- },
-
- interpretResponse: (serverResponse) => {
- let response = [];
- for (let i = 0; i < serverResponse.body.length; i++) {
- let resItem = serverResponse.body[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- return response;
- },
-};
-
-registerBidder(spec);
diff --git a/modules/hpmdnetworkBidAdapter.js b/modules/hpmdnetworkBidAdapter.js
deleted file mode 100644
index 5cc28ab6362..00000000000
--- a/modules/hpmdnetworkBidAdapter.js
+++ /dev/null
@@ -1,96 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'hpmdnetwork';
-const BIDDER_CODE_ALIAS = 'hpmd';
-const HPMDNETWORK_HOST = 'https://banner.hpmdnetwork.ru/bidder/request';
-const DEFAULT_TTL = 300;
-const DEFAULT_CURRENCY = 'RUB';
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: [ BIDDER_CODE_ALIAS ],
- supportedMediaTypes: [ BANNER ],
- isBidRequestValid: isBidRequestValid,
- buildRequests: buildRequests,
- interpretResponse: interpretResponse,
-};
-
-function isBidRequestValid(bid) {
- const { placementId } = bid.params;
- return !!placementId;
-}
-
-function buildRequests(validBidRequests, bidderRequest) {
- const payload = {};
- payload.places = [];
-
- validBidRequests.forEach((bidRequest) => {
- const place = {
- id: bidRequest.bidId,
- placementId: bidRequest.params.placementId + '',
- };
- payload.places.push(place);
- });
-
- payload.url = bidderRequest.refererInfo.referer;
- payload.settings = { currency: DEFAULT_CURRENCY };
-
- return {
- method: 'POST',
- url: HPMDNETWORK_HOST,
- data: payload,
- };
-}
-
-function interpretResponse(serverResponse) {
- const { body } = serverResponse;
- const bidResponses = [];
-
- if (body.bids) {
- body.bids.forEach((bid) => {
- const size = getCreativeSize(bid);
- const bidResponse = {
- requestId: bid.id,
- cpm: bid.cpm,
- ad: wrapDisplayUrl(bid.displayUrl),
- width: size.width,
- height: size.height,
- creativeId: bid.creativeId || generateRandomInt(),
- currency: bid.currency || DEFAULT_CURRENCY,
- netRevenue: true,
- ttl: bid.ttl || DEFAULT_TTL,
- };
-
- bidResponses.push(bidResponse);
- });
- }
-
- return bidResponses;
-}
-
-function wrapDisplayUrl(displayUrl) {
- return ``;
-}
-
-function getCreativeSize(creativeSize) {
- const size = {
- width: 1,
- height: 1,
- };
-
- if (!!creativeSize.width && creativeSize.width !== -1) {
- size.width = creativeSize.width;
- }
- if (!!creativeSize.height && creativeSize.height !== -1) {
- size.height = creativeSize.height;
- }
-
- return size;
-}
-
-function generateRandomInt() {
- return Math.random().toString(16).substring(2);
-}
-
-registerBidder(spec);
diff --git a/modules/iasBidAdapter.js b/modules/iasBidAdapter.js
deleted file mode 100644
index 733c123e769..00000000000
--- a/modules/iasBidAdapter.js
+++ /dev/null
@@ -1,134 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'ias';
-
-const otherBidIds = [];
-
-function isBidRequestValid(bid) {
- const { pubId, adUnitPath } = bid.params;
- return !!(pubId && adUnitPath);
-}
-
-/**
- * Converts GPT-style size array into a string
- * @param {Array} sizes: list of GPT-style sizes, e.g. [[300, 250], [300, 300]]
- * @return {String} a string containing sizes, e.g. '[300.250,300.300]'
- */
-function stringifySlotSizes(sizes) {
- let result = '';
- if (utils.isArray(sizes)) {
- result = sizes.reduce((acc, size) => {
- acc.push(size.join('.'));
- return acc;
- }, []);
- result = '[' + result.join(',') + ']';
- }
- return result;
-}
-
-function stringifySlot(bidRequest) {
- const id = bidRequest.adUnitCode;
- const ss = stringifySlotSizes(bidRequest.sizes);
- const p = bidRequest.params.adUnitPath;
- const slot = { id, ss, p };
- const keyValues = utils.getKeys(slot).map(function(key) {
- return [key, slot[key]].join(':');
- });
- return '{' + keyValues.join(',') + '}';
-}
-
-function stringifyWindowSize() {
- return [ window.innerWidth || -1, window.innerHeight || -1 ].join('.');
-}
-
-function stringifyScreenSize() {
- return [ (window.screen && window.screen.width) || -1, (window.screen && window.screen.height) || -1 ].join('.');
-}
-
-function buildRequests(bidRequests) {
- const IAS_HOST = 'https://pixel.adsafeprotected.com/services/pub';
- const anId = bidRequests[0].params.pubId;
-
- let queries = [];
- queries.push(['anId', anId]);
- queries = queries.concat(bidRequests.reduce(function(acc, request) {
- acc.push(['slot', stringifySlot(request)]);
- return acc;
- }, []));
-
- queries.push(['wr', stringifyWindowSize()]);
- queries.push(['sr', stringifyScreenSize()]);
- queries.push(['url', encodeURIComponent(window.location.href)]);
-
- const queryString = encodeURI(queries.map(qs => qs.join('=')).join('&'));
-
- bidRequests.forEach(function (request) {
- if (bidRequests[0].bidId != request.bidId) {
- otherBidIds.push(request.bidId);
- }
- });
-
- return {
- method: 'GET',
- url: IAS_HOST,
- data: queryString,
- bidRequest: bidRequests[0]
- };
-}
-
-function getPageLevelKeywords(response) {
- let result = {};
- shallowMerge(result, response.brandSafety);
- result.fr = response.fr;
- result.custom = response.custom;
- return result;
-}
-
-function shallowMerge(dest, src) {
- utils.getKeys(src).reduce((dest, srcKey) => {
- dest[srcKey] = src[srcKey];
- return dest;
- }, dest);
-}
-
-function interpretResponse(serverResponse, request) {
- const iasResponse = serverResponse.body;
- const bidResponses = [];
-
- // Keys in common bid response are not used;
- // Necessary to get around with prebid's common bid response check
- const commonBidResponse = {
- requestId: request.bidRequest.bidId,
- cpm: 0.01,
- width: 100,
- height: 200,
- creativeId: 434,
- dealId: 42,
- currency: 'USD',
- netRevenue: true,
- ttl: 360
- };
-
- shallowMerge(commonBidResponse, getPageLevelKeywords(iasResponse));
- commonBidResponse.slots = iasResponse.slots;
- bidResponses.push(commonBidResponse);
-
- otherBidIds.forEach(function (bidId) {
- var otherResponse = Object.assign({}, commonBidResponse);
- otherResponse.requestId = bidId;
- bidResponses.push(otherResponse);
- });
-
- return bidResponses;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: [],
- isBidRequestValid: isBidRequestValid,
- buildRequests: buildRequests,
- interpretResponse: interpretResponse
-};
-
-registerBidder(spec);
diff --git a/modules/iasBidAdapter.md b/modules/iasBidAdapter.md
deleted file mode 100644
index 3224fbf4a26..00000000000
--- a/modules/iasBidAdapter.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Overview
-
-```
-Module Name: Integral Ad Science(IAS) Bidder Adapter
-Module Type: Bidder Adapter
-Maintainer: kat@integralads.com
-```
-
-# Description
-
-This module is an integration with prebid.js with an IAS product, pet.js. It is not a bidder per se but works in a similar way: retrieve data that publishers might be interested in setting keyword targeting.
-
-# Test Parameters
-```
- var adUnits = [
- {
- code: 'ias-dfp-test-async',
- sizes: [[300, 250]], // a display size
- bids: [
- {
- bidder: "ias",
- params: {
- pubId: '99',
- adUnitPath: '/57514611/news.com'
- }
- }
- ]
- }
- ];
-```
diff --git a/modules/iasRtdProvider.js b/modules/iasRtdProvider.js
new file mode 100644
index 00000000000..bbd2529bf86
--- /dev/null
+++ b/modules/iasRtdProvider.js
@@ -0,0 +1,124 @@
+import { submodule } from '../src/hook.js';
+import { getGlobal } from '../src/prebidGlobal.js';
+import * as utils from '../src/utils.js';
+import { ajaxBuilder } from '../src/ajax.js';
+
+/** @type {string} */
+const MODULE_NAME = 'realTimeData';
+const SUBMODULE_NAME = 'ias';
+
+/**
+ * Module init
+ * @param {Object} provider
+ * @param {Object} userConsent
+ * @return {boolean}
+ */
+export function init(config, userConsent) {
+ return true;
+}
+
+function stringifySlotSizes(sizes) {
+ let result = '';
+ if (utils.isArray(sizes)) {
+ result = sizes.reduce((acc, size) => {
+ acc.push(size.join('.'));
+ return acc;
+ }, []);
+ result = '[' + result.join(',') + ']';
+ }
+ return result;
+}
+
+function stringifySlot(bidRequest) {
+ const id = bidRequest.code;
+ const ss = stringifySlotSizes(bidRequest.sizes);
+ const p = bidRequest.bids[0].params.adUnitPath;
+ const slot = { id, ss, p };
+ const keyValues = utils.getKeys(slot).map(function (key) {
+ return [key, slot[key]].join(':');
+ });
+ return '{' + keyValues.join(',') + '}';
+}
+
+function stringifyWindowSize() {
+ return [window.innerWidth || -1, window.innerHeight || -1].join('.');
+}
+
+function stringifyScreenSize() {
+ return [(window.screen && window.screen.width) || -1, (window.screen && window.screen.height) || -1].join('.');
+}
+
+function getPageLevelKeywords(response) {
+ let result = {};
+ if (response.brandSafety) {
+ shallowMerge(result, response.brandSafety);
+ }
+ result.fr = response.fr;
+ result.custom = response.custom;
+ return result;
+}
+
+function shallowMerge(dest, src) {
+ utils.getKeys(src).reduce((dest, srcKey) => {
+ dest[srcKey] = src[srcKey];
+ return dest;
+ }, dest);
+}
+
+function getBidRequestData(reqBidsConfigObj, callback, config) {
+ const adUnits = reqBidsConfigObj.adUnits || getGlobal().adUnits;
+
+ let isFinish = false;
+
+ const IAS_HOST = 'https://pixel.adsafeprotected.com/services/pub';
+ const { pubId } = config.params;
+ const anId = pubId;
+ let queries = [];
+ queries.push(['anId', anId]);
+
+ queries = queries.concat(adUnits.reduce(function (acc, request) {
+ acc.push(['slot', stringifySlot(request)]);
+ return acc;
+ }, []));
+
+ queries.push(['wr', stringifyWindowSize()]);
+ queries.push(['sr', stringifyScreenSize()]);
+ queries.push(['url', encodeURIComponent(window.location.href)]);
+
+ const queryString = encodeURI(queries.map(qs => qs.join('=')).join('&'));
+
+ const ajax = ajaxBuilder();
+
+ ajax(`${IAS_HOST}?${queryString}`, {
+ success: function (response, request) {
+ if (!isFinish) {
+ if (request.status === 200) {
+ const iasResponse = JSON.parse(response);
+ adUnits.forEach(adUnit => {
+ adUnit.bids.forEach(bid => {
+ const rtd = bid.rtd || {};
+ const iasRtd = {};
+ iasRtd[SUBMODULE_NAME] = Object.assign({}, rtd[SUBMODULE_NAME], getPageLevelKeywords(iasResponse));
+ bid.rtd = Object.assign({}, rtd, iasRtd);
+ });
+ });
+ }
+ isFinish = true;
+ }
+ callback();
+ },
+ error: function () {
+ utils.logError('failed to retrieve targeting information');
+ callback();
+ }
+ });
+}
+
+/** @type {RtdSubmodule} */
+export const iasSubModule = {
+ name: SUBMODULE_NAME,
+ init: init,
+ getBidRequestData: getBidRequestData
+};
+
+submodule(MODULE_NAME, iasSubModule);
diff --git a/modules/iasRtdProvider.md b/modules/iasRtdProvider.md
new file mode 100644
index 00000000000..d8c46ff2697
--- /dev/null
+++ b/modules/iasRtdProvider.md
@@ -0,0 +1,9 @@
+# Overview
+
+Module Name: Integral Ad Science(IAS) Rtd Provider
+Module Type: Rtd Provider
+Maintainer: raguilar@integralads.com
+
+# Description
+
+RTD provider for Integral Ad Science(IAS) Contact raguilar@integralads.com for information.
diff --git a/modules/id5AnalyticsAdapter.js b/modules/id5AnalyticsAdapter.js
new file mode 100644
index 00000000000..d2803aa3102
--- /dev/null
+++ b/modules/id5AnalyticsAdapter.js
@@ -0,0 +1,311 @@
+import buildAdapter from '../src/AnalyticsAdapter.js';
+import CONSTANTS from '../src/constants.json';
+import adapterManager from '../src/adapterManager.js';
+import { ajax } from '../src/ajax.js';
+import { logInfo, logError } from '../src/utils.js';
+import events from '../src/events.js';
+
+const {
+ EVENTS: {
+ AUCTION_END,
+ TCF2_ENFORCEMENT,
+ BID_WON,
+ BID_VIEWABLE,
+ AD_RENDER_FAILED
+ }
+} = CONSTANTS
+
+const GVLID = 131;
+
+const STANDARD_EVENTS_TO_TRACK = [
+ AUCTION_END,
+ TCF2_ENFORCEMENT,
+ BID_WON,
+];
+
+// These events cause the buffered events to be sent over
+const FLUSH_EVENTS = [
+ TCF2_ENFORCEMENT,
+ AUCTION_END,
+ BID_WON,
+ BID_VIEWABLE,
+ AD_RENDER_FAILED
+];
+
+const CONFIG_URL_PREFIX = 'https://api.id5-sync.com/analytics'
+const TZ = new Date().getTimezoneOffset();
+const PBJS_VERSION = $$PREBID_GLOBAL$$.version;
+const ID5_REDACTED = '__ID5_REDACTED__';
+const isArray = Array.isArray;
+
+let id5Analytics = Object.assign(buildAdapter({analyticsType: 'endpoint'}), {
+ // Keeps an array of events for each auction
+ eventBuffer: {},
+
+ eventsToTrack: STANDARD_EVENTS_TO_TRACK,
+
+ track: (event) => {
+ const _this = id5Analytics;
+
+ if (!event || !event.args) {
+ return;
+ }
+
+ try {
+ const auctionId = event.args.auctionId;
+ _this.eventBuffer[auctionId] = _this.eventBuffer[auctionId] || [];
+
+ // Collect events and send them in a batch when the auction ends
+ const que = _this.eventBuffer[auctionId];
+ que.push(_this.makeEvent(event.eventType, event.args));
+
+ if (FLUSH_EVENTS.indexOf(event.eventType) >= 0) {
+ // Auction ended. Send the batch of collected events
+ _this.sendEvents(que);
+
+ // From now on just send events to server side as they come
+ que.push = (pushedEvent) => _this.sendEvents([pushedEvent]);
+ }
+ } catch (error) {
+ logError('id5Analytics: ERROR', error);
+ _this.sendErrorEvent(error);
+ }
+ },
+
+ sendEvents: (eventsToSend) => {
+ const _this = id5Analytics;
+ // By giving some content this will be automatically a POST
+ eventsToSend.forEach((event) =>
+ ajax(_this.options.ingestUrl, null, JSON.stringify(event)));
+ },
+
+ makeEvent: (event, payload) => {
+ const _this = id5Analytics;
+ const filteredPayload = deepTransformingClone(payload,
+ transformFnFromCleanupRules(event));
+ return {
+ source: 'pbjs',
+ event,
+ payload: filteredPayload,
+ partnerId: _this.options.partnerId,
+ meta: {
+ sampling: _this.options.id5Sampling,
+ pbjs: PBJS_VERSION,
+ tz: TZ,
+ }
+ };
+ },
+
+ sendErrorEvent: (error) => {
+ const _this = id5Analytics;
+ _this.sendEvents([
+ _this.makeEvent('analyticsError', {
+ message: error.message,
+ stack: error.stack,
+ })
+ ]);
+ },
+
+ random: () => Math.random(),
+});
+
+const ENABLE_FUNCTION = (config) => {
+ const _this = id5Analytics;
+ _this.options = (config && config.options) || {};
+
+ const partnerId = _this.options.partnerId;
+ if (typeof partnerId !== 'number') {
+ logError('id5Analytics: partnerId in config.options must be a number representing the id5 partner ID');
+ return;
+ }
+
+ ajax(`${CONFIG_URL_PREFIX}/${partnerId}/pbjs`, (result) => {
+ logInfo('id5Analytics: Received from configuration endpoint', result);
+
+ const configFromServer = JSON.parse(result);
+
+ const sampling = _this.options.id5Sampling =
+ typeof configFromServer.sampling === 'number' ? configFromServer.sampling : 0;
+
+ if (typeof configFromServer.ingestUrl !== 'string') {
+ logError('id5Analytics: cannot find ingestUrl in config endpoint response; no analytics will be available');
+ return;
+ }
+ _this.options.ingestUrl = configFromServer.ingestUrl;
+
+ // 3-way fallback for which events to track: server > config > standard
+ _this.eventsToTrack = configFromServer.eventsToTrack || _this.options.eventsToTrack || STANDARD_EVENTS_TO_TRACK;
+ _this.eventsToTrack = isArray(_this.eventsToTrack) ? _this.eventsToTrack : STANDARD_EVENTS_TO_TRACK;
+
+ logInfo('id5Analytics: Configuration is', _this.options);
+ logInfo('id5Analytics: Tracking events', _this.eventsToTrack);
+ if (sampling > 0 && _this.random() < (1 / sampling)) {
+ // Init the module only if we got lucky
+ logInfo('id5Analytics: Selected by sampling. Starting up!')
+
+ // Clean start
+ _this.eventBuffer = {};
+
+ // Replay all events until now
+ if (!config.disablePastEventsProcessing) {
+ events.getEvents().forEach((event) => {
+ if (event && _this.eventsToTrack.indexOf(event.eventType) >= 0) {
+ _this.track(event);
+ }
+ });
+ }
+
+ // Merge in additional cleanup rules
+ if (configFromServer.additionalCleanupRules) {
+ const newRules = configFromServer.additionalCleanupRules;
+ _this.eventsToTrack.forEach((key) => {
+ // Some protective checks in case we mess up server side
+ if (
+ isArray(newRules[key]) &&
+ newRules[key].every((eventRules) =>
+ isArray(eventRules.match) &&
+ (eventRules.apply in TRANSFORM_FUNCTIONS))
+ ) {
+ logInfo('id5Analytics: merging additional cleanup rules for event ' + key);
+ CLEANUP_RULES[key].push(...newRules[key]);
+ }
+ });
+ }
+
+ // Register to the events of interest
+ _this.handlers = {};
+ _this.eventsToTrack.forEach((eventType) => {
+ const handler = _this.handlers[eventType] = (args) =>
+ _this.track({ eventType, args });
+ events.on(eventType, handler);
+ });
+ }
+ });
+
+ // Make only one init possible within a lifecycle
+ _this.enableAnalytics = () => {};
+};
+
+id5Analytics.enableAnalytics = ENABLE_FUNCTION;
+id5Analytics.disableAnalytics = () => {
+ const _this = id5Analytics;
+ // Un-register to the events of interest
+ _this.eventsToTrack.forEach((eventType) => {
+ if (_this.handlers && _this.handlers[eventType]) {
+ events.off(eventType, _this.handlers[eventType]);
+ }
+ });
+
+ // Make re-init possible. Work around the fact that past events cannot be forgotten
+ _this.enableAnalytics = (config) => {
+ config.disablePastEventsProcessing = true;
+ ENABLE_FUNCTION(config);
+ };
+};
+
+adapterManager.registerAnalyticsAdapter({
+ adapter: id5Analytics,
+ code: 'id5Analytics',
+ gvlid: GVLID
+});
+
+export default id5Analytics;
+
+function redact(obj, key) {
+ obj[key] = ID5_REDACTED;
+}
+
+function erase(obj, key) {
+ delete obj[key];
+}
+
+// The transform function matches against a path and applies
+// required transformation if match is found.
+function deepTransformingClone(obj, transform, currentPath = []) {
+ const result = isArray(obj) ? [] : {};
+ const recursable = typeof obj === 'object' && obj !== null;
+ if (recursable) {
+ const keys = Object.keys(obj);
+ if (keys.length > 0) {
+ keys.forEach((key) => {
+ const newPath = currentPath.concat(key);
+ result[key] = deepTransformingClone(obj[key], transform, newPath);
+ transform(newPath, result, key);
+ });
+ return result;
+ }
+ }
+ return obj;
+}
+
+// Every set of rules is an object where "match" is an array and
+// "apply" is the function to apply in case of match. The function to apply
+// takes (obj, prop) and transforms property "prop" in object "obj".
+// The "match" is an array of path parts. Each part is either a string or an array.
+// In case of array, it represents alternatives which all would match.
+// Special path part '*' matches any subproperty or array index.
+// Prefixing a part with "!" makes it negative match (doesn't work with multiple alternatives)
+const CLEANUP_RULES = {};
+CLEANUP_RULES[AUCTION_END] = [{
+ match: [['adUnits', 'bidderRequests'], '*', 'bids', '*', ['userId', 'crumbs'], '!id5id'],
+ apply: 'redact'
+}, {
+ match: [['adUnits', 'bidderRequests'], '*', 'bids', '*', ['userId', 'crumbs'], 'id5id', 'uid'],
+ apply: 'redact'
+}, {
+ match: [['adUnits', 'bidderRequests'], '*', 'bids', '*', 'userIdAsEids', '*', 'uids', '*', ['id', 'ext']],
+ apply: 'redact'
+}, {
+ match: ['bidderRequests', '*', 'gdprConsent', 'vendorData'],
+ apply: 'erase'
+}, {
+ match: ['bidsReceived', '*', ['ad', 'native']],
+ apply: 'erase'
+}, {
+ match: ['noBids', '*', ['userId', 'crumbs'], '*'],
+ apply: 'redact'
+}, {
+ match: ['noBids', '*', 'userIdAsEids', '*', 'uids', '*', ['id', 'ext']],
+ apply: 'redact'
+}];
+
+CLEANUP_RULES[BID_WON] = [{
+ match: [['ad', 'native']],
+ apply: 'erase'
+}];
+
+const TRANSFORM_FUNCTIONS = {
+ 'redact': redact,
+ 'erase': erase,
+};
+
+// Builds a rule function depending on the event type
+function transformFnFromCleanupRules(eventType) {
+ const rules = CLEANUP_RULES[eventType] || [];
+ return (path, obj, key) => {
+ for (let i = 0; i < rules.length; i++) {
+ let match = true;
+ const ruleMatcher = rules[i].match;
+ const transformation = rules[i].apply;
+ if (ruleMatcher.length !== path.length) {
+ continue;
+ }
+ for (let fragment = 0; fragment < ruleMatcher.length && match; fragment++) {
+ const choices = makeSureArray(ruleMatcher[fragment]);
+ match = !choices.every((choice) => choice !== '*' &&
+ (choice.charAt(0) === '!'
+ ? path[fragment] === choice.substring(1)
+ : path[fragment] !== choice));
+ }
+ if (match) {
+ const transformfn = TRANSFORM_FUNCTIONS[transformation];
+ transformfn(obj, key);
+ break;
+ }
+ }
+ };
+}
+
+function makeSureArray(object) {
+ return isArray(object) ? object : [object];
+}
diff --git a/modules/id5AnalyticsAdapter.md b/modules/id5AnalyticsAdapter.md
new file mode 100644
index 00000000000..e12784b70f6
--- /dev/null
+++ b/modules/id5AnalyticsAdapter.md
@@ -0,0 +1,42 @@
+# Overview
+Module Name: ID5 Analytics Adapter
+
+Module Type: Analytics Adapter
+
+Maintainer: [id5.io](https://id5.io)
+
+# ID5 Universal ID
+
+The ID5 Universal ID is a shared, neutral identifier that publishers and ad tech platforms can use to recognise users even in environments where 3rd party cookies are not available. The ID5 Universal ID is designed to respect users' privacy choices and publishers’ preferences throughout the advertising value chain. For more information about the ID5 Universal ID and detailed integration docs, please visit [our documentation](https://support.id5.io/portal/en/kb/articles/prebid-js-user-id-module).
+
+# ID5 Analytics Registration
+
+The ID5 Analytics Adapter is free to use during our Beta period, but requires a simple registration with ID5. Please visit [id5.io/universal-id](https://id5.io/universal-id) to sign up and request your ID5 Partner Number to get started. If you're already using the ID5 Universal ID, you may use your existing Partner Number with the analytics adapter.
+
+The ID5 privacy policy is at [https://www.id5.io/platform-privacy-policy](https://www.id5.io/platform-privacy-policy).
+
+## ID5 Analytics Configuration
+
+First, make sure to add the ID5 Analytics submodule to your Prebid.js package with:
+
+```
+gulp build --modules=...,id5AnalyticsAdapter
+```
+
+The following configuration parameters are available:
+
+```javascript
+pbjs.enableAnalytics({
+ provider: 'id5Analytics',
+ options: {
+ partnerId: 1234, // change to the Partner Number you received from ID5
+ eventsToTrack: ['auctionEnd','bidWon']
+ }
+});
+```
+
+| Parameter | Scope | Type | Description | Example |
+| --- | --- | --- | --- | --- |
+| provider | Required | String | The name of this module: `id5Analytics` | `id5Analytics` |
+| options.partnerId | Required | Number | This is the ID5 Partner Number obtained from registering with ID5. | `1234` |
+| options.eventsToTrack | Optional | Array of strings | Overrides the set of tracked events | `['auctionEnd','bidWon']` |
diff --git a/modules/id5IdSystem.js b/modules/id5IdSystem.js
index 8a8cd25479f..d2d64f52738 100644
--- a/modules/id5IdSystem.js
+++ b/modules/id5IdSystem.js
@@ -18,7 +18,6 @@ const NB_EXP_DAYS = 30;
export const ID5_STORAGE_NAME = 'id5id';
export const ID5_PRIVACY_STORAGE_NAME = `${ID5_STORAGE_NAME}_privacy`;
const LOCAL_STORAGE = 'html5';
-const ABTEST_RESOLUTION = 10000;
const LOG_PREFIX = 'User ID - ID5 submodule: ';
// order the legacy cookie names in reverse priority order so the last
@@ -59,22 +58,6 @@ export const id5IdSubmodule = {
return undefined;
}
- // check for A/B testing configuration and hide ID if in Control Group
- const abConfig = getAbTestingConfig(config);
- const controlGroup = isInControlGroup(universalUid, abConfig.controlGroupPct);
- if (abConfig.enabled === true && typeof controlGroup === 'undefined') {
- // A/B Testing is enabled, but configured improperly, so skip A/B testing
- utils.logError(LOG_PREFIX + 'A/B Testing controlGroupPct must be a number >= 0 and <= 1! Skipping A/B Testing');
- } else if (abConfig.enabled === true && controlGroup === true) {
- // A/B Testing is enabled and user is in the Control Group, so do not share the ID5 ID
- utils.logInfo(LOG_PREFIX + 'A/B Testing Enabled - user is in the Control Group, so the ID5 ID is NOT exposed');
- universalUid = '';
- linkType = 0;
- } else if (abConfig.enabled === true) {
- // A/B Testing is enabled but user is not in the Control Group, so ID5 ID is shared
- utils.logInfo(LOG_PREFIX + 'A/B Testing Enabled - user is NOT in the Control Group, so the ID5 ID is exposed');
- }
-
let responseObj = {
id5id: {
uid: universalUid,
@@ -84,8 +67,22 @@ export const id5IdSubmodule = {
}
};
- if (abConfig.enabled === true) {
- utils.deepSetValue(responseObj, 'id5id.ext.abTestingControlGroup', (typeof controlGroup === 'undefined' ? false : controlGroup));
+ const abTestingResult = utils.deepAccess(value, 'ab_testing.result');
+ switch (abTestingResult) {
+ case 'control':
+ // A/B Testing is enabled and user is in the Control Group
+ utils.logInfo(LOG_PREFIX + 'A/B Testing - user is in the Control Group: ID5 ID is NOT exposed');
+ utils.deepSetValue(responseObj, 'id5id.ext.abTestingControlGroup', true);
+ break;
+ case 'error':
+ // A/B Testing is enabled, but configured improperly, so skip A/B testing
+ utils.logError(LOG_PREFIX + 'A/B Testing ERROR! controlGroupPct must be a number >= 0 and <= 1');
+ break;
+ case 'normal':
+ // A/B Testing is enabled but user is not in the Control Group, so ID5 ID is shared
+ utils.logInfo(LOG_PREFIX + 'A/B Testing - user is NOT in the Control Group');
+ utils.deepSetValue(responseObj, 'id5id.ext.abTestingControlGroup', false);
+ break;
}
utils.logInfo(LOG_PREFIX + 'Decoded ID', responseObj);
@@ -139,9 +136,12 @@ export const id5IdSubmodule = {
data.provider = config.params.provider;
}
- // pass in feature flags, if applicable
- if (getAbTestingConfig(config).enabled === true) {
- utils.deepSetValue(data, 'features.ab', 1);
+ const abTestingConfig = getAbTestingConfig(config);
+ if (abTestingConfig.enabled === true) {
+ data.ab_testing = {
+ enabled: true,
+ control_group_pct: abTestingConfig.controlGroupPct // The server validates
+ };
}
const resp = function (callback) {
@@ -178,7 +178,7 @@ export const id5IdSubmodule = {
utils.logInfo(LOG_PREFIX + 'requesting an ID from the server', data);
ajax(url, callbacks, JSON.stringify(data), { method: 'POST', withCredentials: true });
};
- return {callback: resp};
+ return { callback: resp };
},
/**
@@ -310,37 +310,10 @@ export function storeInLocalStorage(key, value, expDays) {
* gets the existing abTesting config or generates a default config with abTesting off
*
* @param {SubmoduleConfig|undefined} config
- * @returns {(Object|undefined)}
+ * @returns {Object} an object which always contains at least the property "enabled"
*/
function getAbTestingConfig(config) {
- return (config && config.params && config.params.abTesting) || { enabled: false };
-}
-
-/**
- * Return a consistant random number between 0 and ABTEST_RESOLUTION-1 for this user
- * Falls back to plain random if no user provided
- * @param {string} userId
- * @returns {number}
- */
-function abTestBucket(userId) {
- if (userId) {
- return ((utils.cyrb53Hash(userId) % ABTEST_RESOLUTION) + ABTEST_RESOLUTION) % ABTEST_RESOLUTION;
- } else {
- return Math.floor(Math.random() * ABTEST_RESOLUTION);
- }
-}
-
-/**
- * Return a consistant boolean if this user is within the control group ratio provided
- * @param {string} userId
- * @param {number} controlGroupPct - Ratio [0,1] of users expected to be in the control group
- * @returns {boolean}
- */
-export function isInControlGroup(userId, controlGroupPct) {
- if (!utils.isNumber(controlGroupPct) || controlGroupPct < 0 || controlGroupPct > 1) {
- return undefined;
- }
- return abTestBucket(userId) < controlGroupPct * ABTEST_RESOLUTION;
+ return utils.deepAccess(config, 'params.abTesting', { enabled: false });
}
submodule('userId', id5IdSubmodule);
diff --git a/modules/imonomyBidAdapter.js b/modules/imonomyBidAdapter.js
deleted file mode 100644
index b9205943f65..00000000000
--- a/modules/imonomyBidAdapter.js
+++ /dev/null
@@ -1,130 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'imonomy';
-const ENDPOINT = 'https://b.imonomy.com/openrtb/hb/00000';
-const USYNCURL = 'https://b.imonomy.com/UserMatching/b/';
-
-export const spec = {
- code: BIDDER_CODE,
-
- /**
- * Determines whether or not the given bid request is valid. Valid bid request must have placementId and hbid
- *
- * @param {BidRequest} bid The bid params to validate.
- * @return {boolean} True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: bid => {
- return !!(bid && bid.params && bid.params.placementId && bid.params.hbid);
- },
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} validBidRequests an array of bids
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: validBidRequests => {
- const tags = validBidRequests.map(bid => {
- // map each bid id to bid object to retrieve adUnit code in callback
- let tag = {
- uuid: bid.bidId,
- sizes: bid.sizes,
- trid: bid.transactionId,
- hbid: bid.params.hbid,
- placementid: bid.params.placementId
- };
-
- // add floor price if specified (not mandatory)
- if (bid.params.floorPrice) {
- tag.floorprice = bid.params.floorPrice;
- }
-
- return tag;
- });
-
- // Imonomy server config
- const time = new Date().getTime();
- const kbConf = {
- ts_as: time,
- hb_placements: [],
- hb_placement_bidids: {},
- hb_floors: {},
- cb: _generateCb(time),
- tz: new Date().getTimezoneOffset(),
- };
-
- validBidRequests.forEach(bid => {
- kbConf.hdbdid = kbConf.hdbdid || bid.params.hbid;
- kbConf.encode_bid = kbConf.encode_bid || bid.params.encode_bid;
- kbConf.hb_placement_bidids[bid.params.placementId] = bid.bidId;
- if (bid.params.floorPrice) {
- kbConf.hb_floors[bid.params.placementId] = bid.params.floorPrice;
- }
- kbConf.hb_placements.push(bid.params.placementId);
- });
-
- let payload = {};
- if (!utils.isEmpty(tags)) {
- payload = { bids: [...tags], kbConf };
- }
-
- let endpointToUse = ENDPOINT;
- if (kbConf.hdbdid) {
- endpointToUse = endpointToUse.replace('00000', kbConf.hdbdid);
- }
-
- return {
- method: 'POST',
- url: endpointToUse,
- data: JSON.stringify(payload)
- };
- },
- /**
- * Unpack the response from the server into a list of bids.
- *
- * @param {*} response A successful response from the server.
- * @return {Bid[]} An array of bids which were nested inside the server.
- */
- interpretResponse: (response) => {
- const bidResponses = [];
- if (response && response.body && response.body.bids) {
- response.body.bids.forEach(bid => {
- // The bid ID. Used to tie this bid back to the request.
- if (bid.uuid) {
- bid.requestId = bid.uuid;
- } else {
- utils.logError('No uuid for bid');
- }
- // The creative payload of the returned bid.
- if (bid.creative) {
- bid.ad = bid.creative;
- } else {
- utils.logError('No creative for bid');
- }
- bidResponses.push(bid);
- });
- }
- return bidResponses;
- },
- /**
- * Register User Sync.
- */
- getUserSyncs: syncOptions => {
- if (syncOptions.iframeEnabled) {
- return [{
- type: 'iframe',
- url: USYNCURL
- }];
- }
- }
-};
-
-/**
-* Generated cache baster value to be sent to bid server
-* @param {*} time current time to use for creating cb.
-*/
-function _generateCb(time) {
- return Math.floor((time % 65536) + (Math.floor(Math.random() * 65536) * 65536));
-}
-
-registerBidder(spec);
diff --git a/modules/impactifyBidAdapter.js b/modules/impactifyBidAdapter.js
index b649b5a8a73..7e52669d33e 100644
--- a/modules/impactifyBidAdapter.js
+++ b/modules/impactifyBidAdapter.js
@@ -55,12 +55,12 @@ const createOpenRtbRequest = (validBidRequests, bidderRequest) => {
request.site = {page: bidderRequest.refererInfo.referer};
// Handle privacy settings for GDPR/CCPA/COPPA
+ let gdprApplies = 0;
if (bidderRequest.gdprConsent) {
- let gdprApplies = 0;
if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') gdprApplies = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
- utils.deepSetValue(request, 'regs.ext.gdpr', gdprApplies);
utils.deepSetValue(request, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
}
+ utils.deepSetValue(request, 'regs.ext.gdpr', gdprApplies);
if (bidderRequest.uspConsent) {
utils.deepSetValue(request, 'regs.ext.us_privacy', bidderRequest.uspConsent);
@@ -108,6 +108,7 @@ export const spec = {
gvlid: GVLID,
supportedMediaTypes: ['video'],
aliases: BIDDER_ALIAS,
+
/**
* Determines whether or not the given bid request is valid.
*
@@ -127,6 +128,7 @@ export const spec = {
return true;
},
+
/**
* Make a server request from the list of BidRequests.
*
@@ -144,6 +146,7 @@ export const spec = {
data: JSON.stringify(request),
};
},
+
/**
* Unpack the response from the server into a list of bids.
*
@@ -180,7 +183,10 @@ export const spec = {
ttl: 300,
creativeId: bid.crid || 0,
hash: bid.hash,
- expiry: bid.expiry
+ expiry: bid.expiry,
+ meta: {
+ advertiserDomains: bid.adomain && bid.adomain.length ? bid.adomain : []
+ }
})),
];
}
diff --git a/modules/improvedigitalBidAdapter.js b/modules/improvedigitalBidAdapter.js
index dc0911ff5da..e73df68b625 100644
--- a/modules/improvedigitalBidAdapter.js
+++ b/modules/improvedigitalBidAdapter.js
@@ -11,7 +11,7 @@ const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js
const VIDEO_TARGETING = ['skip', 'skipmin', 'skipafter'];
export const spec = {
- version: '7.3.0',
+ version: '7.4.0',
code: BIDDER_CODE,
gvlid: 253,
aliases: ['id'],
@@ -158,6 +158,12 @@ export const spec = {
bid.height = 1;
}
+ if (bidObject.adomain) {
+ bid.meta = {
+ advertiserDomains: bidObject.adomain
+ };
+ }
+
bids.push(bid);
});
return bids;
@@ -218,6 +224,21 @@ function getVideoTargetingParams(bid) {
return result;
}
+function getBidFloor(bid) {
+ if (!utils.isFn(bid.getFloor)) {
+ return null;
+ }
+ const floor = bid.getFloor({
+ currency: 'USD',
+ mediaType: '*',
+ size: '*'
+ });
+ if (utils.isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'USD') {
+ return floor.floor;
+ }
+ return null;
+}
+
function outstreamRender(bid) {
bid.renderer.push(() => {
window.ANOutstreamVideo.renderAd({
@@ -264,8 +285,6 @@ function getNormalizedBidRequest(bid) {
const bidId = utils.getBidIdParameter('bidId', bid);
const transactionId = utils.getBidIdParameter('transactionId', bid);
const currency = config.getConfig('currency.adServerCurrency');
- const bidFloor = utils.getBidIdParameter('bidFloor', bid.params);
- const bidFloorCur = utils.getBidIdParameter('bidFloorCur', bid.params);
let normalizedBidRequest = {};
if (isInstreamVideo(bid)) {
@@ -309,6 +328,13 @@ function getNormalizedBidRequest(bid) {
if (currency) {
normalizedBidRequest.currency = currency;
}
+ // Floor
+ let bidFloor = getBidFloor(bid);
+ let bidFloorCur = null;
+ if (!bidFloor) {
+ bidFloor = utils.getBidIdParameter('bidFloor', bid.params);
+ bidFloorCur = utils.getBidIdParameter('bidFloorCur', bid.params);
+ }
if (bidFloor) {
normalizedBidRequest.bidFloor = bidFloor;
normalizedBidRequest.bidFloorCur = bidFloorCur ? bidFloorCur.toUpperCase() : 'USD';
diff --git a/modules/innityBidAdapter.js b/modules/innityBidAdapter.js
index aae79818daf..ab7ee07db4a 100644
--- a/modules/innityBidAdapter.js
+++ b/modules/innityBidAdapter.js
@@ -10,10 +10,6 @@ export const spec = {
return !!(bid.params && bid.params.pub && bid.params.zone);
},
buildRequests: function(validBidRequests, bidderRequest) {
- let refererInfo = '';
- if (bidderRequest && bidderRequest.refererInfo) {
- refererInfo = bidderRequest.refererInfo.referer || '';
- }
return validBidRequests.map(bidRequest => {
let parseSized = utils.parseSizesInput(bidRequest.sizes);
let arrSize = parseSized[0].split('x');
@@ -27,7 +23,7 @@ export const spec = {
output: 'js',
pub: bidRequest.params.pub,
zone: bidRequest.params.zone,
- url: encodeURIComponent(refererInfo),
+ url: bidderRequest && bidderRequest.refererInfo ? encodeURIComponent(bidderRequest.refererInfo.referer) : '',
width: arrSize[0],
height: arrSize[1],
vpw: window.screen.width,
@@ -51,6 +47,10 @@ export const spec = {
netRevenue: true,
ttl: 60,
ad: '' + res.tag,
+ meta: {
+ advertiserDomains: res.adomain && res.adomain.length ? res.adomain : [],
+ mediaType: res.mediaType,
+ }
};
return [bidResponse];
}
diff --git a/modules/inskinBidAdapter.js b/modules/inskinBidAdapter.js
index 29040205818..5173f1dca63 100644
--- a/modules/inskinBidAdapter.js
+++ b/modules/inskinBidAdapter.js
@@ -169,6 +169,7 @@ export const spec = {
bid.currency = 'USD';
bid.creativeId = decision.adId;
bid.ttl = 360;
+ bid.meta = { advertiserDomains: decision.adomain ? decision.adomain : [] }
bid.netRevenue = true;
bidResponses.push(bid);
diff --git a/modules/intentIqIdSystem.js b/modules/intentIqIdSystem.js
index 98732da95d5..e12a765c086 100644
--- a/modules/intentIqIdSystem.js
+++ b/modules/intentIqIdSystem.js
@@ -17,34 +17,7 @@ export const FIRST_PARTY_KEY = '_iiq_fdata';
export const storage = getStorageManager(undefined, MODULE_NAME);
-const NOT_AVAILABLE = 'NA';
-
-/**
- * Verify the response is valid - Id value or Not Found (ignore not available response)
- * @param response
- * @param respJson - parsed json response
- * @returns {boolean}
- */
-function isValidResponse(response, respJson) {
- if (!response || response == '' || response === NOT_AVAILABLE) {
- // Empty or NA response
- return false;
- } else if (respJson && (respJson.RESULT === NOT_AVAILABLE || respJson.data == '' || respJson.data === NOT_AVAILABLE)) {
- // Response type is json with value NA
- return false;
- } else { return true; }
-}
-
-/**
- * Verify the response json is valid
- * @param respJson - parsed json response
- * @returns {boolean}
- */
-function isValidResponseJson(respJson) {
- if (respJson && 'data' in respJson) {
- return true;
- } else { return false; }
-}
+const INVALID_ID = 'INVALID_ID';
/**
* Generate standard UUID string
@@ -130,7 +103,7 @@ export const intentIqIdSubmodule = {
* @returns {{intentIqId: {string}}|undefined}
*/
decode(value) {
- return isValidResponse(value, undefined) ? { 'intentIqId': value } : undefined;
+ return value && value != '' && INVALID_ID != value ? { 'intentIqId': value } : undefined;
},
/**
* performs action to obtain id and return a value in the callback's response argument
@@ -157,23 +130,25 @@ export const intentIqIdSubmodule = {
let url = `https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=${configParams.partner}&pt=17&dpn=1`;
url += configParams.pcid ? '&pcid=' + encodeURIComponent(configParams.pcid) : '';
url += configParams.pai ? '&pai=' + encodeURIComponent(configParams.pai) : '';
- if (firstPartyData) {
- url += firstPartyData.pcid ? '&iiqidtype=2&iiqpcid=' + encodeURIComponent(firstPartyData.pcid) : '';
- url += firstPartyData.pid ? '&pid=' + encodeURIComponent(firstPartyData.pid) : '';
- }
+ url += firstPartyData.pcid ? '&iiqidtype=2&iiqpcid=' + encodeURIComponent(firstPartyData.pcid) : '';
+ url += firstPartyData.pid ? '&pid=' + encodeURIComponent(firstPartyData.pid) : '';
const resp = function (callback) {
const callbacks = {
success: response => {
let respJson = tryParse(response);
- if (isValidResponse(response, respJson) && isValidResponseJson(respJson)) {
+ // If response is a valid json and should save is true
+ if (respJson && respJson.ls) {
// Store pid field if found in response json
- if (firstPartyData && 'pcid' in firstPartyData && 'pid' in respJson) {
- firstPartyData = {
- 'pcid': firstPartyData.pcid,
- 'pid': respJson.pid }
+ if ('pid' in respJson) {
+ firstPartyData.pid = respJson.pid;
storeData(FIRST_PARTY_KEY, JSON.stringify(firstPartyData));
}
+
+ // If should save and data is empty, means we should save as INVALID_ID
+ if (respJson.data == '') {
+ respJson.data = INVALID_ID;
+ }
callback(respJson.data);
} else {
callback();
diff --git a/modules/invamiaBidAdapter.js b/modules/invamiaBidAdapter.js
new file mode 100644
index 00000000000..2d36fb77e16
--- /dev/null
+++ b/modules/invamiaBidAdapter.js
@@ -0,0 +1,92 @@
+import {registerBidder} from '../src/adapters/bidderFactory.js';
+import {BANNER} from '../src/mediaTypes.js';
+
+const BIDDER_CODE = 'invamia';
+const ENDPOINT_URL = 'https://ad.invamia.com/delivery/impress';
+
+export const spec = {
+ code: BIDDER_CODE,
+ supportedMediaTypes: [BANNER],
+ /**
+ * Determines whether or not the given bid request is valid.
+ *
+ * @param {BidRequest} bidRequest The bid request params to validate.
+ * @return boolean True if this is a valid bid request, and false otherwise.
+ */
+ isBidRequestValid: function(bidRequest) {
+ return !!bidRequest.params.zoneId;
+ },
+ /**
+ * Make a server request from the list of BidRequests.
+ *
+ * @param {Array} validBidRequests an array of bid requests
+ * @return ServerRequest Info describing the request to the server.
+ */
+ buildRequests: function(validBidRequests) {
+ let serverRequests = [];
+
+ validBidRequests.forEach(bidRequest => {
+ const sizes = bidRequest.mediaTypes.banner.sizes;
+
+ sizes.forEach(([width, height]) => {
+ bidRequest.params.requestedSizes = [width, height];
+
+ const payload = {
+ ctype: 'div',
+ pzoneid: bidRequest.params.zoneId,
+ width,
+ height,
+ };
+
+ const payloadString = Object.keys(payload).map(k => k + '=' + encodeURIComponent(payload[k])).join('&');
+
+ serverRequests.push({
+ method: 'GET',
+ url: ENDPOINT_URL,
+ data: payloadString,
+ bidderRequest: bidRequest,
+ });
+ });
+ });
+
+ return serverRequests;
+ },
+ /**
+ * Unpack the response from the server into a list of bids.
+ *
+ * @param {ServerResponse} serverResponse A successful response from the server.
+ * @param {BidRequest} bidderRequest A matched bid request for this response.
+ * @return Array An array of bids which were nested inside the server.
+ */
+ interpretResponse: function(serverResponse, {bidderRequest}) {
+ const response = serverResponse.body;
+ const bidResponses = [];
+
+ if (response && response.template && response.template.html) {
+ const {bidId} = bidderRequest;
+ const [width, height] = bidderRequest.params.requestedSizes;
+
+ const bidResponse = {
+ requestId: bidId,
+ cpm: response.hb.cpm,
+ creativeId: response.banner.hash,
+ currency: 'USD',
+ netRevenue: response.hb.netRevenue,
+ ttl: 600,
+ ad: response.template.html,
+ mediaType: 'banner',
+ meta: {
+ advertiserDomains: response.hb.adomains || [],
+ },
+ width,
+ height,
+ };
+
+ bidResponses.push(bidResponse);
+ }
+
+ return bidResponses;
+ },
+}
+
+registerBidder(spec);
diff --git a/modules/invamiaBidAdapter.md b/modules/invamiaBidAdapter.md
new file mode 100644
index 00000000000..c8e12808123
--- /dev/null
+++ b/modules/invamiaBidAdapter.md
@@ -0,0 +1,30 @@
+# Overview
+
+```
+Module Name: Invamia Bidder Adapter
+Module Type: Bidder Adapter
+Maintainer: contact@invamia.com
+```
+
+# Description
+
+Module that connects to Invamia demand sources.
+
+# Test Parameters
+
+```
+ const adUnits = [{
+ code: 'test-div',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ },
+ },
+ bids: [{
+ bidder: 'invamia',
+ params: {
+ zoneId: 379783,
+ },
+ }],
+ }];
+```
diff --git a/modules/ipromBidAdapter.js b/modules/ipromBidAdapter.js
deleted file mode 100644
index e328cd1ec5d..00000000000
--- a/modules/ipromBidAdapter.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'iprom';
-const ENDPOINT_URL = 'https://core.iprom.net/programmatic';
-const VERSION = 'v1.0.0';
-const DEFAULT_CURRENCY = 'EUR';
-const DEFAULT_NETREVENUE = true;
-const DEFAULT_TTL = 360;
-
-export const spec = {
- code: BIDDER_CODE,
- isBidRequestValid: function ({ bidder, params = {} } = {}) {
- // id parameter checks
- if (!params.id) {
- utils.logError(`${bidder}: Parameter 'id' missing`);
- return false;
- } else if (typeof params.id !== 'string') {
- utils.logError(`${bidder}: Parameter 'id' needs to be a string`);
- return false;
- }
- // dimension parameter checks
- if (!params.dimension) {
- utils.logError(`${bidder}: Required parameter 'dimension' missing`);
- return false;
- } else if (typeof params.dimension !== 'string') {
- utils.logError(`${bidder}: Parameter 'dimension' needs to be a string`);
- return false;
- }
-
- return true;
- },
-
- buildRequests: function (validBidRequests, bidderRequest) {
- const payload = {
- bids: validBidRequests,
- referer: bidderRequest.refererInfo,
- version: VERSION
- };
- const payloadString = JSON.stringify(payload);
-
- return {
- method: 'POST',
- url: ENDPOINT_URL,
- data: payloadString
- };
- },
-
- interpretResponse: function (serverResponse, request) {
- let bids = serverResponse.body;
-
- const bidResponses = [];
-
- bids.forEach(bid => {
- bidResponses.push({
- ad: bid.ad,
- requestId: bid.requestId,
- cpm: bid.cpm,
- width: bid.width,
- height: bid.height,
- creativeId: bid.creativeId,
- currency: bid.currency || DEFAULT_CURRENCY,
- netRevenue: bid.netRevenue || DEFAULT_NETREVENUE,
- ttl: bid.ttl || DEFAULT_TTL,
- });
- });
-
- return bidResponses;
- },
-}
-
-registerBidder(spec);
diff --git a/modules/iqmBidAdapter.js b/modules/iqmBidAdapter.js
new file mode 100644
index 00000000000..e7599fd54c0
--- /dev/null
+++ b/modules/iqmBidAdapter.js
@@ -0,0 +1,290 @@
+import {registerBidder} from '../src/adapters/bidderFactory.js';
+import {config} from '../src/config.js';
+import * as utils from '../src/utils.js';
+import {BANNER, VIDEO} from '../src/mediaTypes.js';
+import {INSTREAM} from '../src/video.js';
+
+const BIDDER_CODE = 'iqm';
+const VERSION = 'v.1.0.0';
+const VIDEO_ORTB_PARAMS = [
+ 'mimes',
+ 'minduration',
+ 'maxduration',
+ 'placement',
+ 'protocols',
+ 'startdelay'
+];
+var ENDPOINT_URL = 'https://pbd.bids.iqm.com';
+
+export const spec = {
+ supportedMediaTypes: [BANNER, VIDEO],
+ code: BIDDER_CODE,
+ aliases: ['iqm'],
+
+ /**
+ * 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) {
+ const banner = utils.deepAccess(bid, 'mediaTypes.banner');
+ const videoMediaType = utils.deepAccess(bid, 'mediaTypes.video');
+ const context = utils.deepAccess(bid, 'mediaTypes.video.context');
+ if ((videoMediaType && context === INSTREAM)) {
+ const videoBidderParams = utils.deepAccess(bid, 'params.video', {});
+
+ if (!Array.isArray(videoMediaType.playerSize)) {
+ return false;
+ }
+
+ if (!videoMediaType.context) {
+ return false;
+ }
+
+ const videoParams = {
+ ...videoMediaType,
+ ...videoBidderParams
+ };
+
+ if (!Array.isArray(videoParams.mimes) || videoParams.mimes.length === 0) {
+ return false;
+ }
+
+ if (!Array.isArray(videoParams.protocols) || videoParams.protocols.length === 0) {
+ return false;
+ }
+
+ if (
+ typeof videoParams.placement !== 'undefined' &&
+ typeof videoParams.placement !== 'number'
+ ) {
+ return false;
+ }
+ if (
+ videoMediaType.context === INSTREAM &&
+ typeof videoParams.startdelay !== 'undefined' &&
+ typeof videoParams.startdelay !== 'number'
+ ) {
+ return false;
+ }
+
+ return !!(bid && bid.params && bid.params.publisherId && bid.params.placementId);
+ } else {
+ if (banner === 'undefined') {
+ return false;
+ }
+ return !!(bid && bid.params && bid.params.publisherId && bid.params.placementId);
+ }
+ },
+ /**
+ * Takes an array of valid bid requests, all of which are guaranteed to have passed the isBidRequestValid() test.
+ *It prepares a bid request with the required information for the DSP side and sends this request to alloted endpoint
+ * parameter{validBidRequests, bidderRequest} bidderRequest object is useful because it carries a couple of bid parameters that are global to all the bids.
+ */
+ buildRequests: function (validBidRequests, bidderRequest) {
+ return validBidRequests.map(bid => {
+ var finalRequest = {};
+ let bidfloor = utils.getBidIdParameter('bidfloor', bid.params);
+
+ const imp = {
+ id: bid.bidId,
+ secure: 1,
+ bidfloor: bidfloor || 0,
+ displaymanager: 'Prebid.js',
+ displaymanagerver: VERSION,
+
+ }
+ if (utils.deepAccess(bid, 'mediaTypes.banner')) {
+ imp.banner = getSize(bid.sizes);
+ imp.mediatype = 'banner';
+ } else if (utils.deepAccess(bid, 'mediaTypes.video')) {
+ imp.video = _buildVideoORTB(bid);
+ imp.mediatype = 'video';
+ }
+ const site = getSite(bid);
+ let device = getDevice(bid.params);
+ finalRequest = {
+ sizes: bid.sizes,
+ id: bid.bidId,
+ publisherId: utils.getBidIdParameter('publisherId', bid.params),
+ placementId: utils.getBidIdParameter('placementId', bid.params),
+ device: device,
+ site: site,
+ imp: imp,
+ auctionId: bid.auctionId,
+ adUnitCode: bid.adUnitCode,
+ bidderRequestId: bid.bidderRequestId,
+ uuid: bid.bidId,
+ bidderRequest
+ }
+ const request = {
+ method: 'POST',
+ url: ENDPOINT_URL,
+ data: finalRequest,
+ options: {
+ withCredentials: false
+ },
+
+ }
+ return request;
+ });
+ },
+ /**
+ * Takes Response from server as input and request.
+ *It parses the response from server side and generates bidresponses for with required rendering paramteres
+ * parameter{serverResponse, bidRequest} serverReponse: Response from the server side with ad creative.
+ */
+ interpretResponse: function (serverResponse, bidRequest) {
+ const bidResponses = [];
+ serverResponse = serverResponse.body;
+ if (serverResponse && utils.isArray(serverResponse.seatbid)) {
+ utils._each(serverResponse.seatbid, function (bidList) {
+ utils._each(bidList.bid, function (bid) {
+ const responseCPM = parseFloat(bid.price);
+ if (responseCPM > 0.0 && bid.impid) {
+ const bidResponse = {
+ requestId: bidRequest.data.id,
+ currency: serverResponse.cur || 'USD',
+ cpm: responseCPM,
+ netRevenue: true,
+ creativeId: bid.crid || '',
+ adUnitCode: bidRequest.data.adUnitCode,
+ auctionId: bidRequest.data.auctionId,
+ mediaType: bidRequest.data.imp.mediatype,
+
+ ttl: bid.ttl || config.getConfig('_bidderTimeout')
+ };
+
+ if (bidRequest.data.imp.mediatype === VIDEO) {
+ bidResponse.width = bid.w || bidRequest.data.imp.video.w;
+ bidResponse.height = bid.h || bidRequest.data.imp.video.h;
+ bidResponse.adResponse = {
+ content: bid.adm,
+ height: bidRequest.data.imp.video.h,
+ width: bidRequest.data.imp.video.w
+ };
+
+ if (bidRequest.data.imp.video.context === INSTREAM) {
+ bidResponse.vastUrl = bid.adm;
+ }
+ } else if (bidRequest.data.imp.mediatype === BANNER) {
+ bidResponse.ad = bid.adm;
+ bidResponse.width = bid.w || bidRequest.data.imp.banner.w;
+ bidResponse.height = bid.h || bidRequest.data.imp.banner.h;
+ }
+ bidResponses.push(bidResponse);
+ }
+ })
+ });
+ }
+ return bidResponses;
+ },
+
+};
+
+let getDevice = function (bidparams) {
+ const language = navigator.language ? 'language' : 'userLanguage';
+ return {
+ geo: bidparams.geo,
+ h: screen.height,
+ w: screen.width,
+ dnt: _getDNT() ? 1 : 0,
+ language: navigator[language].split('-')[0],
+ make: navigator.vendor ? navigator.vendor : '',
+ ua: navigator.userAgent,
+ devicetype: _isMobile() ? 1 : _isConnectedTV() ? 3 : 2
+ };
+};
+
+let _getDNT = function () {
+ return navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.msDoNotTrack === '1' || navigator.doNotTrack === 'yes';
+};
+
+let getSize = function (sizes) {
+ let sizeMap;
+ if (sizes.length === 2 && typeof sizes[0] === 'number' && typeof sizes[1] === 'number') {
+ sizeMap = {w: sizes[0], h: sizes[1]};
+ } else {
+ sizeMap = {w: sizes[0][0], h: sizes[0][1]};
+ }
+ return sizeMap;
+};
+
+function _isMobile() {
+ return (/(ios|ipod|ipad|iphone|android)/i).test(global.navigator.userAgent);
+}
+
+function _isConnectedTV() {
+ return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(global.navigator.userAgent);
+}
+
+function getSite(bidderRequest) {
+ let domain = '';
+ let page = '';
+ let referrer = '';
+ const Id = 1;
+
+ const {refererInfo} = bidderRequest;
+
+ if (canAccessTopWindow()) {
+ const wt = utils.getWindowTop();
+ domain = wt.location.hostname;
+ page = wt.location.href;
+ referrer = wt.document.referrer || '';
+ } else if (refererInfo.reachedTop) {
+ const url = utils.parseUrl(refererInfo.referer);
+ domain = url.hostname;
+ page = refererInfo.referer;
+ } else if (refererInfo.stack && refererInfo.stack.length && refererInfo.stack[0]) {
+ const url = utils.parseUrl(refererInfo.stack[0]);
+ domain = url.hostname;
+ }
+
+ return {
+ domain,
+ page,
+ Id,
+ referrer
+ };
+};
+
+function canAccessTopWindow() {
+ try {
+ if (utils.getWindowTop().location.href) {
+ return true;
+ }
+ } catch (error) {
+ return false;
+ }
+}
+
+function _buildVideoORTB(bidRequest) {
+ const videoAdUnit = utils.deepAccess(bidRequest, 'mediaTypes.video');
+ const videoBidderParams = utils.deepAccess(bidRequest, 'params.video', {});
+ const video = {}
+
+ const videoParams = {
+ ...videoAdUnit,
+ ...videoBidderParams // Bidder Specific overrides
+ };
+ video.context = 1;
+ const {w, h} = getSize(videoParams.playerSize[0]);
+ video.w = w;
+ video.h = h;
+
+ VIDEO_ORTB_PARAMS.forEach((param) => {
+ if (videoParams.hasOwnProperty(param)) {
+ video[param] = videoParams[param];
+ }
+ });
+
+ video.placement = video.placement || 2;
+
+ video.startdelay = video.startdelay || 0;
+ video.placement = 1;
+ video.context = INSTREAM;
+
+ return video;
+}
+registerBidder(spec);
diff --git a/modules/iqmBidAdapter.md b/modules/iqmBidAdapter.md
index d6d1b4d037d..85dfdc7e078 100644
--- a/modules/iqmBidAdapter.md
+++ b/modules/iqmBidAdapter.md
@@ -10,9 +10,8 @@ Maintainer: hbteam@iqm.com
| Name | Scope | Description | Example |
| :------------ | :------- | :------------------------ | :------------------- |
-| `publisherId` | required | The Publisher ID from iQM | "df5fd732-c5f3-11e7" |
-| `tagId` | required | The tag ID from iQM | "1c5c9ec2-c5f4-11e7" |
-| `placementId` | required | The Placement ID from iQM | "50cc36fe-c5f4-11e7" |
+| `publisherId` | required | The Publisher ID from iQM | "df5fd732-c5f3-11e7-abc4-cec278b6b50a" |
+| `placementId` | required | The Placement ID from iQM | 23451 |
| `bidfloor` | optional | Bid Floor | 0.50 |
# Description
@@ -21,21 +20,62 @@ Module that connects to iQM demand sources
# Test Parameters
```
- var adUnits = [
- {
- code: 'test-div1',
- sizes: [[320, 50]], // display 320x50
- bids: [
- {
- bidder: 'iqm',
- params: {
- publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a',
- tagId: '1c5c9ec2-c5f4-11e7-abc4-cec278b6b50a',
- placementId: '50cc36fe-c5f4-11e7-abc4-cec278b6b50a',
- bidfloor: 0.50,
- }
- }
- ]
- }
- ];
+var adUnits = [{
+ code: 'div-gpt-ad-1460505748561-0',
+ mediaTypes: {
+ banner: {
+ sizes: [[300,250]]
+ }
+ },
+
+ bids: [{
+ bidder: 'iqm',
+ params: {
+ geo:{
+ country:'USA'
+ },
+
+ publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a',
+ placementId: 23451,
+ bidfloor: 0.50
+ }
+ }]
+
+ }]
+
+```
+
+# adUnit Video
+
+```
+ var videoAdUnit = {
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ playerSize: [640, 480],
+ context: 'instream'
+ }
+ },
+ bids: [{
+ bidder: 'iqm',
+ params: {
+ // placementId: iosDevice ? 13239390 : 13232361, // Add your own placement id here. Note, skippable video is not supported on iOS
+ publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a',
+ placementId: 23451,
+ geo:{
+ country:'USA'
+ },
+
+ bidfloor: 0.05,
+ video: {
+ placement :2,
+ mimes: ['video/mp4'],
+ protocols: [2,5],
+ skipppable: true,
+ playback_method: ['auto_play_sound_off']
+ }
+ }
+ }]
+ };
+
```
diff --git a/modules/ironsourceBidAdapter.js b/modules/ironsourceBidAdapter.js
deleted file mode 100644
index 5b8531d7a85..00000000000
--- a/modules/ironsourceBidAdapter.js
+++ /dev/null
@@ -1,251 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import * as utils from '../src/utils.js';
-import {VIDEO} from '../src/mediaTypes.js';
-import {config} from '../src/config.js';
-
-const SUPPORTED_AD_TYPES = [VIDEO];
-const BIDDER_CODE = 'ironsource';
-const BIDDER_VERSION = '4.0.0';
-const TTL = 360;
-const SELLER_ENDPOINT = 'https://hb.yellowblue.io/';
-const MODES = {
- PRODUCTION: 'hb',
- TEST: 'hb-test'
-}
-const SUPPORTED_SYNC_METHODS = {
- IFRAME: 'iframe',
- PIXEL: 'pixel'
-}
-
-export const spec = {
- code: BIDDER_CODE,
- version: BIDDER_VERSION,
- supportedMediaTypes: SUPPORTED_AD_TYPES,
- isBidRequestValid: function(bidRequest) {
- return !!(bidRequest.params.isOrg);
- },
- buildRequests: function (bidRequests, bidderRequest) {
- if (bidRequests.length === 0) {
- return [];
- }
-
- const requests = [];
-
- bidRequests.forEach(bid => {
- requests.push(buildVideoRequest(bid, bidderRequest));
- });
-
- return requests;
- },
- interpretResponse: function({body}) {
- const bidResponses = [];
-
- const bidResponse = {
- requestId: body.requestId,
- cpm: body.cpm,
- width: body.width,
- height: body.height,
- creativeId: body.requestId,
- currency: body.currency,
- netRevenue: body.netRevenue,
- ttl: body.ttl || TTL,
- vastXml: body.vastXml,
- mediaType: VIDEO
- };
-
- bidResponses.push(bidResponse);
-
- return bidResponses;
- },
- getUserSyncs: function(syncOptions, serverResponses) {
- const syncs = [];
- for (const response of serverResponses) {
- if (syncOptions.iframeEnabled && response.body.userSyncURL) {
- syncs.push({
- type: 'iframe',
- url: response.body.userSyncURL
- });
- }
- if (syncOptions.pixelEnabled && utils.isArray(response.body.userSyncPixels)) {
- const pixels = response.body.userSyncPixels.map(pixel => {
- return {
- type: 'image',
- url: pixel
- }
- })
- syncs.push(...pixels)
- }
- }
- return syncs;
- }
-};
-
-registerBidder(spec);
-
-/**
- * Build the video request
- * @param bid {bid}
- * @param bidderRequest {bidderRequest}
- * @returns {Object}
- */
-function buildVideoRequest(bid, bidderRequest) {
- const sellerParams = generateParameters(bid, bidderRequest);
- const {params} = bid;
- return {
- method: 'GET',
- url: getEndpoint(params.testMode),
- data: sellerParams
- };
-}
-
-/**
- * Get the the ad size from the bid
- * @param bid {bid}
- * @returns {Array}
- */
-function getSizes(bid) {
- if (utils.deepAccess(bid, 'mediaTypes.video.sizes')) {
- return bid.mediaTypes.video.sizes[0];
- } else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) {
- return bid.sizes[0];
- }
- return [];
-}
-
-/**
- * Get schain string value
- * @param schainObject {Object}
- * @returns {string}
- */
-function getSupplyChain(schainObject) {
- if (utils.isEmpty(schainObject)) {
- return '';
- }
- let scStr = `${schainObject.ver},${schainObject.complete}`;
- schainObject.nodes.forEach((node) => {
- scStr += '!';
- scStr += `${getEncodedValIfNotEmpty(node.asi)},`;
- scStr += `${getEncodedValIfNotEmpty(node.sid)},`;
- scStr += `${getEncodedValIfNotEmpty(node.hp)},`;
- scStr += `${getEncodedValIfNotEmpty(node.rid)},`;
- scStr += `${getEncodedValIfNotEmpty(node.name)},`;
- scStr += `${getEncodedValIfNotEmpty(node.domain)}`;
- });
- return scStr;
-}
-
-/**
- * Get encoded node value
- * @param val {string}
- * @returns {string}
- */
-function getEncodedValIfNotEmpty(val) {
- return !utils.isEmpty(val) ? encodeURIComponent(val) : '';
-}
-
-/**
- * Get preferred user-sync method based on publisher configuration
- * @param bidderCode {string}
- * @returns {string}
- */
-function getAllowedSyncMethod(filterSettings, bidderCode) {
- const iframeConfigsToCheck = ['all', 'iframe'];
- const pixelConfigToCheck = 'image';
- if (filterSettings && iframeConfigsToCheck.some(config => isSyncMethodAllowed(filterSettings[config], bidderCode))) {
- return SUPPORTED_SYNC_METHODS.IFRAME;
- }
- if (!filterSettings || !filterSettings[pixelConfigToCheck] || isSyncMethodAllowed(filterSettings[pixelConfigToCheck], bidderCode)) {
- return SUPPORTED_SYNC_METHODS.PIXEL;
- }
-}
-
-/**
- * Check if sync rule is supported
- * @param syncRule {Object}
- * @param bidderCode {string}
- * @returns {boolean}
- */
-function isSyncMethodAllowed(syncRule, bidderCode) {
- if (!syncRule) {
- return false;
- }
- const isInclude = syncRule.filter === 'include';
- const bidders = utils.isArray(syncRule.bidders) ? syncRule.bidders : [bidderCode];
- return isInclude && utils.contains(bidders, bidderCode);
-}
-
-/**
- * Get the seller endpoint
- * @param testMode {boolean}
- * @returns {string}
- */
-function getEndpoint(testMode) {
- return testMode
- ? SELLER_ENDPOINT + MODES.TEST
- : SELLER_ENDPOINT + MODES.PRODUCTION;
-}
-
-/**
- * Generate query parameters for the request
- * @param bid {bid}
- * @param bidderRequest {bidderRequest}
- * @returns {Object}
- */
-function generateParameters(bid, bidderRequest) {
- const timeout = config.getConfig('bidderTimeout');
- const { syncEnabled, filterSettings } = config.getConfig('userSync');
- const [ width, height ] = getSizes(bid);
- const { params } = bid;
- const { bidderCode } = bidderRequest;
- const domain = window.location.hostname;
-
- const requestParams = {
- auction_start: utils.timestamp(),
- ad_unit_code: utils.getBidIdParameter('adUnitCode', bid),
- tmax: timeout,
- width: width,
- height: height,
- publisher_id: params.isOrg,
- floor_price: params.floorPrice,
- ua: navigator.userAgent,
- bid_id: utils.getBidIdParameter('bidId', bid),
- bidder_request_id: utils.getBidIdParameter('bidderRequestId', bid),
- transaction_id: utils.getBidIdParameter('transactionId', bid),
- session_id: params.sessionId || utils.getBidIdParameter('auctionId', bid),
- is_wrapper: !!params.isWrapper,
- publisher_name: domain,
- site_domain: domain,
- bidder_version: BIDDER_VERSION
- };
-
- if (syncEnabled) {
- const allowedSyncMethod = getAllowedSyncMethod(filterSettings, bidderCode);
- if (allowedSyncMethod) {
- requestParams.cs_method = allowedSyncMethod;
- }
- }
-
- if (bidderRequest.uspConsent) {
- requestParams.us_privacy = bidderRequest.uspConsent;
- }
-
- if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) {
- requestParams.gdpr = bidderRequest.gdprConsent.gdprApplies;
- requestParams.gdpr_consent = bidderRequest.gdprConsent.consentString;
- }
-
- if (params.ifa) {
- requestParams.ifa = params.ifa;
- }
-
- if (bid.schain) {
- requestParams.schain = getSupplyChain(bid.schain);
- }
-
- if (bidderRequest && bidderRequest.refererInfo) {
- requestParams.referrer = utils.deepAccess(bidderRequest, 'refererInfo.referer');
- requestParams.page_url = config.getConfig('pageUrl') || utils.deepAccess(window, 'location.href');
- }
-
- return requestParams;
-}
diff --git a/modules/ixBidAdapter.js b/modules/ixBidAdapter.js
index 4837c9c061f..766ece90fce 100644
--- a/modules/ixBidAdapter.js
+++ b/modules/ixBidAdapter.js
@@ -3,6 +3,7 @@ import { BANNER, VIDEO } from '../src/mediaTypes.js';
import { config } from '../src/config.js';
import find from 'core-js-pure/features/array/find.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
+import { INSTREAM, OUTSTREAM } from '../src/video.js';
const BIDDER_CODE = 'ix';
const ALIAS_BIDDER_CODE = 'roundel';
@@ -15,6 +16,8 @@ const CENT_TO_DOLLAR_FACTOR = 100;
const BANNER_TIME_TO_LIVE = 300;
const VIDEO_TIME_TO_LIVE = 3600; // 1hr
const NET_REVENUE = true;
+const MAX_REQUEST_SIZE = 8000;
+const MAX_REQUEST_LIMIT = 4;
const PRICE_TO_DOLLAR_FACTOR = {
JPY: 1
@@ -42,26 +45,43 @@ const PROVIDERS = [
'merkleId',
'parrableId',
'connectid',
- 'sharedid',
'tapadId',
'quantcastId',
'pubcid',
'TDID',
'flocId'
-]
+];
+
+const REQUIRED_VIDEO_PARAMS = ['mimes', 'minduration', 'maxduration']; // note: protocol/protocols is also reqd
+
+const VIDEO_PARAMS_ALLOW_LIST = [
+ 'mimes', 'minduration', 'maxduration', 'protocols', 'protocol',
+ 'startdelay', 'placement', 'linearity', 'skip', 'skipmin',
+ 'skipafter', 'sequence', 'battr', 'maxextended', 'minbitrate',
+ 'maxbitrate', 'boxingallowed', 'playbackmethod', 'playbackend',
+ 'delivery', 'pos', 'companionad', 'api', 'companiontype', 'ext',
+ 'playerSize', 'w', 'h'
+];
/**
* 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.
+ * @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);
-
imp.banner = {};
- imp.banner.w = bid.params.size[0];
- imp.banner.h = bid.params.size[1];
+ const impSize = utils.deepAccess(bid, 'params.size');
+ if (impSize) {
+ imp.banner.w = impSize[0];
+ imp.banner.h = impSize[1];
+ // populate sid with size if not id
+ if (!utils.deepAccess(imp, 'ext.sid')) {
+ imp.ext.sid = utils.parseGPTSingleSizeArray(impSize);
+ }
+ }
+
imp.banner.topframe = utils.inIframe() ? 0 : 1;
_applyFloor(bid, imp, BANNER);
@@ -78,32 +98,51 @@ function bidToBannerImp(bid) {
function bidToVideoImp(bid) {
const imp = bidToImp(bid);
const videoAdUnitRef = utils.deepAccess(bid, 'mediaTypes.video');
- const context = utils.deepAccess(bid, 'mediaTypes.video.context');
- const videoAdUnitAllowlist = [
- 'mimes', 'minduration', 'maxduration', 'protocols', 'protocol',
- 'startdelay', 'placement', 'linearity', 'skip', 'skipmin',
- 'skipafter', 'sequence', 'battr', 'maxextended', 'minbitrate',
- 'maxbitrate', 'boxingallowed', 'playbackmethod', 'playbackend',
- 'delivery', 'pos', 'companionad', 'api', 'companiontype', 'ext'
- ];
-
- imp.video = utils.deepClone(bid.params.video)
- imp.video.w = bid.params.size[0];
- imp.video.h = bid.params.size[1];
-
- if (context) {
- if (context === 'instream') {
+ const videoParamRef = utils.deepAccess(bid, 'params.video');
+
+ if (!checkVideoParams(bid, videoAdUnitRef, videoParamRef)) {
+ return {};
+ }
+
+ imp.video = videoParamRef ? utils.deepClone(bid.params.video) : {};
+
+ // copy all video properties to imp object
+ for (const adUnitProperty in videoAdUnitRef) {
+ if (VIDEO_PARAMS_ALLOW_LIST.indexOf(adUnitProperty) !== -1 && !imp.video.hasOwnProperty(adUnitProperty)) {
+ imp.video[adUnitProperty] = videoAdUnitRef[adUnitProperty];
+ }
+ }
+
+ if (imp.video.minduration > imp.video.maxduration) {
+ utils.logError(`IX Bid Adapter: video minduration [${imp.video.minduration}] cannot be greater than video maxduration [${imp.video.maxduration}]`);
+ return {};
+ }
+
+ const context = (videoParamRef && videoParamRef.context) || (videoAdUnitRef && videoAdUnitRef.context);
+
+ // if placement not already defined, pick one based on `context`
+ if (context && !imp.video.hasOwnProperty('placement')) {
+ if (context === INSTREAM) {
imp.video.placement = 1;
- } else if (context === 'outstream') {
+ } else if (context === OUTSTREAM) {
imp.video.placement = 4;
} else {
- utils.logWarn(`ix bidder params: video context '${context}' is not supported`);
+ utils.logWarn(`IX Bid Adapter: Video context '${context}' is not supported`);
}
}
- for (const adUnitProperty in videoAdUnitRef) {
- if (videoAdUnitAllowlist.indexOf(adUnitProperty) !== -1 && !imp.video.hasOwnProperty(adUnitProperty)) {
- imp.video[adUnitProperty] = videoAdUnitRef[adUnitProperty];
+ if (!(imp.video.w && imp.video.h)) {
+ // Getting impression Size
+ const impSize = getFirstSize(utils.deepAccess(imp, 'video.playerSize')) || getFirstSize(utils.deepAccess(bid, 'params.size'));
+ if (impSize) {
+ imp.video.w = impSize[0];
+ imp.video.h = impSize[1];
+ if (!(utils.deepAccess(imp, 'ext.sid'))) {
+ imp.ext.sid = utils.parseGPTSingleSizeArray(impSize);
+ }
+ } else {
+ utils.logWarn('IX Bid Adapter: Video size is missing in [mediaTypes.video] missing');
+ return {};
}
}
@@ -128,8 +167,6 @@ function bidToImp(bid) {
if (bid.params.hasOwnProperty('id') &&
(typeof bid.params.id === 'string' || typeof bid.params.id === 'number')) {
imp.ext.sid = String(bid.params.id);
- } else {
- imp.ext.sid = `${bid.params.size[0]}x${bid.params.size[1]}`;
}
const dfpAdUnitCode = utils.deepAccess(bid, 'ortb2Imp.ext.data.adserver.adslot');
@@ -174,24 +211,7 @@ function _applyFloor(bid, imp, mediaType) {
}
}
- if (adapterFloor && moduleFloor) {
- if (adapterFloor.currency !== moduleFloor.currency) {
- utils.logWarn('The bid floor currency mismatch between IX params and priceFloors module config');
- return;
- }
-
- if (adapterFloor.floor > moduleFloor.floor) {
- imp.bidfloor = adapterFloor.floor;
- imp.bidfloorcur = adapterFloor.currency;
- imp.ext.fl = FLOOR_SOURCE.IX;
- } else {
- imp.bidfloor = moduleFloor.floor;
- imp.bidfloorcur = moduleFloor.currency;
- imp.ext.fl = FLOOR_SOURCE.PBJS;
- }
- return;
- }
-
+ // Prioritize module floor over bidder.param floor
if (moduleFloor) {
imp.bidfloor = moduleFloor.floor;
imp.bidfloorcur = moduleFloor.currency;
@@ -200,8 +220,6 @@ function _applyFloor(bid, imp, mediaType) {
imp.bidfloor = adapterFloor.floor;
imp.bidfloorcur = adapterFloor.currency;
imp.ext.fl = FLOOR_SOURCE.IX;
- } else {
- utils.logInfo('IX Bid Adapter: No floors available, no floors applied');
}
}
@@ -278,16 +296,68 @@ function isValidSize(size) {
* @return {boolean} True if the size object is an element of the size array, and false
* otherwise.
*/
-function includesSize(sizeArray, size) {
+function includesSize(sizeArray = [], size) {
if (isValidSize(sizeArray)) {
return sizeArray[0] === size[0] && sizeArray[1] === size[1];
}
-
for (let i = 0; i < sizeArray.length; i++) {
if (sizeArray[i][0] === size[0] && sizeArray[i][1] === size[1]) {
return true;
}
}
+ return false;
+}
+
+/**
+ * Checks if all required video params are present
+ * @param {object} bid Bid Object
+ * @param {object} mediaTypeVideoRef Ad unit level mediaTypes object
+ * @param {object} paramsVideoRef IX bidder params level video object
+ * @returns bool Are the required video params available
+ */
+function checkVideoParams(bid, mediaTypeVideoRef, paramsVideoRef) {
+ let reqParamsPresent = true;
+
+ if (!mediaTypeVideoRef) {
+ utils.logWarn('IX Bid Adapter: mediaTypes.video is the preferred location for video params in ad unit');
+ }
+
+ for (let property of REQUIRED_VIDEO_PARAMS) {
+ const propInMediaType = mediaTypeVideoRef && mediaTypeVideoRef.hasOwnProperty(property);
+ const propInVideoRef = paramsVideoRef && paramsVideoRef.hasOwnProperty(property);
+
+ if (!propInMediaType && !propInVideoRef) {
+ utils.logError(`IX Bid Adapter: ${property} is not included in either the adunit or params level`);
+ reqParamsPresent = false;
+ }
+ }
+
+ // early return
+ if (!reqParamsPresent) {
+ return false;
+ }
+
+ // check protocols/protocol
+ const protocolMediaType = mediaTypeVideoRef && mediaTypeVideoRef.hasOwnProperty('protocol');
+ const protocolsMediaType = mediaTypeVideoRef && mediaTypeVideoRef.hasOwnProperty('protocols');
+ const protocolVideoRef = paramsVideoRef && paramsVideoRef.hasOwnProperty('protocol');
+ const protocolsVideoRef = paramsVideoRef && paramsVideoRef.hasOwnProperty('protocols');
+
+ return protocolMediaType || protocolsMediaType || protocolVideoRef || protocolsVideoRef;
+}
+
+/**
+ * Get One size from Size Array
+ * [[250,350]] -> [250, 350]
+ * [250, 350] -> [250, 350]
+ * @param {array} sizes array of sizes
+ */
+function getFirstSize(sizes = []) {
+ if (isValidSize(sizes)) {
+ return sizes;
+ } else if (isValidSize(sizes[0])) {
+ return sizes[0];
+ }
return false;
}
@@ -295,9 +365,9 @@ function includesSize(sizeArray, size) {
/**
* Determines whether or not the given bidFloor parameters are valid.
*
- * @param {*} bidFloor The bidFloor parameter inside bid request config.
- * @param {*} bidFloorCur The bidFloorCur parameter inside bid request config.
- * @return {boolean} True if this is a valid bidFloor parameters format, and false
+ * @param {number} bidFloor The bidFloor parameter inside bid request config.
+ * @param {number} bidFloorCur The bidFloorCur parameter inside bid request config.
+ * @return {bool} True if this is a valid bidFloor parameters format, and false
* otherwise.
*/
function isValidBidFloorParams(bidFloor, bidFloorCur) {
@@ -399,11 +469,13 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
// Since bidderRequestId are the same for different bid request, just use the first one.
r.id = validBidRequests[0].bidderRequestId.toString();
-
r.site = {};
r.ext = {};
r.ext.source = 'prebid';
r.ext.ixdiag = {};
+ r.ext.ixdiag.msd = 0;
+ r.ext.ixdiag.msi = 0;
+ r.imp = [];
// getting ixdiags for adunits of the video, outstream & multi format (MF) style
let ixdiag = buildIXDiag(validBidRequests);
@@ -470,10 +542,31 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
}
const payload = {};
+ // Use the siteId in the first bid request as the main siteId.
+ payload.s = validBidRequests[0].params.siteId;
+ payload.v = version;
+ payload.ac = 'j';
+ payload.sd = 1;
+
+ if (version === VIDEO_ENDPOINT_VERSION) {
+ payload.nf = 1;
+ }
// Parse additional runtime configs.
const bidderCode = (bidderRequest && bidderRequest.bidderCode) || 'ix';
const otherIxConfig = config.getConfig(bidderCode);
+ const requests = [];
+ let requestSequenceNumber = 0;
+ const transactionIds = Object.keys(impressions);
+ const baseRequestSize = `${baseUrl}${utils.parseQueryStringParameters({ ...payload, r: JSON.stringify(r) })}`.length;
+
+ if (baseRequestSize > MAX_REQUEST_SIZE) {
+ utils.logError('ix bidder: Base request size has exceeded maximum request size.');
+ return requests;
+ }
+
+ let currentRequestSize = baseRequestSize;
+
if (otherIxConfig) {
// Append firstPartyData to r.site.page if firstPartyData exists.
if (typeof otherIxConfig.firstPartyData === 'object') {
@@ -501,75 +594,64 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
}
}
- // Use the siteId in the first bid request as the main siteId.
- payload.s = validBidRequests[0].params.siteId;
- payload.v = version;
- payload.ac = 'j';
- payload.sd = 1;
- if (version === VIDEO_ENDPOINT_VERSION) {
- payload.nf = 1;
- }
-
- const requests = [];
-
- const request = {
- method: 'GET',
- url: baseUrl,
- data: payload
- };
-
- const BASE_REQ_SIZE = new Blob([`${request.url}${utils.parseQueryStringParameters({ ...request.data, r: JSON.stringify(r) })}`]).size;
- let currReqSize = BASE_REQ_SIZE;
-
- const MAX_REQ_SIZE = 8000;
- const MAX_REQ_LIMIT = 4;
- let sn = 0;
- let msi = 0;
- let msd = 0;
- r.ext.ixdiag.msd = 0;
- r.ext.ixdiag.msi = 0;
- r.imp = [];
- let i = 0;
- const transactionIds = Object.keys(impressions);
- let currMissingImps = [];
-
- while (i < transactionIds.length && requests.length < MAX_REQ_LIMIT) {
- if (impressions[transactionIds[i]].hasOwnProperty('missingCount')) {
- msd = impressions[transactionIds[i]].missingCount;
+ for (let adUnitIndex = 0; adUnitIndex < transactionIds.length; adUnitIndex++) {
+ if (currentRequestSize >= MAX_REQUEST_SIZE || requests.length >= MAX_REQUEST_LIMIT) {
+ break;
}
- if (BASE_REQ_SIZE < MAX_REQ_SIZE) {
- trimImpressions(impressions[transactionIds[i]], MAX_REQ_SIZE - BASE_REQ_SIZE);
- } else {
- utils.logError('ix bidder: Base request size has exceeded maximum request size.');
+ const adUnitImpressions = impressions[transactionIds[adUnitIndex]];
+ const { missingCount = 0, missingImps: missingBannerImpressions = [], ixImps = [] } = adUnitImpressions;
+ let wasAdUnitImpressionsTrimmed = false;
+ let remainingRequestSize = MAX_REQUEST_SIZE - currentRequestSize;
+ const sourceImpressions = { ixImps, missingBannerImpressions };
+ const impressionObjects = Object.keys(sourceImpressions)
+ .map((key) => sourceImpressions[key])
+ .filter(item => Array.isArray(item))
+ .reduce((acc, curr) => acc.concat(...curr), []);
+
+ let currentImpressionSize = encodeURIComponent(JSON.stringify({ impressionObjects })).length;
+
+ while (currentImpressionSize > remainingRequestSize) {
+ wasAdUnitImpressionsTrimmed = true;
+ impressionObjects.pop();
+ currentImpressionSize = encodeURIComponent(JSON.stringify({ impressionObjects })).length;
}
- if (impressions[transactionIds[i]].hasOwnProperty('missingImps')) {
- msi = impressions[transactionIds[i]].missingImps.length;
- }
+ if (BANNER in impressionObjects[0]) {
+ const { id, banner: { topframe } } = impressionObjects[0];
+ const _bannerImpression = {
+ id,
+ banner: {
+ topframe,
+ format: impressionObjects.map(({ banner: { w, h }, ext }) => ({ w, h, ext }))
+ },
+ }
- let currImpsSize = new Blob([encodeURIComponent(JSON.stringify(impressions[transactionIds[i]]))]).size;
- currReqSize += currImpsSize;
- if (currReqSize < MAX_REQ_SIZE) {
- // pushing ix configured sizes first
- r.imp.push(...impressions[transactionIds[i]].ixImps);
- // update msd msi
- r.ext.ixdiag.msd += msd;
- r.ext.ixdiag.msi += msi;
+ if ('bidfloor' in impressionObjects[0]) {
+ _bannerImpression.bidfloor = impressionObjects[0].bidfloor;
+ }
- if (impressions[transactionIds[i]].hasOwnProperty('missingImps')) {
- currMissingImps.push(...impressions[transactionIds[i]].missingImps);
+ if ('bidfloorcur' in impressionObjects[0]) {
+ _bannerImpression.bidfloorcur = impressionObjects[0].bidfloorcur;
}
- i++;
+ r.imp.push(_bannerImpression);
+ r.ext.ixdiag.msd += missingCount;
+ r.ext.ixdiag.msi += missingBannerImpressions.length;
} else {
- // pushing missing sizes after configured ones
+ r.imp.push(...impressionObjects);
+ }
+
+ const isLastAdUnit = adUnitIndex === transactionIds.length - 1;
+
+ if (wasAdUnitImpressionsTrimmed || isLastAdUnit) {
const clonedPayload = utils.deepClone(payload);
+ if (!isLastAdUnit || requestSequenceNumber) {
+ r.ext.ixdiag.sn = requestSequenceNumber;
+ clonedPayload.sn = requestSequenceNumber;
+ }
- r.imp.push(...currMissingImps);
- r.ext.ixdiag.sn = sn;
- clonedPayload.sn = sn;
- sn++;
+ requestSequenceNumber++;
clonedPayload.r = JSON.stringify(r);
requests.push({
@@ -577,33 +659,14 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) {
url: baseUrl,
data: clonedPayload
});
- currMissingImps = [];
- currReqSize = BASE_REQ_SIZE;
+
+ currentRequestSize = baseRequestSize;
r.imp = [];
- msd = 0;
- msi = 0;
r.ext.ixdiag.msd = 0;
r.ext.ixdiag.msi = 0;
}
}
- if (currReqSize > BASE_REQ_SIZE && currReqSize < MAX_REQ_SIZE && requests.length < MAX_REQ_LIMIT) {
- const clonedPayload = utils.deepClone(payload);
- r.imp.push(...currMissingImps);
-
- if (requests.length > 0) {
- r.ext.ixdiag.sn = sn;
- clonedPayload.sn = sn;
- }
- clonedPayload.r = JSON.stringify(r);
-
- requests.push({
- method: 'GET',
- url: baseUrl,
- data: clonedPayload
- });
- }
-
return requests;
}
@@ -679,26 +742,6 @@ function buildIXDiag(validBidRequests) {
return ixdiag;
}
-/**
- *
- * @param {Object} impressions containing ixImps and possibly missingImps
- *
- */
-function trimImpressions(impressions, maxSize) {
- let currSize = new Blob([encodeURIComponent(JSON.stringify(impressions))]).size;
- if (currSize < maxSize) {
- return;
- }
-
- while (currSize > maxSize) {
- if (impressions.hasOwnProperty('missingImps') && impressions.missingImps.length > 0) {
- impressions.missingImps.pop();
- } else if (impressions.hasOwnProperty('ixImps') && impressions.ixImps.length > 0) {
- impressions.ixImps.pop();
- }
- currSize = new Blob([encodeURIComponent(JSON.stringify(impressions))]).size;
- }
-}
/**
*
* @param {array} bannerSizeList list of banner sizes
@@ -707,14 +750,15 @@ function trimImpressions(impressions, maxSize) {
*/
function removeFromSizes(bannerSizeList, bannerSize) {
+ if (!bannerSize) return;
+
for (let i = 0; i < bannerSizeList.length; i++) {
- if (bannerSize[0] == bannerSizeList[i][0] && bannerSize[1] == bannerSizeList[i][1]) {
+ const size = bannerSizeList[i];
+ if (bannerSize[0] === size[0] && bannerSize[1] === size[1]) {
bannerSizeList.splice(i, 1);
- return true;
+ break;
}
}
- // size not found
- return false;
}
/**
@@ -755,7 +799,7 @@ function updateMissingSizes(validBidRequest, missingBannerSizes, imp) {
*/
function createMissingBannerImp(bid, imp, newSize) {
const newImp = utils.deepClone(imp);
- newImp.ext.sid = `${newSize[0]}x${newSize[1]}`;
+ newImp.ext.sid = utils.parseGPTSingleSizeArray(newSize);
newImp.banner.w = newSize[0];
newImp.banner.h = newSize[1];
@@ -790,40 +834,26 @@ export const spec = {
const hasBidFloor = bid.params.hasOwnProperty('bidFloor');
const hasBidFloorCur = bid.params.hasOwnProperty('bidFloorCur');
- if (!isValidSize(bid.params.size)) {
- utils.logError('ix bidder params: bid size has invalid format.');
- return false;
- }
-
if (bid.hasOwnProperty('mediaType') && !(utils.contains(SUPPORTED_AD_TYPES, bid.mediaType))) {
return false;
}
- if (bid.hasOwnProperty('mediaTypes') && !(mediaTypeBannerSizes || mediaTypeVideoPlayerSize)) {
+ if (utils.deepAccess(bid, 'mediaTypes.banner') && !mediaTypeBannerSizes) {
return false;
}
- if (!includesSize(bid.sizes, paramsSize) && !((mediaTypeVideoPlayerSize && includesSize(mediaTypeVideoPlayerSize, paramsSize)) ||
- (mediaTypeBannerSizes && includesSize(mediaTypeBannerSizes, paramsSize)))) {
- utils.logError('ix bidder params: bid size is not included in ad unit sizes or player size.');
- return false;
- }
-
- if (mediaTypeVideoRef && paramsVideoRef) {
- const requiredIXParams = ['mimes', 'minduration', 'maxduration', 'protocols'];
- let isParamsLevelValid = true;
- for (let property of requiredIXParams) {
- if (!mediaTypeVideoRef.hasOwnProperty(property) && !paramsVideoRef.hasOwnProperty(property)) {
- const isProtocolsValid = (property === 'protocols' && (mediaTypeVideoRef.hasOwnProperty('protocol') || paramsVideoRef.hasOwnProperty('protocol')));
- if (isProtocolsValid) {
- continue;
- }
- utils.logError('ix bidder params: ' + property + ' is not included in either the adunit or params level');
- isParamsLevelValid = false;
- }
+ if (paramsSize) {
+ // since there is an ix bidder level size, make sure its valid
+ const ixSize = getFirstSize(paramsSize);
+ if (!ixSize) {
+ utils.logError('ix bidder params: size has invalid format.');
+ return false;
}
-
- if (!isParamsLevelValid) {
+ // check if the ix bidder level size, is present in ad unit level
+ if (!includesSize(bid.sizes, ixSize) &&
+ !(includesSize(mediaTypeVideoPlayerSize, ixSize)) &&
+ !(includesSize(mediaTypeBannerSizes, ixSize))) {
+ utils.logError('ix bidder params: bid size is not included in ad unit sizes or player size.');
return false;
}
}
@@ -839,7 +869,10 @@ export const spec = {
return false;
}
}
-
+ // For multi format unit
+ if (!mediaTypeBannerSizes && (mediaTypeVideoRef || paramsVideoRef)) {
+ return checkVideoParams(bid, mediaTypeVideoRef, paramsVideoRef);
+ }
return true;
},
@@ -867,30 +900,35 @@ export const spec = {
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)) {
- if (!videoImps.hasOwnProperty(validBidRequest.transactionId)) {
+ const videoAdUnitRef = utils.deepAccess(validBidRequest, 'mediaTypes.video');
+ const videoParamRef = utils.deepAccess(validBidRequest, 'params.video');
+
+ // identify video ad unit
+ if (validBidRequest.mediaType === VIDEO || videoAdUnitRef || videoParamRef) {
+ if (!videoImps.hasOwnProperty(validBidRequest.transactionId)) {
+ const imp = bidToVideoImp(validBidRequest);
+ if (Object.keys(imp).length != 0) {
videoImps[validBidRequest.transactionId] = {};
- }
- if (!videoImps[validBidRequest.transactionId].hasOwnProperty('ixImps')) {
videoImps[validBidRequest.transactionId].ixImps = [];
+ videoImps[validBidRequest.transactionId].ixImps.push(imp);
}
- videoImps[validBidRequest.transactionId].ixImps.push(bidToVideoImp(validBidRequest));
}
}
+
if (validBidRequest.mediaType === BANNER ||
- (utils.deepAccess(validBidRequest, 'mediaTypes.banner') && includesSize(utils.deepAccess(validBidRequest, 'mediaTypes.banner.sizes'), validBidRequest.params.size)) ||
+ (utils.deepAccess(validBidRequest, 'mediaTypes.banner.sizes')) ||
(!validBidRequest.mediaType && !validBidRequest.mediaTypes)) {
let imp = bidToBannerImp(validBidRequest);
-
- if (!bannerImps.hasOwnProperty(validBidRequest.transactionId)) {
- bannerImps[validBidRequest.transactionId] = {};
- }
- if (!bannerImps[validBidRequest.transactionId].hasOwnProperty('ixImps')) {
- bannerImps[validBidRequest.transactionId].ixImps = []
+ // Create IX imps from params.size
+ if (utils.deepAccess(validBidRequest, 'params.size')) {
+ if (!bannerImps.hasOwnProperty(validBidRequest.transactionId)) {
+ bannerImps[validBidRequest.transactionId] = {};
+ }
+ if (!bannerImps[validBidRequest.transactionId].hasOwnProperty('ixImps')) {
+ bannerImps[validBidRequest.transactionId].ixImps = []
+ }
+ bannerImps[validBidRequest.transactionId].ixImps.push(imp);
}
- bannerImps[validBidRequest.transactionId].ixImps.push(imp);
if (ixConfig.hasOwnProperty('detectMissingSizes') && ixConfig.detectMissingSizes) {
updateMissingSizes(validBidRequest, missingBannerSizes, imp);
}
diff --git a/modules/ixBidAdapter.md b/modules/ixBidAdapter.md
index c358b19a0a2..59b699bad2d 100644
--- a/modules/ixBidAdapter.md
+++ b/modules/ixBidAdapter.md
@@ -13,30 +13,10 @@ Description
This module connects publishers to Index Exchange's (IX) network of demand
sources through Prebid.js. This module is GDPR and CCPA compliant.
-It is compatible with both the older ad unit format where the `sizes` and
-`mediaType` properties are placed at the top-level of the ad unit, and the newer
-format where this information is encapsulated within the `mediaTypes` object. We
-recommend that you use the newer format when possible as it will be better able
+It is compatible with the newer PrebidJS 5.0 ad unit format where the `banner` and/or `video` properties are encapsulated within the `adUnits[].mediaTypes` object. We
+recommend that you use this newer format when possible as it will be better able
to accommodate new feature additions.
-If a mix of properties from both formats are present within an ad unit, the
-newer format's properties will take precedence.
-
-Here are examples of both formats.
-
-##### Older Format
-```javascript
-var adUnits = [{
- // ...
-
- sizes: [
- [300, 250],
- [300, 600]
- ]
-
- // ...
-}];
-```
##### Newer Format
```javascript
@@ -51,10 +31,7 @@ var adUnits = [{
},
video: {
context: 'instream',
- playerSize: [
- [300, 250],
- [300, 600]
- ]
+ playerSize: [300, 250]
}
},
// ...
@@ -69,30 +46,59 @@ var adUnits = [{
| Video | Fully supported for all IX approved sizes.
| Native | Not supported.
-# Bid Parameters
+
+
+# Ad unit or Bidder Parameters
+
+These params can be specified in the ad unit level `adUnits[].mediaTypes`, which will be the preferred way going forward with PBJS 5.0
Each of the IX-specific parameters provided under the `adUnits[].bids[].params`
object are detailed here.
+
### Banner
| 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.banner.sizes`. Examples: `[300, 250]`, `[300, 600]`, `[728, 90]`
+| siteId | Required | String | An IX-specific identifier that is associated with this ad unit. It will be associated to the single size, if the size provided. This is similar to a placement ID or an ad unit ID that some other modules have. Examples: `'3723'`, `'6482'`, `'3639'`
+| sizes | Required | Number[Number[]] | The size / sizes associated with the site ID. It should be one of the sizes listed in the ad unit under `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. Properties not defined at this level, will be pulled from the Adunit level.
+| siteId | Required | String | An IX-specific identifier that is associated with this ad unit. It will be associated to the single size, if the size is provided. This is similar to a placement ID or an ad unit ID that some other modules have. Examples: `'3723'`, `'6482'`, `'3639'`
+| size | Optional (Deprecated)| 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 | Optional | 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. Properties not defined at this level, will be pulled from the Adunit level.
+|video.w| Required | Integer | The video player size width in pixels that will be passed to demand partners.
+|video.h| Required | Integer | The video player size height in pixels that will be passed to demand partners.
+|video.playerSize| Optional* | Integer | The video player size that will be passed to demand partners. * In the absence of `video.w` and `video.h`, this field is 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
+## Deprecation warning
+
+We are deprecating the older format
+of having `mediaType` and `sizes` at the ad unit level.
+
+Here are examples of the format.
+
+##### Older Deprecated Format
+```javascript
+var adUnits = [{
+ // ...
+
+ sizes: [
+ [300, 250],
+ [300, 600]
+ ]
+
+ // ...
+}];
+```
+
Setup Guide
===========
@@ -100,10 +106,15 @@ Setup Guide
Follow these steps to configure and add the IX module to your Prebid.js
integration.
+Both video and banner params will be read from the `adUnits[].mediaTypes.video` and `adUnits[].mediaTypes.banner` respectively.
+
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 = [{
code: 'banner-div-a',
@@ -134,21 +145,23 @@ var adUnits = [{
### 1. Add IX to the appropriate ad units
-For each size in an ad unit that IX will be bidding on, add one of the following
+For each ad unit that IX will be bidding on, add one of the following
bid objects under `adUnits[].bids`:
+- size is optional and deprecated
```javascript
{
bidder: 'ix',
params: {
siteId: '',
- size: []
+ size: [] // deprecated
}
}
```
-Set `params.siteId` and `params.size` in each bid object to the values provided
+Set `params.siteId` in the bid object to the values provided
by your IX representative.
+- `params.size` is not required anymore
**Examples**
@@ -167,14 +180,7 @@ var adUnits = [{
bids: [{
bidder: 'ix',
params: {
- siteId: '12345',
- size: [300, 250]
- }
- }, {
- bidder: 'ix',
- params: {
- siteId: '12345',
- size: [300, 600]
+ siteId: '12345'
}
}]
}];
@@ -185,35 +191,30 @@ var adUnits = [{
code: 'video-div-a',
mediaTypes: {
video: {
+ // Preferred location for openrtb v2.5 compatible video obj
context: 'instream',
- playerSize: [
- [300, 250],
- [300, 600]
- ]
+ playerSize: [300, 250],
+ mimes: [
+ 'video/mp4',
+ 'video/webm'
+ ],
+ minduration: 0,
+ maxduration: 60,
+ protocols: [6]
}
},
bids: [{
bidder: 'ix',
params: {
- siteId: '12345',
- size: [300, 250],
- video: {
- mimes: [
- 'video/mp4',
- 'video/webm'
- ],
- minduration: 0,
- maxduration: 60,
- protocols: [6]
- }
+ siteId: '12345'
}
}, {
bidder: 'ix',
params: {
siteId: '12345',
- size: [300, 600],
video: {
// openrtb v2.5 compatible video obj
+ // If required, use this to override mediaTypes.video.XX properties
}
}
}]
@@ -231,7 +232,14 @@ var adUnits = [{
mediaTypes: {
video: {
context: 'outstream',
- playerSize: [[300, 250]]
+ playerSize: [300, 250],
+ mimes: [
+ 'video/mp4',
+ 'video/webm'
+ ],
+ minduration: 0,
+ maxduration: 60,
+ protocols: [6]
}
},
renderer: {
@@ -244,15 +252,8 @@ var adUnits = [{
bidder: 'ix',
params: {
siteId: '12345',
- size: [300, 250],
video: {
- mimes: [
- 'video/mp4',
- 'video/webm'
- ],
- minduration: 0,
- maxduration: 60,
- protocols: [6]
+ // If required, use this to override mediaTypes.video.XX properties
}
}
}]
@@ -413,11 +414,9 @@ FAQs
### Why do I have to input size in `adUnits[].bids[].params` for IX when the size is already in the ad unit?
-There is one important reason why we recommend it:
+No, only `siteId` is required.
-1. An IX site ID is recommended to map to a single size, whereas an ad unit can have multiple
-sizes. To ensure that the right site ID is mapped to the correct size in the ad unit,
-we require the size to be explicitly stated or our bidder will auto assign the site ID to sizes that are not assigned.
+The `size` parameter is no longer a required field, the `siteId` will now be associated with all the sizes in the ad unit.
### How do I view IX's bid request in the network?
diff --git a/modules/jcmBidAdapter.js b/modules/jcmBidAdapter.js
deleted file mode 100644
index c8d2f8bdd52..00000000000
--- a/modules/jcmBidAdapter.js
+++ /dev/null
@@ -1,89 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-const BIDDER_CODE = 'jcm';
-const URL = 'https://media.adfrontiers.com/pq'
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['jcarter'],
- isBidRequestValid: function(bid) {
- return !!(bid.params && bid.params.siteId && bid.bidId);
- },
-
- buildRequests: function(validBidRequests) {
- var BidRequestStr = {
- bids: []
- };
-
- for (var i = 0; i < validBidRequests.length; i++) {
- var adSizes = '';
- var bid = validBidRequests[i];
- for (var x = 0; x < bid.sizes.length; x++) {
- adSizes += utils.parseGPTSingleSizeArray(bid.sizes[x]);
- if (x !== (bid.sizes.length - 1)) {
- adSizes += ',';
- }
- }
-
- BidRequestStr.bids.push({
- 'callbackId': bid.bidId,
- 'siteId': bid.params.siteId,
- 'adSizes': adSizes,
- });
- }
-
- var JSONStr = JSON.stringify(BidRequestStr);
- var dataStr = 't=hb&ver=1.0&compact=true&bids=' + encodeURIComponent(JSONStr);
-
- return {
- method: 'GET',
- url: URL,
- data: dataStr
- }
- },
-
- interpretResponse: function(serverResponse) {
- const bidResponses = [];
- serverResponse = serverResponse.body;
- // loop through serverResponses
- if (serverResponse) {
- if (serverResponse.bids) {
- var bids = serverResponse.bids;
- for (var i = 0; i < bids.length; i++) {
- var bid = bids[i];
- const bidResponse = {
- requestId: bid.callbackId,
- bidderCode: spec.code,
- cpm: bid.cpm,
- width: bid.width,
- height: bid.height,
- creativeId: bid.creativeId,
- currency: 'USD',
- netRevenue: bid.netRevenue,
- ttl: bid.ttl,
- ad: decodeURIComponent(bid.ad.replace(/\+/g, '%20'))
- };
- bidResponses.push(bidResponse);
- };
- };
- }
- return bidResponses;
- },
-
- getUserSyncs: function(syncOptions) {
- if (syncOptions.iframeEnabled) {
- return [{
- type: 'iframe',
- url: 'https://media.adfrontiers.com/hb/jcm_usersync.html'
- }];
- }
- if (syncOptions.image) {
- return [{
- type: 'image',
- url: 'https://media.adfrontiers.com/hb/jcm_usersync.png'
- }];
- }
- }
-}
-
-registerBidder(spec);
diff --git a/modules/jixieBidAdapter.js b/modules/jixieBidAdapter.js
index 7c6e0027482..db6c9032e65 100644
--- a/modules/jixieBidAdapter.js
+++ b/modules/jixieBidAdapter.js
@@ -240,6 +240,16 @@ export const spec = {
let rendererScript = (oneBid.osparams.script ? oneBid.osparams.script : JX_OUTSTREAM_RENDERER_URL);
bnd.renderer = createRenderer_(oneBid, rendererScript, jxOutstreamRender_);
}
+ // a note on advertiserDomains: our adserver is not responding in
+ // openRTB-type json. so there is no need to copy from 'adomain' over
+ // to meta: advertiserDomains
+ // However, we will just make sure the property is there.
+ if (!bnd.meta) {
+ bnd.meta = {};
+ }
+ if (!bnd.meta.advertiserDomains) {
+ bnd.meta.advertiserDomains = [];
+ }
bidResponses.push(bnd);
});
if (response.body.setids) {
diff --git a/modules/justpremiumBidAdapter.js b/modules/justpremiumBidAdapter.js
index 1f84feee7d1..da30ee16427 100644
--- a/modules/justpremiumBidAdapter.js
+++ b/modules/justpremiumBidAdapter.js
@@ -2,12 +2,14 @@ import { registerBidder } from '../src/adapters/bidderFactory.js'
import { deepAccess } from '../src/utils.js';
const BIDDER_CODE = 'justpremium'
+const GVLID = 62
const ENDPOINT_URL = 'https://pre.ads.justpremium.com/v/2.0/t/xhr'
const JP_ADAPTER_VERSION = '1.7'
const pixels = []
export const spec = {
code: BIDDER_CODE,
+ gvlid: GVLID,
time: 60000,
isBidRequestValid: (bid) => {
@@ -90,7 +92,10 @@ export const spec = {
netRevenue: true,
currency: bid.currency || 'USD',
ttl: bid.ttl || spec.time,
- format: bid.format
+ format: bid.format,
+ meta: {
+ advertiserDomains: bid.adomain && bid.adomain.length > 0 ? bid.adomain : []
+ }
}
bidResponses.push(bidResponse)
}
diff --git a/modules/komoonaBidAdapter.js b/modules/komoonaBidAdapter.js
deleted file mode 100644
index 6adc0eb1984..00000000000
--- a/modules/komoonaBidAdapter.js
+++ /dev/null
@@ -1,121 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'komoona';
-const ENDPOINT = 'https://bidder.komoona.com/v1/GetSBids';
-const USYNCURL = 'https://s.komoona.com/sync/usync.html';
-
-export const spec = {
- code: BIDDER_CODE,
-
- /**
- * Determines whether or not the given bid request is valid. Valid bid request must have placementId and hbid
- *
- * @param {BidRequest} bid The bid params to validate.
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: bid => {
- return !!(bid && bid.params && bid.params.placementId && bid.params.hbid);
- },
- /**
- * 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 => {
- const tags = validBidRequests.map(bid => {
- // map each bid id to bid object to retrieve adUnit code in callback
- let tag = {
- uuid: bid.bidId,
- sizes: bid.sizes,
- trid: bid.transactionId,
- hbid: bid.params.hbid,
- placementid: bid.params.placementId
- };
-
- // add floor price if specified (not mandatory)
- if (bid.params.floorPrice) {
- tag.floorprice = bid.params.floorPrice;
- }
-
- return tag;
- });
-
- // Komoona server config
- const time = new Date().getTime();
- const kbConf = {
- ts_as: time,
- hb_placements: [],
- hb_placement_bidids: {},
- hb_floors: {},
- cb: _generateCb(time),
- tz: new Date().getTimezoneOffset(),
- };
-
- validBidRequests.forEach(bid => {
- kbConf.hdbdid = kbConf.hdbdid || bid.params.hbid;
- kbConf.encode_bid = kbConf.encode_bid || bid.params.encode_bid;
- kbConf.hb_placement_bidids[bid.params.placementId] = bid.bidId;
- if (bid.params.floorPrice) {
- kbConf.hb_floors[bid.params.placementId] = bid.params.floorPrice;
- }
- kbConf.hb_placements.push(bid.params.placementId);
- });
-
- let payload = {};
- if (!utils.isEmpty(tags)) {
- payload = { bids: [...tags], kbConf: kbConf };
- }
-
- return {
- method: 'POST',
- url: ENDPOINT,
- data: JSON.stringify(payload)
- };
- },
- /**
- * Unpack the response from the server into a list of bids.
- *
- * @param {*} response A successful response from the server.
- * @return {Bid[]} An array of bids which were nested inside the server.
- */
- interpretResponse: (response, request) => {
- const bidResponses = [];
- try {
- if (response.body && response.body.bids) {
- response.body.bids.forEach(bid => {
- // The bid ID. Used to tie this bid back to the request.
- bid.requestId = bid.uuid;
- // The creative payload of the returned bid.
- bid.ad = bid.creative;
- bidResponses.push(bid);
- });
- }
- } catch (error) {
- utils.logError(error);
- }
- return bidResponses;
- },
- /**
- * Register User Sync.
- */
- getUserSyncs: syncOptions => {
- if (syncOptions.iframeEnabled) {
- return [{
- type: 'iframe',
- url: USYNCURL
- }];
- }
- }
-};
-
-/**
-* Generated cache baster value to be sent to bid server
-* @param {*} time current time to use for creating cb.
-*/
-function _generateCb(time) {
- return Math.floor((time % 65536) + (Math.floor(Math.random() * 65536) * 65536));
-}
-
-registerBidder(spec);
diff --git a/modules/krushmediaBidAdapter.js b/modules/krushmediaBidAdapter.js
deleted file mode 100644
index de1cce503e3..00000000000
--- a/modules/krushmediaBidAdapter.js
+++ /dev/null
@@ -1,123 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'krushmedia';
-const AD_URL = 'https://ads4.krushmedia.com/?c=rtb&m=hb';
-const SYNC_URL = 'https://cs.krushmedia.com/html?src=pbjs'
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId ||
- !bid.ttl || !bid.currency) {
- return false;
- }
- switch (bid.mediaType) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- return Boolean(bid.native && bid.native.impressionTrackers);
- default:
- return false;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(parseInt(bid.params.key)));
- },
-
- buildRequests: (validBidRequests = [], bidderRequest) => {
- let winTop = window;
- let location;
- try {
- location = new URL(bidderRequest.refererInfo.referer)
- winTop = window.top;
- } catch (e) {
- location = winTop.location;
- utils.logMessage(e);
- };
-
- const placements = [];
- const request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language.split('-')[0] : '',
- 'secure': 1,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
-
- if (bidderRequest) {
- if (bidderRequest.uspConsent) {
- request.ccpa = bidderRequest.uspConsent;
- }
- if (bidderRequest.gdprConsent) {
- request.gdpr = bidderRequest.gdprConsent
- }
- }
-
- const len = validBidRequests.length;
- for (let i = 0; i < len; i++) {
- const bid = validBidRequests[i];
- const placement = {
- key: bid.params.key,
- bidId: bid.bidId,
- traffic: bid.params.traffic || BANNER,
- schain: bid.schain || {},
- };
-
- if (bid.mediaTypes && bid.mediaTypes[BANNER] && bid.mediaTypes[BANNER].sizes) {
- placement.sizes = bid.mediaTypes[BANNER].sizes;
- } else if (bid.mediaTypes && bid.mediaTypes[VIDEO] && bid.mediaTypes[VIDEO].playerSize) {
- placement.wPlayer = bid.mediaTypes[VIDEO].playerSize[0];
- placement.hPlayer = bid.mediaTypes[VIDEO].playerSize[1];
- } else if (bid.mediaTypes && bid.mediaTypes[NATIVE]) {
- placement.native = bid.mediaTypes[NATIVE];
- }
- placements.push(placement);
- }
-
- return {
- method: 'POST',
- url: AD_URL,
- data: request
- };
- },
-
- interpretResponse: (serverResponse) => {
- let response = [];
- for (let i = 0; i < serverResponse.body.length; i++) {
- let resItem = serverResponse.body[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- return response;
- },
-
- getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => {
- let syncUrl = SYNC_URL
- if (gdprConsent && gdprConsent.consentString) {
- if (typeof gdprConsent.gdprApplies === 'boolean') {
- syncUrl += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
- } else {
- syncUrl += `&gdpr=0&gdpr_consent=${gdprConsent.consentString}`;
- }
- }
- if (uspConsent && uspConsent.consentString) {
- syncUrl += `&ccpa_consent=${uspConsent.consentString}`;
- }
- return [{
- type: 'iframe',
- url: syncUrl
- }];
- }
-};
-
-registerBidder(spec);
diff --git a/modules/kubientBidAdapter.js b/modules/kubientBidAdapter.js
index 8f6ea53ecce..6751a8a567c 100644
--- a/modules/kubientBidAdapter.js
+++ b/modules/kubientBidAdapter.js
@@ -1,48 +1,80 @@
import {registerBidder} from '../src/adapters/bidderFactory.js';
-import {BANNER} from '../src/mediaTypes.js';
+import {BANNER, VIDEO} from '../src/mediaTypes.js';
import * as utils from '../src/utils.js';
const BIDDER_CODE = 'kubient';
-const END_POINT = 'https://kssp.kbntx.ch/pbjs';
-const VERSION = '1.0';
+const END_POINT = 'https://kssp.kbntx.ch/kubprebidjs';
+const VERSION = '1.1';
const VENDOR_ID = 794;
export const spec = {
code: BIDDER_CODE,
gvlid: VENDOR_ID,
- supportedMediaTypes: [BANNER],
+ supportedMediaTypes: [ BANNER, VIDEO ],
isBidRequestValid: function (bid) {
- return !!(bid && bid.params);
+ return !!(
+ bid &&
+ bid.params &&
+ bid.params.zoneid &&
+ ((!bid.mediaTypes.video) || (bid.mediaTypes.video && bid.mediaTypes.video.playerSize && bid.mediaTypes.video.mimes && bid.mediaTypes.video.protocols))
+ );
},
buildRequests: function (validBidRequests, bidderRequest) {
if (!validBidRequests || !bidderRequest) {
return;
}
- const result = validBidRequests.map(function (bid) {
+ return validBidRequests.map(function (bid) {
+ let floor = 0.0;
+ if (typeof bid.getFloor === 'function') {
+ const mediaType = (Object.keys(bid.mediaTypes).length == 1) ? Object.keys(bid.mediaTypes)[0] : '*';
+ const sizes = bid.sizes || '*';
+ const floorInfo = bid.getFloor({currency: 'USD', mediaType: mediaType, size: sizes});
+ if (typeof floorInfo === 'object' && floorInfo.currency === 'USD' && !isNaN(parseFloat(floorInfo.floor))) {
+ floor = parseFloat(floorInfo.floor);
+ }
+ }
+
+ let adSlot = {
+ bidId: bid.bidId,
+ zoneId: bid.params.zoneid || '',
+ floor: floor || 0.0
+ };
+
+ if (bid.mediaTypes.banner) {
+ adSlot.banner = bid.mediaTypes.banner;
+ }
+
+ if (bid.mediaTypes.video) {
+ adSlot.video = bid.mediaTypes.video;
+ }
+
+ if (bid.schain) {
+ adSlot.schain = bid.schain;
+ }
+
let data = {
v: VERSION,
requestId: bid.bidderRequestId,
- adSlots: [{
- bidId: bid.bidId,
- zoneId: bid.params.zoneid || '',
- floor: bid.params.floor || 0.0,
- sizes: bid.sizes || [],
- schain: bid.schain || {},
- mediaTypes: bid.mediaTypes
- }],
- referer: (bidderRequest.refererInfo && bidderRequest.refererInfo.referer) ? bidderRequest.refererInfo.referer : null,
+ adSlots: [adSlot],
tmax: bidderRequest.timeout,
gdpr: (bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) ? 1 : 0,
- consent: (bidderRequest.gdprConsent && bidderRequest.gdprConsent.consentString) ? bidderRequest.gdprConsent.consentString : null,
consentGiven: kubientGetConsentGiven(bidderRequest.gdprConsent),
uspConsent: bidderRequest.uspConsent
};
+
+ if (bidderRequest.refererInfo && bidderRequest.refererInfo.referer) {
+ data.referer = bidderRequest.refererInfo.referer
+ }
+
+ if (bidderRequest.gdprConsent && bidderRequest.gdprConsent.consentString) {
+ data.consent = bidderRequest.gdprConsent.consentString
+ }
+
return {
method: 'POST',
url: END_POINT,
data: JSON.stringify(data)
};
});
- return result;
},
interpretResponse: function interpretResponse(serverResponse, request) {
if (!serverResponse || !serverResponse.body || !serverResponse.body.seatbid) {
@@ -52,7 +84,7 @@ export const spec = {
serverResponse.body.seatbid.forEach(seatbid => {
let bids = seatbid.bid || [];
bids.forEach(bid => {
- bidResponses.push({
+ const bidResponse = {
requestId: bid.bidId,
cpm: bid.price,
currency: bid.cur,
@@ -61,8 +93,17 @@ export const spec = {
creativeId: bid.creativeId,
netRevenue: bid.netRevenue,
ttl: bid.ttl,
- ad: bid.adm
- });
+ ad: bid.adm,
+ meta: {}
+ };
+ if (bid.meta && bid.meta.adomain && utils.isArray(bid.meta.adomain)) {
+ bidResponse.meta.advertiserDomains = bid.meta.adomain;
+ }
+ if (bid.mediaType === VIDEO) {
+ bidResponse.mediaType = VIDEO;
+ bidResponse.vastXml = bid.adm;
+ }
+ bidResponses.push(bidResponse);
});
});
return bidResponses;
diff --git a/modules/kubientBidAdapter.md b/modules/kubientBidAdapter.md
index 9f3e1d5f52e..a45d26dbc31 100644
--- a/modules/kubientBidAdapter.md
+++ b/modules/kubientBidAdapter.md
@@ -6,21 +6,56 @@
# Description
-Connects to Kubient KSSP demand source to fetch bids.
+Connects to Kubient KSSP demand source to fetch bids. Banners and Video supported
-# Test Parameters
+# Banner Test Parameters
+```
+var adUnits = [
+ {
+ code: 'banner-ad-unit',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 100]]
+ }
+ },
+ bids: [{
+ bidder: 'kubient',
+ params: {
+ zoneid: "5fbb948f1e22b",
+ }
+ }]
+ }
+];
+
+# Video Test Parameters
+
+var adUnits = [
+ {
+ code: 'video-ad-unit',
+ mediaTypes: {
+ video: {
+ playerSize: [300, 250], // required
+ context: 'instream', // required
+ mimes: ['video/mp4','video/x-flv'], // required
+ protocols: [ 2, 3 ], // required, set at least 1 value in array
+ placement: 1, // optional, defaults to 2 when context = outstream
+ api: [ 1, 2 ], // optional
+ skip: 0, // optional
+ minduration: 5, // optional
+ maxduration: 30, // optional
+ playbackmethod: [1,3], // optional
+ battr: [ 13, 14 ], // optional
+ linearity: 1, // optional
+ minbitrate: 10, // optional
+ maxbitrate: 10 // optional
+ }
+ },
+ bids: [{
+ bidder: 'kubient',
+ params: {
+ zoneid: "60ad1c0b35864",
+ }
+ }]
+ }
+];
```
- var adUnits = [{
- code: 'banner-ad-div',
- mediaTypes: {
- banner: {
- sizes: [[300, 250],[728, 90]],
- }
- },
- bids: [{
- "bidder": "kubient",
- "params": {
- "zoneid": "5fbb948f1e22b",
- }
- }]
- }];
diff --git a/modules/lemmaBidAdapter.js b/modules/lemmaBidAdapter.js
deleted file mode 100644
index c7440743d2c..00000000000
--- a/modules/lemmaBidAdapter.js
+++ /dev/null
@@ -1,442 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-
-var BIDDER_CODE = 'lemma';
-var LOG_WARN_PREFIX = 'LEMMA: ';
-var ENDPOINT = 'https://ads.lemmatechnologies.com/lemma/servad';
-var USER_SYNC = 'https://sync.lemmatechnologies.com/js/usersync.html?';
-var DEFAULT_CURRENCY = 'USD';
-var AUCTION_TYPE = 2;
-var DEFAULT_TMAX = 300;
-var DEFAULT_NET_REVENUE = false;
-var pubId = 0;
-var adunitId = 0;
-
-export var spec = {
-
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO],
-
- isBidRequestValid: bid => {
- if (bid && bid.params) {
- if (!utils.isNumber(bid.params.pubId)) {
- utils.logWarn(LOG_WARN_PREFIX + 'Error: publisherId is mandatory and cannot be string. Call to OpenBid will not be sent for ad unit: ' + JSON.stringify(bid));
- return false;
- }
- if (!bid.params.adunitId) {
- utils.logWarn(LOG_WARN_PREFIX + 'Error: adUnitId is mandatory. Call to OpenBid will not be sent for ad unit: ' + JSON.stringify(bid));
- return false;
- }
- // video ad validation
- if (bid.params.hasOwnProperty('video')) {
- if (!bid.params.video.hasOwnProperty('mimes') || !utils.isArray(bid.params.video.mimes) || bid.params.video.mimes.length === 0) {
- utils.logWarn(LOG_WARN_PREFIX + 'Error: For video ads, mimes is mandatory and must specify atlease 1 mime value. Call to OpenBid will not be sent for ad unit:' + JSON.stringify(bid));
- return false;
- }
- }
- return true;
- }
- return false;
- },
- buildRequests: (bidRequests, bidderRequest) => {
- var refererInfo;
- if (bidderRequest && bidderRequest.refererInfo) {
- refererInfo = bidderRequest.refererInfo;
- }
- var conf = _initConf(refererInfo);
- const request = oRTBTemplate(bidRequests, conf);
- if (request.imp.length == 0) {
- return;
- }
- setOtherParams(bidderRequest, request);
- const endPoint = endPointURL(bidRequests);
- return {
- method: 'POST',
- url: endPoint,
- data: JSON.stringify(request),
- };
- },
- interpretResponse: (response, request) => {
- return parseRTBResponse(request, response.body);
- },
- getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent) => {
- let syncurl = USER_SYNC + 'pid=' + pubId;
- if (syncOptions.iframeEnabled) {
- return [{
- type: 'iframe',
- url: syncurl
- }];
- } else {
- utils.logWarn(LOG_WARN_PREFIX + 'Please enable iframe based user sync.');
- }
- },
-};
-
-function _initConf(refererInfo) {
- var conf = {};
- conf.pageURL = (refererInfo && refererInfo.referer) ? refererInfo.referer : window.location.href;
- if (refererInfo && refererInfo.referer) {
- conf.refURL = refererInfo.referer;
- } else {
- conf.refURL = '';
- }
- return conf;
-}
-
-function _setFloor(impObj, bid) {
- let bidFloor = -1;
- // get lowest floor from floorModule
- if (typeof bid.getFloor === 'function') {
- [BANNER, VIDEO].forEach(mediaType => {
- if (impObj.hasOwnProperty(mediaType)) {
- let floorInfo = bid.getFloor({ currency: impObj.bidfloorcur, mediaType: mediaType, size: '*' });
- if (typeof floorInfo === 'object' && floorInfo.currency === impObj.bidfloorcur && !isNaN(parseInt(floorInfo.floor))) {
- let mediaTypeFloor = parseFloat(floorInfo.floor);
- bidFloor = (bidFloor == -1 ? mediaTypeFloor : Math.min(mediaTypeFloor, bidFloor))
- }
- }
- });
- }
- // get highest from impObj.bidfllor and floor from floor module
- // as we are using Math.max, it is ok if we have not got any floor from floorModule, then value of bidFloor will be -1
- if (impObj.bidfloor) {
- bidFloor = Math.max(bidFloor, impObj.bidfloor)
- }
-
- // assign value only if bidFloor is > 0
- impObj.bidfloor = ((!isNaN(bidFloor) && bidFloor > 0) ? bidFloor : undefined);
-}
-
-function parseRTBResponse(request, response) {
- var bidResponses = [];
- try {
- if (response.seatbid) {
- var currency = response.curr || DEFAULT_CURRENCY;
- var seatbid = response.seatbid;
- seatbid.forEach(seatbidder => {
- var bidder = seatbidder.bid;
- bidder.forEach(bid => {
- var req = parse(request.data);
- var newBid = {
- requestId: bid.impid,
- cpm: parseFloat(bid.price).toFixed(2),
- width: bid.w,
- height: bid.h,
- creativeId: bid.crid,
- currency: currency,
- netRevenue: DEFAULT_NET_REVENUE,
- ttl: 300,
- referrer: req.site.ref,
- ad: bid.adm
- };
- if (bid.dealid) {
- newBid.dealId = bid.dealid;
- }
- if (req.imp && req.imp.length > 0) {
- req.imp.forEach(robj => {
- if (bid.impid === robj.id) {
- _checkMediaType(bid.adm, newBid);
- switch (newBid.mediaType) {
- case BANNER:
- break;
- case VIDEO:
- newBid.width = bid.hasOwnProperty('w') ? bid.w : robj.video.w;
- newBid.height = bid.hasOwnProperty('h') ? bid.h : robj.video.h;
- newBid.vastXml = bid.adm;
- break;
- }
- }
- });
- }
- bidResponses.push(newBid);
- });
- });
- }
- } catch (error) {
- utils.logError(LOG_WARN_PREFIX, 'ERROR ', error);
- }
- return bidResponses;
-}
-
-function oRTBTemplate(bidRequests, conf) {
- try {
- var oRTBObject = {
- id: '' + new Date().getTime(),
- at: AUCTION_TYPE,
- tmax: DEFAULT_TMAX,
- cur: [DEFAULT_CURRENCY],
- imp: _getImpressionArray(bidRequests),
- user: {},
- ext: {}
- };
- var bid = bidRequests[0];
- var app = _getAppObject(bid);
- var site = _getSiteObject(bid, conf);
- var device = _getDeviceObject(bid);
- if (app) {
- oRTBObject.app = app;
- }
- if (site) {
- oRTBObject.site = site;
- }
- if (device) {
- oRTBObject.device = device;
- }
- return oRTBObject;
- } catch (ex) {
- utils.logError(LOG_WARN_PREFIX, 'ERROR ', ex);
- }
-}
-
-function _getImpressionArray(request) {
- var impArray = [];
- var map = request.map(bid => _getImpressionObject(bid));
- if (map) {
- map.forEach(o => {
- if (o) {
- impArray.push(o);
- }
- });
- }
- return impArray;
-}
-
-function endPointURL(request) {
- var params = request && request[0].params ? request[0].params : null;
- if (params) {
- pubId = params.pubId ? params.pubId : 0;
- adunitId = params.adunitId ? params.adunitId : 0;
- return ENDPOINT + '?pid=' + pubId + '&aid=' + adunitId;
- }
- return null;
-}
-
-function _getDomain(url) {
- var a = document.createElement('a');
- a.setAttribute('href', url);
- return a.hostname;
-}
-
-function _getSiteObject(request, conf) {
- var params = request && request.params ? request.params : null;
- if (params) {
- pubId = params.pubId ? params.pubId : '0';
- var siteId = params.siteId ? params.siteId : '0';
- var appParams = params.app;
- if (!appParams) {
- return {
- publisher: {
- id: pubId.toString()
- },
- domain: _getDomain(conf.pageURL),
- id: siteId.toString(),
- ref: conf.refURL,
- page: conf.pageURL
- };
- }
- }
- return null;
-}
-
-function _getAppObject(request) {
- var params = request && request.params ? request.params : null;
- if (params) {
- pubId = params.pubId ? params.pubId : 0;
- var appParams = params.app;
- if (appParams) {
- return {
- publisher: {
- id: pubId.toString(),
- },
- id: appParams.id,
- name: appParams.name,
- bundle: appParams.bundle,
- storeurl: appParams.storeUrl,
- domain: appParams.domain,
- cat: appParams.categories,
- pagecat: appParams.page_category
- };
- }
- }
- return null;
-}
-
-function _getDeviceObject(request) {
- var params = request && request.params ? request.params : null;
- if (params) {
- return {
- dnt: utils.getDNT() ? 1 : 0,
- ua: navigator.userAgent,
- language: (navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage),
- w: (window.screen.width || window.innerWidth),
- h: (window.screen.height || window.innerHeigh),
- geo: {
- country: params.country,
- lat: params.latitude,
- lon: params.longitude,
- region: params.region,
- city: params.city,
- zip: params.zip
- },
- ip: params.ip,
- devicetype: params.device_type,
- ifa: params.ifa,
- };
- }
- return null;
-}
-
-function setOtherParams(request, ortbRequest) {
- var params = request && request.params ? request.params : null;
- if (params) {
- ortbRequest.tmax = params.tmax;
- ortbRequest.bcat = params.bcat;
- }
-}
-
-function _getSizes(request) {
- if (request.sizes && utils.isArray(request.sizes[0]) && request.sizes[0].length > 0) {
- return request.sizes[0];
- }
- return null;
-}
-
-function _getBannerRequest(bid) {
- var bObj;
- var adFormat = [];
- if (bid.mediaType === 'banner' || utils.deepAccess(bid, 'mediaTypes.banner')) {
- var params = bid ? bid.params : null;
- var bannerData = params.banner;
- var sizes = _getSizes(bid) || [];
- if (sizes && sizes.length == 0) {
- sizes = bid.mediaTypes.banner.sizes[0];
- }
- if (sizes && sizes.length > 0) {
- bObj = {};
- bObj.w = sizes[0];
- bObj.h = sizes[1];
- bObj.pos = 0;
- if (bannerData) {
- bObj = utils.deepClone(bannerData);
- }
- sizes = bid.mediaTypes.banner.sizes;
- if (sizes.length > 0) {
- adFormat = [];
- sizes.forEach(function(size) {
- if (size.length > 1) {
- adFormat.push({ w: size[0], h: size[1] });
- }
- });
- if (adFormat.length > 0) {
- bObj.format = adFormat;
- }
- }
- } else {
- utils.logWarn(LOG_WARN_PREFIX + 'Error: mediaTypes.banner.sizes missing for adunit: ' + bid.params.adunitId);
- }
- }
- return bObj;
-}
-
-function _getVideoRequest(bid) {
- var vObj;
- if (bid.mediaType === 'video' || utils.deepAccess(bid, 'mediaTypes.video')) {
- var params = bid ? bid.params : null;
- var sizes = _getSizes(bid) || [];
- if (sizes && sizes.length == 0) {
- sizes = bid.mediaTypes && bid.mediaTypes.video ? bid.mediaTypes.video.playerSize : [];
- }
- if (sizes && sizes.length > 0) {
- var videoData = params.video;
- vObj = {};
- if (videoData) {
- vObj = utils.deepClone(videoData);
- }
- vObj.w = sizes[0];
- vObj.h = sizes[1];
- } else {
- utils.logWarn(LOG_WARN_PREFIX + 'Error: mediaTypes.video.sizes missing for adunit: ' + bid.params.adunitId);
- }
- }
- return vObj;
-}
-
-function _getImpressionObject(bid) {
- var impression = {};
- var bObj;
- var vObj;
- var sizes = bid.hasOwnProperty('sizes') ? bid.sizes : [];
- var mediaTypes = '';
- var format = [];
- var params = bid && bid.params ? bid.params : null;
- impression = {
- id: bid.bidId,
- tagid: params.adunitId ? params.adunitId.toString() : undefined,
- secure: window.location.protocol === 'https:' ? 1 : 0,
- bidfloorcur: params.currency ? params.currency : DEFAULT_CURRENCY
- };
- if (params.bidFloor) {
- impression.bidfloor = params.bidFloor;
- }
- if (bid.hasOwnProperty('mediaTypes')) {
- for (mediaTypes in bid.mediaTypes) {
- switch (mediaTypes) {
- case BANNER:
- bObj = _getBannerRequest(bid);
- if (bObj) {
- impression.banner = bObj;
- }
- break;
- case VIDEO:
- vObj = _getVideoRequest(bid);
- if (vObj) {
- impression.video = vObj;
- }
- break;
- }
- }
- } else {
- bObj = {
- pos: 0,
- w: sizes && sizes[0] ? sizes[0][0] : 0,
- h: sizes && sizes[0] ? sizes[0][1] : 0,
- };
- if (utils.isArray(sizes) && sizes.length > 1) {
- sizes = sizes.splice(1, sizes.length - 1);
- sizes.forEach(size => {
- format.push({
- w: size[0],
- h: size[1]
- });
- });
- bObj.format = format;
- }
- impression.banner = bObj;
- }
- _setFloor(impression, bid);
- return impression.hasOwnProperty(BANNER) ||
- impression.hasOwnProperty(VIDEO) ? impression : undefined;
-}
-
-function parse(rawResp) {
- try {
- if (rawResp) {
- return JSON.parse(rawResp);
- }
- } catch (ex) {
- utils.logError(LOG_WARN_PREFIX, 'ERROR', ex);
- }
- return null;
-}
-
-function _checkMediaType(adm, newBid) {
- // Create a regex here to check the strings
- var videoRegex = new RegExp(/VAST.*version/);
- if (videoRegex.test(adm)) {
- newBid.mediaType = VIDEO;
- } else {
- newBid.mediaType = BANNER;
- }
-}
-registerBidder(spec);
diff --git a/modules/lifestreetBidAdapter.js b/modules/lifestreetBidAdapter.js
deleted file mode 100644
index 4317eb8b82e..00000000000
--- a/modules/lifestreetBidAdapter.js
+++ /dev/null
@@ -1,139 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'lifestreet';
-const ADAPTER_VERSION = '$prebid.version$';
-
-const urlTemplate = template`https://ads.lfstmedia.com/gate/${'adapter'}/${'slot'}?adkey=${'adkey'}&ad_size=${'ad_size'}&__location=${'location'}&__referrer=${'referrer'}&__wn=${'wn'}&__sf=${'sf'}&__fif=${'fif'}&__if=${'if'}&__stamp=${'stamp'}&__pp=1&__hb=1&_prebid_json=1&__gz=1&deferred_format=vast_2_0,vast_3_0&__hbver=${'hbver'}`;
-
-/**
- * A helper function for template to generate string from boolean
- */
-function boolToString(value) {
- return value ? '1' : '0';
-}
-
-/**
- * A helper function to form URL from the template
- */
-function template(strings, ...keys) {
- return function(...values) {
- let dict = values[values.length - 1] || {};
- let result = [strings[0]];
- keys.forEach(function(key, i) {
- let value = utils.isInteger(key) ? values[key] : dict[key];
- result.push(value, strings[i + 1]);
- });
- return result.join('');
- };
-}
-
-/**
- * Creates a bid requests for a given bid.
- *
- * @param {BidRequest} bid The bid params to use for formatting a request
- */
-function formatBidRequest(bid, bidderRequest = {}) {
- const {params} = bid;
- const {referer} = (bidderRequest.refererInfo || {});
- let url = urlTemplate({
- adapter: 'prebid',
- slot: params.slot,
- adkey: params.adkey,
- ad_size: params.ad_size,
- location: referer,
- referrer: referer,
- wn: boolToString(/fb_http/i.test(window.name)),
- sf: boolToString(window['sfAPI'] || window['$sf']),
- fif: boolToString(window['inDapIF'] === true),
- if: boolToString(window !== window.top),
- stamp: new Date().getTime(),
- hbver: ADAPTER_VERSION
- });
-
- if (bidderRequest.gdprConsent) {
- if (bidderRequest.gdprConsent.gdprApplies !== undefined) {
- const gdpr = '&__gdpr=' + (bidderRequest.gdprConsent.gdprApplies ? '1' : '0');
- url += gdpr;
- }
- if (bidderRequest.gdprConsent.consentString !== undefined) {
- url += `&__consent=${bidderRequest.gdprConsent.consentString}`;
- }
- }
-
- // ccpa support
- if (bidderRequest.uspConsent) {
- url += `&__us_privacy=${bidderRequest.uspConsent}`
- }
-
- return {
- method: 'GET',
- url: url,
- bidId: bid.bidId
- };
-}
-
-function isResponseValid(response) {
- return !/^\s*\{\s*"advertisementAvailable"\s*:\s*false/i.test(response.content) &&
- response.content.indexOf(' ') === -1 && (typeof response.cpm !== 'undefined') &&
- response.status === 1;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['lsm'],
- supportedMediaTypes: [BANNER, VIDEO],
-
- isBidRequestValid: (bid = {}) => {
- const {params = {}} = bid;
- return !!(params.slot && params.adkey && params.ad_size);
- },
-
- buildRequests: (validBidRequests, bidderRequest) => {
- return validBidRequests.map(bid => {
- return formatBidRequest(bid, bidderRequest)
- });
- },
-
- interpretResponse: (serverResponse, bidRequest) => {
- const bidResponses = [];
- let response = serverResponse.body;
-
- if (!isResponseValid(response)) {
- return bidResponses;
- }
-
- const bidResponse = {
- requestId: bidRequest.bidId,
- cpm: response.cpm,
- width: response.width,
- height: response.height,
- creativeId: response.creativeId,
- currency: response.currency ? response.currency : 'USD',
- netRevenue: response.netRevenue ? response.netRevenue : true,
- ttl: response.ttl ? response.ttl : 86400
- };
-
- if (response.hasOwnProperty('dealId')) {
- bidResponse.dealId = response.dealId;
- }
- if (response.content_type.indexOf('vast') > -1) {
- if (typeof response.vastUrl !== 'undefined') {
- bidResponse.vastUrl = response.vastUrl;
- } else {
- bidResponse.vastXml = response.content;
- }
-
- bidResponse.mediaType = VIDEO;
- } else {
- bidResponse.ad = response.content;
- bidResponse.mediaType = BANNER;
- }
-
- bidResponses.push(bidResponse);
- return bidResponses;
- }
-};
-
-registerBidder(spec);
diff --git a/modules/projectLimeLightBidAdapter.js b/modules/limelightDigitalBidAdapter.js
similarity index 64%
rename from modules/projectLimeLightBidAdapter.js
rename to modules/limelightDigitalBidAdapter.js
index 1beba906917..6203e22d253 100644
--- a/modules/projectLimeLightBidAdapter.js
+++ b/modules/limelightDigitalBidAdapter.js
@@ -3,7 +3,7 @@ import { BANNER, VIDEO } from '../src/mediaTypes.js';
import {ajax} from '../src/ajax.js';
import * as utils from '../src/utils.js';
-const BIDDER_CODE = 'project-limelight';
+const BIDDER_CODE = 'limelightDigital';
/**
* Determines whether or not the given bid response is valid.
@@ -12,10 +12,10 @@ const BIDDER_CODE = 'project-limelight';
* @return boolean True if this is a valid bid, and false otherwise.
*/
function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency) {
+ if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency || !bid.meta.advertiserDomains) {
return false;
}
- switch (bid.mediaType) {
+ switch (bid.meta.mediaType) {
case BANNER:
return Boolean(bid.width && bid.height && bid.ad);
case VIDEO:
@@ -26,16 +26,18 @@ function isBidResponseValid(bid) {
export const spec = {
code: BIDDER_CODE,
+ aliases: ['pll'],
supportedMediaTypes: [BANNER, VIDEO],
/**
* Determines whether or not the given bid request is valid.
*
- * @param {object} bid The bid to validate.
+ * @param {BidRequest} bid The bid params to validate.
* @return boolean True if this is a valid bid, and false otherwise.
*/
isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params);
+ return Boolean(bid.bidId && bid.params && bid.params.host && bid.params.adUnitType &&
+ (bid.params.adUnitId || bid.params.adUnitId === 0));
},
/**
@@ -57,6 +59,10 @@ export const spec = {
.map(host => buildRequest(winTop, host, placements[host].map(placement => placement.adUnit)));
},
+ /**
+ * Register bidder specific code, which will execute if a bid from this bidder won the auction
+ * @param {Bid} The bid that won the auction
+ */
onBidWon: (bid) => {
const cpm = bid.pbMg;
if (bid.nurl !== '') {
@@ -65,26 +71,26 @@ export const spec = {
cpm
);
ajax(bid.nurl, null);
- };
+ }
},
/**
* Unpack the response from the server into a list of bids.
*
- * @param {*} serverResponse A successful response from the server.
+ * @param {ServerResponse} serverResponse A successful response from the server.
* @return {Bid[]} An array of bids which were nested inside the server.
*/
- interpretResponse: (bidResponses) => {
- const res = [];
- const bidResponsesBody = bidResponses.body;
- const len = bidResponsesBody.length;
+ interpretResponse: (serverResponse, bidRequest) => {
+ const bidResponses = [];
+ const serverBody = serverResponse.body;
+ const len = serverBody.length;
for (let i = 0; i < len; i++) {
- const bid = bidResponsesBody[i];
- if (isBidResponseValid(bid)) {
- res.push(bid);
+ const bidResponse = serverBody[i];
+ if (isBidResponseValid(bidResponse)) {
+ bidResponses.push(bidResponse);
}
}
- return res;
+ return bidResponses;
},
};
@@ -104,13 +110,29 @@ function buildRequest(winTop, host, adUnits) {
}
function buildPlacement(bidRequest) {
+ let sizes;
+ if (bidRequest.mediaTypes) {
+ switch (bidRequest.params.adUnitType) {
+ case BANNER:
+ if (bidRequest.mediaTypes.banner && bidRequest.mediaTypes.banner.sizes) {
+ sizes = bidRequest.mediaTypes.banner.sizes;
+ }
+ break;
+ case VIDEO:
+ if (bidRequest.mediaTypes.video && bidRequest.mediaTypes.video.playerSize) {
+ sizes = [bidRequest.mediaTypes.video.playerSize];
+ }
+ break;
+ }
+ }
+ sizes = (sizes || []).concat(bidRequest.sizes || []).filter(utils.uniques);
return {
host: bidRequest.params.host,
adUnit: {
id: bidRequest.params.adUnitId,
bidId: bidRequest.bidId,
transactionId: bidRequest.transactionId,
- sizes: bidRequest.sizes.map(size => {
+ sizes: sizes.map(size => {
return {
width: size[0],
height: size[1]
diff --git a/modules/limelightDigitalBidAdapter.md b/modules/limelightDigitalBidAdapter.md
new file mode 100644
index 00000000000..ab69ef8eaa4
--- /dev/null
+++ b/modules/limelightDigitalBidAdapter.md
@@ -0,0 +1,60 @@
+# Overview
+
+```
+Module Name: Limelight Digital Exchange Bidder Adapter
+Module Type: Bidder Adapter
+Maintainer: engineering@project-limelight.com
+```
+
+# Description
+
+Module that connects to Limelight Digital Exchange's demand sources
+
+# Test Parameters for banner
+```
+var adUnits = [{
+ code: 'placementCode',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]
+ }
+ },
+ bids: [{
+ bidder: 'limelightDigital',
+ params: {
+ host: 'exchange.ortb.net',
+ adUnitId: 0,
+ adUnitType: 'banner'
+ }
+ }]
+}];
+```
+
+# Test Parameters for video
+```
+var videoAdUnit = [{
+ code: 'video1',
+ sizes: [[300, 250]],
+ bids: [{
+ bidder: 'limelightDigital',
+ params: {
+ host: 'exchange.ortb.net',
+ adUnitId: 0,
+ adUnitType: 'video'
+ }
+ }]
+}];
+```
+
+# Configuration
+
+The Limelight Digital Exchange Bidder Adapter expects Prebid Cache(for video) to be enabled so that we can store and retrieve a single vastXml.
+
+```
+pbjs.setConfig({
+ usePrebidCache: true,
+ cache: {
+ url: 'https://prebid.adnxs.com/pbc/v1/cache'
+ }
+});
+```
diff --git a/modules/livewrappedAnalyticsAdapter.js b/modules/livewrappedAnalyticsAdapter.js
index a872a709ec9..29b57e3dd97 100644
--- a/modules/livewrappedAnalyticsAdapter.js
+++ b/modules/livewrappedAnalyticsAdapter.js
@@ -58,7 +58,8 @@ let livewrappedAnalyticsAdapter = Object.assign(adapter({EMPTYURL, ANALYTICSTYPE
lwFloor: lwFloor,
floorData: bidRequest.floorData,
auc: bidRequest.auc,
- buc: bidRequest.buc
+ buc: bidRequest.buc,
+ lw: bidRequest.lw
}
utils.logInfo(bidRequest);
@@ -83,6 +84,7 @@ let livewrappedAnalyticsAdapter = Object.assign(adapter({EMPTYURL, ANALYTICSTYPE
cache.auctions[args.auctionId].bidAdUnits[bidResponse.adUnit] =
{
sent: 0,
+ lw: bidResponse.lw,
timeStamp: cache.auctions[args.auctionId].timeStamp
};
}
@@ -184,7 +186,8 @@ function getSentRequests() {
floor: bid.lwFloor,
auctionId: auctionIdPos,
auc: bid.auc,
- buc: bid.buc
+ buc: bid.buc,
+ lw: bid.lw
});
}
});
@@ -220,7 +223,8 @@ function getResponses(gdpr, auctionIds) {
floorCur: bid.floorData ? bid.floorData.floorCurrency : undefined,
auctionId: auctionIdPos,
auc: bid.auc,
- buc: bid.buc
+ buc: bid.buc,
+ lw: bid.lw
});
}
});
@@ -255,7 +259,8 @@ function getWins(gdpr, auctionIds) {
floorCur: bid.floorData ? bid.floorData.floorCurrency : undefined,
auctionId: auctionIdPos,
auc: bid.auc,
- buc: bid.buc
+ buc: bid.buc,
+ lw: bid.lw
});
}
});
@@ -312,7 +317,8 @@ function getTimeouts(auctionIds) {
timeStamp: auction.timeStamp,
auctionId: auctionIdPos,
auc: bid.auc,
- buc: bid.buc
+ buc: bid.buc,
+ lw: bid.lw
});
}
});
@@ -333,7 +339,8 @@ function getbidAdUnits() {
bidAdUnits.push({
adUnit: adUnit,
- timeStamp: bidAdUnit.timeStamp
+ timeStamp: bidAdUnit.timeStamp,
+ lw: bidAdUnit.lw
});
}
});
diff --git a/modules/lkqdBidAdapter.js b/modules/lkqdBidAdapter.js
deleted file mode 100644
index 0f5782649ad..00000000000
--- a/modules/lkqdBidAdapter.js
+++ /dev/null
@@ -1,284 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { VIDEO } from '../src/mediaTypes.js';
-import { config } from '../src/config.js';
-
-const BIDDER_CODE = 'lkqd';
-const BID_TTL_DEFAULT = 300;
-const ENDPOINT = 'https://v.lkqd.net/ad';
-
-const PARAM_OUTPUT_DEFAULT = 'vast';
-const PARAM_EXECUTION_DEFAULT = 'any';
-const PARAM_SUPPORT_DEFAULT = 'html5';
-const PARAM_PLAYINIT_DEFAULT = 'auto';
-const PARAM_VOLUME_DEFAULT = '100';
-
-function _validateId(id) {
- if (id && typeof id !== 'undefined' && parseInt(id) > 0) {
- return true;
- }
-
- return false;
-}
-
-function isBidRequestValid(bidRequest) {
- if (bidRequest.bidder === BIDDER_CODE && typeof bidRequest.params !== 'undefined') {
- if (_validateId(bidRequest.params.siteId) && _validateId(bidRequest.params.placementId)) {
- return true;
- }
- }
-
- return false;
-}
-
-function buildRequests(validBidRequests, bidderRequest) {
- let bidRequests = [];
-
- for (let i = 0; i < validBidRequests.length; i++) {
- let bidRequest = validBidRequests[i];
-
- let sizes = [];
- // if width/height not provided to the ad unit for some reason then attempt request with default 640x480 size
- let bidRequestSizes = bidRequest.sizes;
- let bidRequestDeepSizes = utils.deepAccess(bidRequest, 'mediaTypes.video.playerSize');
- if ((!bidRequestSizes || !bidRequestSizes.length) && (!bidRequestDeepSizes || !bidRequestDeepSizes.length)) {
- utils.logWarn('Warning: Could not find valid width/height parameters on the provided adUnit');
- sizes = [[640, 480]];
- }
-
- // JWPlayer demo page uses sizes: [640,480] instead of sizes: [[640,480]] so need to handle single-layer array as well as nested arrays
- if (bidRequestSizes && bidRequestSizes.length > 0) {
- sizes = bidRequestSizes;
- if (bidRequestSizes.length === 2 && typeof bidRequestSizes[0] === 'number' && typeof bidRequestSizes[1] === 'number') {
- sizes = [bidRequestSizes];
- }
- } else if (bidRequestDeepSizes && bidRequestDeepSizes.length > 0) {
- sizes = bidRequestDeepSizes;
- if (bidRequestDeepSizes.length === 2 && typeof bidRequestDeepSizes[0] === 'number' && typeof bidRequestDeepSizes[1] === 'number') {
- sizes = [bidRequestDeepSizes];
- }
- }
-
- for (let j = 0; j < sizes.length; j++) {
- let size = sizes[j];
- let playerWidth;
- let playerHeight;
- if (size && size.length == 2) {
- playerWidth = size[0];
- playerHeight = size[1];
- } else {
- utils.logWarn('Warning: Could not determine width/height from the provided adUnit');
- }
-
- let sspUrl = ENDPOINT.concat();
- let sspData = {};
-
- // required parameters
- sspData.pid = bidRequest.params.placementId;
- sspData.sid = bidRequest.params.siteId;
- sspData.prebid = true;
-
- // optional parameters
- if (bidRequest.params.hasOwnProperty('output') && bidRequest.params.output != null) {
- sspData.output = bidRequest.params.output;
- } else {
- sspData.output = PARAM_OUTPUT_DEFAULT;
- }
- if (bidRequest.params.hasOwnProperty('execution') && bidRequest.params.execution != null) {
- sspData.execution = bidRequest.params.execution;
- } else {
- sspData.execution = PARAM_EXECUTION_DEFAULT;
- }
- if (bidRequest.params.hasOwnProperty('support') && bidRequest.params.support != null) {
- sspData.support = bidRequest.params.support;
- } else {
- sspData.support = PARAM_SUPPORT_DEFAULT;
- }
- if (bidRequest.params.hasOwnProperty('playinit') && bidRequest.params.playinit != null) {
- sspData.playinit = bidRequest.params.playinit;
- } else {
- sspData.playinit = PARAM_PLAYINIT_DEFAULT;
- }
- if (bidRequest.params.hasOwnProperty('volume') && bidRequest.params.volume != null) {
- sspData.volume = bidRequest.params.volume;
- } else {
- sspData.volume = PARAM_VOLUME_DEFAULT;
- }
- if (playerWidth) {
- sspData.width = playerWidth;
- }
- if (playerHeight) {
- sspData.height = playerHeight;
- }
- if (bidRequest.params.hasOwnProperty('vpaidmode') && bidRequest.params.vpaidmode != null) {
- sspData.vpaidmode = bidRequest.params.vpaidmode;
- }
- if (bidRequest.params.hasOwnProperty('appname') && bidRequest.params.appname != null) {
- sspData.appname = bidRequest.params.appname;
- }
- if (bidRequest.params.hasOwnProperty('bundleid') && bidRequest.params.bundleid != null) {
- sspData.bundleid = bidRequest.params.bundleid;
- }
- if (bidRequest.params.hasOwnProperty('aid') && bidRequest.params.aid != null) {
- sspData.aid = bidRequest.params.aid;
- }
- if (bidRequest.params.hasOwnProperty('idfa') && bidRequest.params.idfa != null) {
- sspData.idfa = bidRequest.params.idfa;
- }
- if (bidRequest.params.hasOwnProperty('gdpr') && bidRequest.params.gdpr != null) {
- sspData.gdpr = bidRequest.params.gdpr;
- }
- if (bidRequest.params.hasOwnProperty('gdprcs') && bidRequest.params.gdprcs != null) {
- sspData.gdprcs = bidRequest.params.gdprcs;
- }
- if (bidRequest.params.hasOwnProperty('flrd') && bidRequest.params.flrd != null) {
- sspData.flrd = bidRequest.params.flrd;
- }
- if (bidRequest.params.hasOwnProperty('flrmp') && bidRequest.params.flrmp != null) {
- sspData.flrmp = bidRequest.params.flrmp;
- }
- if (bidRequest.params.hasOwnProperty('schain') && bidRequest.params.schain != null) {
- sspData.schain = bidRequest.params.schain;
- }
- if (bidRequest.params.hasOwnProperty('placement') && bidRequest.params.placement != null) {
- sspData.placement = bidRequest.params.placement;
- }
- if (bidRequest.params.hasOwnProperty('timeout') && bidRequest.params.timeout != null) {
- sspData.timeout = bidRequest.params.timeout;
- }
- if (bidRequest.params.hasOwnProperty('dnt') && bidRequest.params.dnt != null) {
- sspData.dnt = bidRequest.params.dnt;
- }
- if (config.getConfig('coppa') === true) {
- sspData.coppa = 1;
- }
- if (bidRequest.params.hasOwnProperty('pageurl') && bidRequest.params.pageurl != null) {
- sspData.pageurl = bidRequest.params.pageurl;
- } else if (bidderRequest && bidderRequest.refererInfo) {
- sspData.pageurl = encodeURIComponent(encodeURIComponent(bidderRequest.refererInfo.referer));
- }
- if (bidRequest.params.hasOwnProperty('contentId') && bidRequest.params.contentId != null) {
- sspData.contentid = bidRequest.params.contentId;
- }
- if (bidRequest.params.hasOwnProperty('contentTitle') && bidRequest.params.contentTitle != null) {
- sspData.contenttitle = bidRequest.params.contentTitle;
- }
- if (bidRequest.params.hasOwnProperty('contentLength') && bidRequest.params.contentLength != null) {
- sspData.contentlength = bidRequest.params.contentLength;
- }
- if (bidRequest.params.hasOwnProperty('contentUrl') && bidRequest.params.contentUrl != null) {
- sspData.contenturl = bidRequest.params.contentUrl;
- }
- if (bidRequest.params.hasOwnProperty('schain') && bidRequest.params.schain) {
- sspData.schain = bidRequest.params.schain;
- }
-
- // random number to prevent caching
- sspData.rnd = Math.floor(Math.random() * 999999999);
-
- // Prebid.js required properties
- sspData.bidId = bidRequest.bidId;
- sspData.bidWidth = playerWidth;
- sspData.bidHeight = playerHeight;
-
- for (let k = 1; k <= 40; k++) {
- if (bidRequest.params.hasOwnProperty(`c${k}`) && bidRequest.params[`c${k}`]) {
- sspData[`c${k}`] = bidRequest.params[`c${k}`];
- }
- }
-
- bidRequests.push({
- method: 'GET',
- url: sspUrl,
- data: Object.keys(sspData).map(function (key) { return key + '=' + sspData[key] }).join('&') + '&'
- });
- }
- }
-
- return bidRequests;
-}
-
-function interpretResponse(serverResponse, bidRequest) {
- let bidResponses = [];
- if (serverResponse && serverResponse.body) {
- if (serverResponse.error) {
- utils.logError('Error: ' + serverResponse.error);
- return bidResponses;
- } else {
- try {
- let bidResponse = {};
- if (bidRequest && bidRequest.data && typeof bidRequest.data === 'string') {
- let sspData;
- let sspBidId;
- let sspBidWidth;
- let sspBidHeight;
- if (window.URLSearchParams) {
- sspData = new URLSearchParams(bidRequest.data);
- sspBidId = sspData.get('bidId');
- sspBidWidth = sspData.get('bidWidth');
- sspBidHeight = sspData.get('bidHeight');
- } else {
- if (bidRequest.data.indexOf('bidId=') >= 0) {
- sspBidId = bidRequest.data.substr(bidRequest.data.indexOf('bidId=') + 6, bidRequest.data.length);
- sspBidId = sspBidId.split('&')[0];
- }
- if (bidRequest.data.indexOf('bidWidth=') >= 0) {
- sspBidWidth = bidRequest.data.substr(bidRequest.data.indexOf('bidWidth=') + 9, bidRequest.data.length);
- sspBidWidth = sspBidWidth.split('&')[0];
- }
- if (bidRequest.data.indexOf('bidHeight=') >= 0) {
- sspBidHeight = bidRequest.data.substr(bidRequest.data.indexOf('bidHeight=') + 10, bidRequest.data.length);
- sspBidHeight = sspBidHeight.split('&')[0];
- }
- }
-
- if (sspBidId) {
- let sspXmlString = serverResponse.body;
- let sspXml = new window.DOMParser().parseFromString(sspXmlString, 'text/xml');
- if (sspXml && sspXml.getElementsByTagName('parsererror').length == 0) {
- let sspUrl = bidRequest.url.concat();
-
- bidResponse.requestId = sspBidId;
- bidResponse.bidderCode = BIDDER_CODE;
- bidResponse.ad = '';
- bidResponse.cpm = parseFloat(sspXml.getElementsByTagName('Pricing')[0].textContent);
- bidResponse.width = sspBidWidth;
- bidResponse.height = sspBidHeight;
- bidResponse.ttl = BID_TTL_DEFAULT;
- bidResponse.creativeId = sspXml.getElementsByTagName('Ad')[0].getAttribute('id');
- bidResponse.currency = sspXml.getElementsByTagName('Pricing')[0].getAttribute('currency');
- bidResponse.netRevenue = true;
- bidResponse.vastUrl = sspUrl;
- bidResponse.vastXml = sspXmlString;
- bidResponse.mediaType = VIDEO;
-
- bidResponses.push(bidResponse);
- } else {
- utils.logError('Error: Server response contained invalid XML');
- }
- } else {
- utils.logError('Error: Could not associate bid request to server response');
- }
- } else {
- utils.logError('Error: Could not associate bid request to server response');
- }
- } catch (e) {
- utils.logError('Error: Could not interpret server response');
- }
- }
- } else {
- utils.logError('Error: No server response or server response was empty for the requested URL');
- }
-
- return bidResponses;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [VIDEO],
- isBidRequestValid,
- buildRequests,
- interpretResponse
-}
-
-registerBidder(spec);
diff --git a/modules/lockerdomeBidAdapter.js b/modules/lockerdomeBidAdapter.js
index 80c40b39f9a..4e30519c6d3 100644
--- a/modules/lockerdomeBidAdapter.js
+++ b/modules/lockerdomeBidAdapter.js
@@ -66,7 +66,10 @@ export const spec = {
currency: bid.currency,
netRevenue: bid.netRevenue,
ad: bid.ad,
- ttl: bid.ttl
+ ttl: bid.ttl,
+ meta: {
+ advertiserDomains: bid.adomain && Array.isArray(bid.adomain) ? bid.adomain : []
+ }
};
});
},
diff --git a/modules/loganBidAdapter.js b/modules/loganBidAdapter.js
deleted file mode 100644
index e55876de675..00000000000
--- a/modules/loganBidAdapter.js
+++ /dev/null
@@ -1,118 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'logan';
-const AD_URL = 'https://USeast2.logan.ai/?c=o&m=multi';
-const SYNC_URL = 'https://ssp-cookie.logan.ai/html?src=pbjs'
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId ||
- !bid.ttl || !bid.currency) {
- return false;
- }
- switch (bid.mediaType) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- return Boolean(bid.native && bid.native.impressionTrackers);
- default:
- return false;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(parseInt(bid.params.placementId)));
- },
-
- buildRequests: (validBidRequests = [], bidderRequest) => {
- const winTop = utils.getWindowTop();
- const location = winTop.location;
- const placements = [];
- const request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language.split('-')[0] : '',
- 'secure': 1,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
-
- if (bidderRequest) {
- if (bidderRequest.uspConsent) {
- request.ccpa = bidderRequest.uspConsent;
- }
- if (bidderRequest.gdprConsent) {
- request.gdpr = bidderRequest.gdprConsent
- }
- }
-
- const len = validBidRequests.length;
- for (let i = 0; i < len; i++) {
- const bid = validBidRequests[i];
- const placement = {
- placementId: bid.params.placementId,
- bidId: bid.bidId,
- schain: bid.schain || {},
- };
- const mediaType = bid.mediaTypes
-
- if (mediaType && mediaType[BANNER] && mediaType[BANNER].sizes) {
- placement.sizes = mediaType[BANNER].sizes;
- placement.traffic = BANNER;
- } else if (mediaType && mediaType[VIDEO] && mediaType[VIDEO].playerSize) {
- placement.wPlayer = mediaType[VIDEO].playerSize[0];
- placement.hPlayer = mediaType[VIDEO].playerSize[1];
- placement.traffic = VIDEO;
- } else if (mediaType && mediaType[NATIVE]) {
- placement.native = mediaType[NATIVE];
- placement.traffic = NATIVE;
- }
- placements.push(placement);
- }
-
- return {
- method: 'POST',
- url: AD_URL,
- data: request
- };
- },
-
- interpretResponse: (serverResponse) => {
- let response = [];
- for (let i = 0; i < serverResponse.body.length; i++) {
- let resItem = serverResponse.body[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- return response;
- },
-
- getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent) => {
- let syncUrl = SYNC_URL
- if (gdprConsent && gdprConsent.consentString) {
- if (typeof gdprConsent.gdprApplies === 'boolean') {
- syncUrl += `&gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
- } else {
- syncUrl += `&gdpr=0&gdpr_consent=${gdprConsent.consentString}`;
- }
- }
- if (uspConsent && uspConsent.consentString) {
- syncUrl += `&ccpa_consent=${uspConsent.consentString}`;
- }
- return [{
- type: 'iframe',
- url: syncUrl
- }];
- }
-};
-
-registerBidder(spec);
diff --git a/modules/loopmeBidAdapter.js b/modules/loopmeBidAdapter.js
deleted file mode 100644
index 919e0b17294..00000000000
--- a/modules/loopmeBidAdapter.js
+++ /dev/null
@@ -1,149 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-import { Renderer } from '../src/Renderer.js';
-
-const LOOPME_ENDPOINT = 'https://loopme.me/api/hb';
-
-const entries = (obj) => {
- let output = [];
- for (let key in obj) {
- if (obj.hasOwnProperty(key)) {
- output.push([key, obj[key]])
- }
- }
- return output;
-}
-
-export const spec = {
- code: 'loopme',
- supportedMediaTypes: [BANNER, VIDEO],
- /**
- * @param {object} bid
- * @return boolean
- */
- isBidRequestValid: function(bid) {
- if (typeof bid.params !== 'object') {
- return false;
- }
-
- return !!bid.params.ak;
- },
- /**
- * @param {BidRequest[]} bidRequests
- * @param bidderRequest
- * @return ServerRequest[]
- */
- buildRequests: function(bidRequests, bidderRequest) {
- return bidRequests.map(bidRequest => {
- bidRequest.startTime = new Date().getTime();
- let payload = bidRequest.params;
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- payload.user_consent = bidderRequest.gdprConsent.consentString;
- }
-
- let queryString = entries(payload)
- .map(item => `${item[0]}=${encodeURI(item[1])}`)
- .join('&');
-
- const adUnitSizes = bidRequest.mediaTypes[BANNER]
- ? utils.getAdUnitSizes(bidRequest)
- : utils.deepAccess(bidRequest.mediaTypes, 'video.playerSize');
-
- const sizes =
- '&sizes=' +
- adUnitSizes
- .map(size => `${size[0]}x${size[1]}`)
- .join('&sizes=');
-
- queryString = `${queryString}${sizes}${bidRequest.mediaTypes[VIDEO] ? '&media_type=video' : ''}`;
-
- return {
- method: 'GET',
- url: `${LOOPME_ENDPOINT}`,
- options: { withCredentials: false },
- bidId: bidRequest.bidId,
- data: queryString
- };
- });
- },
- /**
- * @param {*} responseObj
- * @param {BidRequest} bidRequest
- * @return {Bid[]} An array of bids which
- */
- interpretResponse: function(response = {}, bidRequest) {
- const responseObj = response.body;
- if (
- responseObj === null ||
- typeof responseObj !== 'object'
- ) {
- return [];
- }
-
- if (
- !responseObj.hasOwnProperty('ad') &&
- !responseObj.hasOwnProperty('vastUrl')
- ) {
- return [];
- }
- // responseObj.vastUrl = 'https://rawgit.com/InteractiveAdvertisingBureau/VAST_Samples/master/VAST%201-2.0%20Samples/Inline_NonLinear_Verification_VAST2.0.xml';
- if (responseObj.vastUrl) {
- const renderer = Renderer.install({
- id: bidRequest.bidId,
- url: 'https://i.loopme.me/html/vast/loopme_flex.js',
- loaded: false
- });
- renderer.setRender((bid) => {
- renderer.push(function () {
- var adverts = [{
- 'type': 'VAST',
- 'url': bid.vastUrl,
- 'autoClose': -1
- }];
- var config = {
- containerId: bid.adUnitCode,
- vastTimeout: 250,
- ads: adverts,
- user_consent: '%%USER_CONSENT%%',
- };
- window.L.flex.loader.load(config);
- })
- });
- return [
- {
- requestId: bidRequest.bidId,
- cpm: responseObj.cpm,
- width: responseObj.width,
- height: responseObj.height,
- ttl: responseObj.ttl,
- currency: responseObj.currency,
- creativeId: responseObj.creativeId,
- dealId: responseObj.dealId,
- netRevenue: responseObj.netRevenue,
- vastUrl: responseObj.vastUrl,
- mediaType: VIDEO,
- renderer
- }
- ];
- }
-
- return [
- {
- requestId: bidRequest.bidId,
- cpm: responseObj.cpm,
- width: responseObj.width,
- height: responseObj.height,
- ad: responseObj.ad,
- ttl: responseObj.ttl,
- currency: responseObj.currency,
- creativeId: responseObj.creativeId,
- dealId: responseObj.dealId,
- netRevenue: responseObj.netRevenue,
- mediaType: BANNER
- }
- ];
- }
-};
-registerBidder(spec);
diff --git a/modules/lunamediaBidAdapter.js b/modules/lunamediaBidAdapter.js
deleted file mode 100755
index b309ef42240..00000000000
--- a/modules/lunamediaBidAdapter.js
+++ /dev/null
@@ -1,399 +0,0 @@
-import * as utils from '../src/utils.js';
-import { config } from '../src/config.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { VIDEO, BANNER } from '../src/mediaTypes.js';
-import find from 'core-js-pure/features/array/find.js';
-import includes from 'core-js-pure/features/array/includes.js';
-
-const ADAPTER_VERSION = '1.0';
-const BIDDER_CODE = 'lunamedia';
-
-export const VIDEO_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';// https://api.lunamedia.io/xp/get?pubid=0cf8d6d643e13d86a5b6374148a4afac';
-export const BANNER_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';// 0cf8d6d643e13d86a5b6374148a4afac';
-export const OUTSTREAM_SRC = 'https://player-cdn.beachfrontmedia.com/playerapi/loader/outstream.js';
-export const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'skip'];
-export const DEFAULT_MIMES = ['video/mp4', 'application/javascript'];
-
-let pubid = '';
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO],
-
- isBidRequestValid(bidRequest) {
- if (typeof bidRequest != 'undefined') {
- if (bidRequest.bidder !== BIDDER_CODE && typeof bidRequest.params === 'undefined') { return false; }
- if (bidRequest === '' || bidRequest.params.placement === '' || bidRequest.params.pubid === '') { return false; }
- return true;
- } else { return false; }
- },
-
- buildRequests(bids, bidderRequest) {
- let requests = [];
- let videoBids = bids.filter(bid => isVideoBidValid(bid));
- let bannerBids = bids.filter(bid => isBannerBidValid(bid));
- videoBids.forEach(bid => {
- pubid = getVideoBidParam(bid, 'pubid');
- requests.push({
- method: 'POST',
- url: VIDEO_ENDPOINT + pubid,
- data: createVideoRequestData(bid, bidderRequest),
- bidRequest: bid
- });
- });
-
- bannerBids.forEach(bid => {
- pubid = getBannerBidParam(bid, 'pubid');
-
- requests.push({
- method: 'POST',
- url: BANNER_ENDPOINT + pubid,
- data: createBannerRequestData(bid, bidderRequest),
- bidRequest: bid
- });
- });
- return requests;
- },
-
- interpretResponse(serverResponse, {bidRequest}) {
- let response = serverResponse.body;
- if (response !== null && utils.isEmpty(response) == false) {
- if (isVideoBid(bidRequest)) {
- let bidResponse = {
- requestId: response.id,
- bidderCode: BIDDER_CODE,
- cpm: response.seatbid[0].bid[0].price,
- width: response.seatbid[0].bid[0].w,
- height: response.seatbid[0].bid[0].h,
- ttl: response.seatbid[0].bid[0].ttl || 60,
- creativeId: response.seatbid[0].bid[0].crid,
- currency: response.cur,
- mediaType: VIDEO,
- netRevenue: true
- }
-
- if (response.seatbid[0].bid[0].adm) {
- bidResponse.vastXml = response.seatbid[0].bid[0].adm;
- bidResponse.adResponse = {
- content: response.seatbid[0].bid[0].adm
- };
- } else {
- bidResponse.vastUrl = response.seatbid[0].bid[0].nurl;
- }
-
- return bidResponse;
- } else {
- return {
- requestId: response.id,
- bidderCode: BIDDER_CODE,
- cpm: response.seatbid[0].bid[0].price,
- width: response.seatbid[0].bid[0].w,
- height: response.seatbid[0].bid[0].h,
- ad: response.seatbid[0].bid[0].adm,
- ttl: response.seatbid[0].bid[0].ttl || 60,
- creativeId: response.seatbid[0].bid[0].crid,
- currency: response.cur,
- mediaType: BANNER,
- netRevenue: true
- }
- }
- }
- }
-};
-
-function isBannerBid(bid) {
- return utils.deepAccess(bid, 'mediaTypes.banner') || !isVideoBid(bid);
-}
-
-function isVideoBid(bid) {
- return utils.deepAccess(bid, 'mediaTypes.video');
-}
-
-function isVideoBidValid(bid) {
- return isVideoBid(bid) && getVideoBidParam(bid, 'pubid') && getVideoBidParam(bid, 'placement');
-}
-
-function isBannerBidValid(bid) {
- return isBannerBid(bid) && getBannerBidParam(bid, 'pubid') && getBannerBidParam(bid, 'placement');
-}
-
-function getVideoBidParam(bid, key) {
- return utils.deepAccess(bid, 'params.video.' + key) || utils.deepAccess(bid, 'params.' + key);
-}
-
-function getBannerBidParam(bid, key) {
- return utils.deepAccess(bid, 'params.banner.' + key) || utils.deepAccess(bid, 'params.' + key);
-}
-
-function isMobile() {
- return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
-}
-
-function isConnectedTV() {
- return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
-}
-
-function getDoNotTrack() {
- return navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.msDoNoTrack === '1' || navigator.doNotTrack === 'yes';
-}
-
-function findAndFillParam(o, key, value) {
- try {
- if (typeof value === 'function') {
- o[key] = value();
- } else {
- o[key] = value;
- }
- } catch (ex) {}
-}
-
-function getOsVersion() {
- let clientStrings = [
- { s: 'Android', r: /Android/ },
- { s: 'iOS', r: /(iPhone|iPad|iPod)/ },
- { s: 'Mac OS X', r: /Mac OS X/ },
- { s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ },
- { s: 'Linux', r: /(Linux|X11)/ },
- { s: 'Windows 10', r: /(Windows 10.0|Windows NT 10.0)/ },
- { s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/ },
- { s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/ },
- { s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/ },
- { s: 'Windows Vista', r: /Windows NT 6.0/ },
- { s: 'Windows Server 2003', r: /Windows NT 5.2/ },
- { s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/ },
- { s: 'UNIX', r: /UNIX/ },
- { s: 'Search Bot', r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ }
- ];
- let cs = find(clientStrings, cs => cs.r.test(navigator.userAgent));
- return cs ? cs.s : 'unknown';
-}
-
-function getFirstSize(sizes) {
- return (sizes && sizes.length) ? sizes[0] : { w: undefined, h: undefined };
-}
-
-function parseSizes(sizes) {
- return utils.parseSizesInput(sizes).map(size => {
- let [ width, height ] = size.split('x');
- return {
- w: parseInt(width, 10) || undefined,
- h: parseInt(height, 10) || undefined
- };
- });
-}
-
-function getVideoSizes(bid) {
- return parseSizes(utils.deepAccess(bid, 'mediaTypes.video.playerSize') || bid.sizes);
-}
-
-function getBannerSizes(bid) {
- return parseSizes(utils.deepAccess(bid, 'mediaTypes.banner.sizes') || bid.sizes);
-}
-
-function getTopWindowReferrer() {
- try {
- return window.top.document.referrer;
- } catch (e) {
- return '';
- }
-}
-
-function getVideoTargetingParams(bid) {
- return Object.keys(Object(bid.params.video))
- .filter(param => includes(VIDEO_TARGETING, param))
- .reduce((obj, param) => {
- obj[ param ] = bid.params.video[ param ];
- return obj;
- }, {});
-}
-
-function createVideoRequestData(bid, bidderRequest) {
- let topLocation = getTopWindowLocation(bidderRequest);
- let topReferrer = getTopWindowReferrer();
-
- // if size is explicitly given via adapter params
- let paramSize = getVideoBidParam(bid, 'size');
- let sizes = [];
-
- if (typeof paramSize !== 'undefined' && paramSize != '') {
- sizes = parseSizes(paramSize);
- } else {
- sizes = getVideoSizes(bid);
- }
- const firstSize = getFirstSize(sizes);
-
- let video = getVideoTargetingParams(bid);
- const o = {
- 'device': {
- 'langauge': (global.navigator.language).split('-')[0],
- 'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
- 'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
- 'js': 1,
- 'os': getOsVersion()
- },
- 'at': 2,
- 'site': {},
- 'tmax': 3000,
- 'cur': ['USD'],
- 'id': bid.bidId,
- 'imp': [],
- 'regs': {
- 'ext': {
- }
- },
- 'user': {
- 'ext': {
- }
- }
- };
-
- o.site['page'] = topLocation.href;
- o.site['domain'] = topLocation.hostname;
- o.site['search'] = topLocation.search;
- o.site['domain'] = topLocation.hostname;
- o.site['ref'] = topReferrer;
- o.site['mobile'] = isMobile() ? 1 : 0;
- const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
-
- o.device['dnt'] = getDoNotTrack() ? 1 : 0;
-
- findAndFillParam(o.site, 'name', function() {
- return global.top.document.title;
- });
-
- findAndFillParam(o.device, 'h', function() {
- return global.screen.height;
- });
- findAndFillParam(o.device, 'w', function() {
- return global.screen.width;
- });
-
- let placement = getVideoBidParam(bid, 'placement');
- let floor = getVideoBidParam(bid, 'floor');
- if (floor == null) { floor = 0.5; }
-
- for (let j = 0; j < sizes.length; j++) {
- o.imp.push({
- 'id': '' + j,
- 'displaymanager': '' + BIDDER_CODE,
- 'displaymanagerver': '' + ADAPTER_VERSION,
- 'tagId': placement,
- 'bidfloor': floor,
- 'bidfloorcur': 'USD',
- 'secure': secure,
- 'video': Object.assign({
- 'id': utils.generateUUID(),
- 'pos': 0,
- 'w': firstSize.w,
- 'h': firstSize.h,
- 'mimes': DEFAULT_MIMES
- }, video)
-
- });
- }
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- let { gdprApplies, consentString } = bidderRequest.gdprConsent;
- o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
- o.user.ext = {'consent': consentString};
- }
-
- return o;
-}
-
-function getTopWindowLocation(bidderRequest) {
- let url = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer;
- return utils.parseUrl(config.getConfig('pageUrl') || url, { decodeSearchAsString: true });
-}
-
-function createBannerRequestData(bid, bidderRequest) {
- let topLocation = getTopWindowLocation(bidderRequest);
- let topReferrer = getTopWindowReferrer();
-
- // if size is explicitly given via adapter params
-
- let paramSize = getBannerBidParam(bid, 'size');
- let sizes = [];
- if (typeof paramSize !== 'undefined' && paramSize != '') {
- sizes = parseSizes(paramSize);
- } else {
- sizes = getBannerSizes(bid);
- }
-
- const o = {
- 'device': {
- 'langauge': (global.navigator.language).split('-')[0],
- 'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
- 'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
- 'js': 1
- },
- 'at': 2,
- 'site': {},
- 'tmax': 3000,
- 'cur': ['USD'],
- 'id': bid.bidId,
- 'imp': [],
- 'regs': {
- 'ext': {
- }
- },
- 'user': {
- 'ext': {
- }
- }
- };
-
- o.site['page'] = topLocation.href;
- o.site['domain'] = topLocation.hostname;
- o.site['search'] = topLocation.search;
- o.site['domain'] = topLocation.hostname;
- o.site['ref'] = topReferrer;
- o.site['mobile'] = isMobile() ? 1 : 0;
- const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
-
- o.device['dnt'] = getDoNotTrack() ? 1 : 0;
-
- findAndFillParam(o.site, 'name', function() {
- return global.top.document.title;
- });
-
- findAndFillParam(o.device, 'h', function() {
- return global.screen.height;
- });
- findAndFillParam(o.device, 'w', function() {
- return global.screen.width;
- });
-
- let placement = getBannerBidParam(bid, 'placement');
- for (let j = 0; j < sizes.length; j++) {
- let size = sizes[j];
-
- let floor = getBannerBidParam(bid, 'floor');
- if (floor == null) { floor = 0.1; }
-
- o.imp.push({
- 'id': '' + j,
- 'displaymanager': '' + BIDDER_CODE,
- 'displaymanagerver': '' + ADAPTER_VERSION,
- 'tagId': placement,
- 'bidfloor': floor,
- 'bidfloorcur': 'USD',
- 'secure': secure,
- 'banner': {
- 'id': utils.generateUUID(),
- 'pos': 0,
- 'w': size['w'],
- 'h': size['h']
- }
- });
- }
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- let { gdprApplies, consentString } = bidderRequest.gdprConsent;
- o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
- o.user.ext = {'consent': consentString};
- }
-
- return o;
-}
-registerBidder(spec);
diff --git a/modules/luponmediaBidAdapter.js b/modules/luponmediaBidAdapter.js
deleted file mode 100644
index 29b54f77fbb..00000000000
--- a/modules/luponmediaBidAdapter.js
+++ /dev/null
@@ -1,389 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import {config} from '../src/config.js';
-import {BANNER} from '../src/mediaTypes.js';
-import { ajax } from '../src/ajax.js';
-
-const BIDDER_CODE = 'luponmedia';
-const ENDPOINT_URL = 'https://rtb.adxpremium.services/openrtb2/auction';
-
-const DIGITRUST_PROP_NAMES = {
- PREBID_SERVER: {
- id: 'id',
- keyv: 'keyv'
- }
-};
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER],
- isBidRequestValid: function (bid) {
- return !!(bid.params && bid.params.siteId && bid.params.keyId); // TODO: check for siteId and keyId
- },
- buildRequests: function (bidRequests, bidderRequest) {
- const bRequest = {
- method: 'POST',
- url: ENDPOINT_URL,
- data: null,
- options: {},
- bidderRequest
- };
-
- let currentImps = [];
-
- for (let i = 0, len = bidRequests.length; i < len; i++) {
- let newReq = newOrtbBidRequest(bidRequests[i], bidderRequest, currentImps);
- currentImps = newReq.imp;
- bRequest.data = JSON.stringify(newReq);
- }
-
- return bRequest;
- },
- interpretResponse: (response, request) => {
- const bidResponses = [];
- var respCur = 'USD';
- let parsedRequest = JSON.parse(request.data);
- let parsedReferrer = parsedRequest.site && parsedRequest.site.ref ? parsedRequest.site.ref : '';
- try {
- if (response.body && response.body.seatbid && utils.isArray(response.body.seatbid)) {
- // Supporting multiple bid responses for same adSize
- respCur = response.body.cur || respCur;
- response.body.seatbid.forEach(seatbidder => {
- seatbidder.bid &&
- utils.isArray(seatbidder.bid) &&
- seatbidder.bid.forEach(bid => {
- let newBid = {
- requestId: bid.impid,
- cpm: (parseFloat(bid.price) || 0).toFixed(2),
- width: bid.w,
- height: bid.h,
- creativeId: bid.crid || bid.id,
- dealId: bid.dealid,
- currency: respCur,
- netRevenue: false,
- ttl: 300,
- referrer: parsedReferrer,
- ad: bid.adm
- };
-
- bidResponses.push(newBid);
- });
- });
- }
- } catch (error) {
- utils.logError(error);
- }
- return bidResponses;
- },
- getUserSyncs: function (syncOptions, responses, gdprConsent, uspConsent) {
- let allUserSyncs = [];
- if (!hasSynced && (syncOptions.iframeEnabled || syncOptions.pixelEnabled)) {
- responses.forEach(csResp => {
- if (csResp.body && csResp.body.ext && csResp.body.ext.usersyncs) {
- try {
- let response = csResp.body.ext.usersyncs
- let bidders = response.bidder_status;
- for (let synci in bidders) {
- let thisSync = bidders[synci];
- if (thisSync.no_cookie) {
- let url = thisSync.usersync.url;
- let type = thisSync.usersync.type;
-
- if (!url) {
- utils.logError(`No sync url for bidder luponmedia.`);
- } else if ((type === 'image' || type === 'redirect') && syncOptions.pixelEnabled) {
- utils.logMessage(`Invoking image pixel user sync for luponmedia`);
- allUserSyncs.push({type: 'image', url: url});
- } else if (type == 'iframe' && syncOptions.iframeEnabled) {
- utils.logMessage(`Invoking iframe user sync for luponmedia`);
- allUserSyncs.push({type: 'iframe', url: url});
- } else {
- utils.logError(`User sync type "${type}" not supported for luponmedia`);
- }
- }
- }
- } catch (e) {
- utils.logError(e);
- }
- }
- });
- } else {
- utils.logWarn('Luponmedia: Please enable iframe/pixel based user sync.');
- }
-
- hasSynced = true;
- return allUserSyncs;
- },
- onBidWon: bid => {
- const bidString = JSON.stringify(bid);
- spec.sendWinningsToServer(bidString);
- },
- sendWinningsToServer: data => {
- let mutation = `mutation {createWin(input: {win: {eventData: "${window.btoa(data)}"}}) {win {createTime } } }`;
- let dataToSend = JSON.stringify({ query: mutation });
-
- ajax('https://analytics.adxpremium.services/graphql', null, dataToSend, {
- contentType: 'application/json',
- method: 'POST'
- });
- }
-};
-
-function newOrtbBidRequest(bidRequest, bidderRequest, currentImps) {
- bidRequest.startTime = new Date().getTime();
-
- const bannerParams = utils.deepAccess(bidRequest, 'mediaTypes.banner');
-
- let bannerSizes = [];
-
- if (bannerParams && bannerParams.sizes) {
- const sizes = utils.parseSizesInput(bannerParams.sizes);
-
- // get banner sizes in form [{ w: , h: }, ...]
- const format = sizes.map(size => {
- const [ width, height ] = size.split('x');
- const w = parseInt(width, 10);
- const h = parseInt(height, 10);
- return { w, h };
- });
-
- bannerSizes = format;
- }
-
- const data = {
- id: bidRequest.transactionId,
- test: config.getConfig('debug') ? 1 : 0,
- source: {
- tid: bidRequest.transactionId
- },
- tmax: config.getConfig('timeout') || 1500,
- imp: currentImps.concat([{
- id: bidRequest.bidId,
- secure: 1,
- ext: {
- [bidRequest.bidder]: bidRequest.params
- },
- banner: {
- format: bannerSizes
- }
- }]),
- ext: {
- prebid: {
- targeting: {
- includewinners: true,
- // includebidderkeys always false for openrtb
- includebidderkeys: false
- }
- }
- },
- user: {
- }
- }
-
- const bidFloor = parseFloat(utils.deepAccess(bidRequest, 'params.floor'));
- if (!isNaN(bidFloor)) {
- data.imp[0].bidfloor = bidFloor;
- }
- appendSiteAppDevice(data, bidRequest, bidderRequest);
-
- const digiTrust = _getDigiTrustQueryParams(bidRequest, 'PREBID_SERVER');
- if (digiTrust) {
- utils.deepSetValue(data, 'user.ext.digitrust', digiTrust);
- }
-
- if (bidderRequest.gdprConsent) {
- // note - gdprApplies & consentString may be undefined in certain use-cases for consentManagement module
- let gdprApplies;
- if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') {
- gdprApplies = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
- }
-
- utils.deepSetValue(data, 'regs.ext.gdpr', gdprApplies);
- utils.deepSetValue(data, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
- }
-
- if (bidderRequest.uspConsent) {
- utils.deepSetValue(data, 'regs.ext.us_privacy', bidderRequest.uspConsent);
- }
-
- // Set user uuid
- utils.deepSetValue(data, 'user.id', utils.generateUUID());
-
- // set crumbs
- if (bidRequest.crumbs && bidRequest.crumbs.pubcid) {
- utils.deepSetValue(data, 'user.buyeruid', bidRequest.crumbs.pubcid);
- } else {
- utils.deepSetValue(data, 'user.buyeruid', utils.generateUUID());
- }
-
- if (bidRequest.userId && typeof bidRequest.userId === 'object' &&
- (bidRequest.userId.tdid || bidRequest.userId.pubcid || bidRequest.userId.lipb || bidRequest.userId.idl_env)) {
- 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,
- }]
- });
- }
-
- // support liveintent ID
- if (bidRequest.userId.lipb && bidRequest.userId.lipb.lipbid) {
- data.user.ext.eids.push({
- source: 'liveintent.com',
- uids: [{
- id: bidRequest.userId.lipb.lipbid
- }]
- });
-
- data.user.ext.tpid = {
- source: 'liveintent.com',
- uid: bidRequest.userId.lipb.lipbid
- };
-
- if (Array.isArray(bidRequest.userId.lipb.segments) && bidRequest.userId.lipb.segments.length) {
- utils.deepSetValue(data, 'rp.target.LIseg', bidRequest.userId.lipb.segments);
- }
- }
-
- // support identityLink (aka LiveRamp)
- if (bidRequest.userId.idl_env) {
- data.user.ext.eids.push({
- source: 'liveramp.com',
- uids: [{
- id: bidRequest.userId.idl_env
- }]
- });
- }
- }
-
- if (config.getConfig('coppa') === true) {
- utils.deepSetValue(data, 'regs.coppa', 1);
- }
-
- if (bidRequest.schain && hasValidSupplyChainParams(bidRequest.schain)) {
- utils.deepSetValue(data, 'source.ext.schain', bidRequest.schain);
- }
-
- const fpd = config.getLegacyFpd(config.getConfig('ortb2')) || {};
- const siteData = Object.assign({}, bidRequest.params.inventory, fpd.context);
- const userData = Object.assign({}, bidRequest.params.visitor, fpd.user);
-
- if (!utils.isEmpty(siteData) || !utils.isEmpty(userData)) {
- const bidderData = {
- bidders: [ bidderRequest.bidderCode ],
- config: {
- fpd: {}
- }
- };
-
- if (!utils.isEmpty(siteData)) {
- bidderData.config.fpd.site = siteData;
- }
-
- if (!utils.isEmpty(userData)) {
- bidderData.config.fpd.user = userData;
- }
-
- utils.deepSetValue(data, 'ext.prebid.bidderconfig.0', bidderData);
- }
-
- const pbAdSlot = utils.deepAccess(bidRequest, 'ortb2Imp.ext.data.pbadslot');
- if (typeof pbAdSlot === 'string' && pbAdSlot) {
- utils.deepSetValue(data.imp[0].ext, 'context.data.adslot', pbAdSlot);
- }
-
- return data;
-}
-
-export function hasValidSupplyChainParams(schain) {
- let isValid = false;
- const requiredFields = ['asi', 'sid', 'hp'];
- if (!schain.nodes) return isValid;
- isValid = schain.nodes.reduce((status, node) => {
- if (!status) return status;
- return requiredFields.every(field => node[field]);
- }, true);
- if (!isValid) utils.logError('LuponMedia: required schain params missing');
- return isValid;
-}
-
-function _getDigiTrustQueryParams(bidRequest = {}, endpointName) {
- if (!endpointName || !DIGITRUST_PROP_NAMES[endpointName]) {
- return null;
- }
- const propNames = DIGITRUST_PROP_NAMES[endpointName];
-
- function getDigiTrustId() {
- 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 null;
- }
-
- const digiTrustQueryParams = {
- [propNames.id]: digiTrustId.id,
- [propNames.keyv]: digiTrustId.keyv
- };
- if (propNames.pref) {
- digiTrustQueryParams[propNames.pref] = 0;
- }
- return digiTrustQueryParams;
-}
-
-function _getPageUrl(bidRequest, bidderRequest) {
- let pageUrl = config.getConfig('pageUrl');
- if (bidRequest.params.referrer) {
- pageUrl = bidRequest.params.referrer;
- } else if (!pageUrl) {
- pageUrl = bidderRequest.refererInfo.referer;
- }
- return bidRequest.params.secure ? pageUrl.replace(/^http:/i, 'https:') : pageUrl;
-}
-
-function appendSiteAppDevice(data, bidRequest, bidderRequest) {
- if (!data) return;
-
- // ORTB specifies app OR site
- if (typeof config.getConfig('app') === 'object') {
- data.app = config.getConfig('app');
- } else {
- data.site = {
- page: _getPageUrl(bidRequest, bidderRequest)
- }
- }
- if (typeof config.getConfig('device') === 'object') {
- data.device = config.getConfig('device');
- }
-}
-
-var hasSynced = false;
-
-export function resetUserSync() {
- hasSynced = false;
-}
-
-registerBidder(spec);
diff --git a/modules/madvertiseBidAdapter.js b/modules/madvertiseBidAdapter.js
index d0cafbfd6b8..219295f0d50 100644
--- a/modules/madvertiseBidAdapter.js
+++ b/modules/madvertiseBidAdapter.js
@@ -86,7 +86,11 @@ export const spec = {
creativeId: responseObj.creativeId,
netRevenue: responseObj.netRevenue,
currency: responseObj.currency,
- dealId: responseObj.dealId
+ dealId: responseObj.dealId,
+ meta: {
+ advertiserDomains: Array.isArray(responseObj.adomain) ? responseObj.adomain : []
+ }
+
};
return [bid];
},
diff --git a/modules/madvertiseBidAdapter.md b/modules/madvertiseBidAdapter.md
index 4576e955cbd..b57925f2dc1 100644
--- a/modules/madvertiseBidAdapter.md
+++ b/modules/madvertiseBidAdapter.md
@@ -30,7 +30,7 @@ support@madvertise.com for more information.
{
bidder: "madvertise",
params: {
- s: "/4543756/prebidadaptor/madvertiseHB"
+ zoneId: "/4543756/prebidadaptor/madvertiseHB"
}
}
]
diff --git a/modules/mantisBidAdapter.js b/modules/mantisBidAdapter.js
index 960fbe27c73..61b7c31c8e4 100644
--- a/modules/mantisBidAdapter.js
+++ b/modules/mantisBidAdapter.js
@@ -1,7 +1,7 @@
import {registerBidder} from '../src/adapters/bidderFactory.js';
import { getStorageManager } from '../src/storageManager.js';
-const storage = getStorageManager();
+export const storage = getStorageManager();
function inIframe() {
try {
@@ -247,6 +247,9 @@ export const spec = {
width: ad.width,
height: ad.height,
ad: ad.html,
+ meta: {
+ advertiserDomains: ad.domains || []
+ },
ttl: ad.ttl || serverResponse.body.ttl || 86400,
creativeId: ad.view,
netRevenue: true,
diff --git a/modules/meazyBidAdapter.js b/modules/meazyBidAdapter.js
deleted file mode 100644
index 9640210cc12..00000000000
--- a/modules/meazyBidAdapter.js
+++ /dev/null
@@ -1,149 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'meazy';
-const PREBID_ENDPOINT = 'rtb-filter.meazy.co';
-const SYNC_ENDPOINT = 'https://sync.meazy.co/sync/iframe';
-const ENDPOINT_CONFIG = {
- defaultCurrency: ['USD'],
- availableSize: ['300x250', '320x480', '160x600']
-};
-
-const buildURI = (pid) => {
- return `https://${PREBID_ENDPOINT}/pbjs?host=${utils.getOrigin()}&api_key=${pid}`;
-}
-
-const validateSize = (size) => {
- return ENDPOINT_CONFIG.availableSize.indexOf(size.join('x')) !== -1;
-}
-
-const buildImpression = (bidRequest) => {
- const impression = {
- id: utils.getUniqueIdentifierStr(),
- tagid: bidRequest.adUnitCode,
- banner: {
- format: bidRequest.sizes.map(size => ({ w: size[0], h: size[1] }))
- }
- };
-
- return impression;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER],
-
- /**
- * Determines whether or not the given bid request is valid.
- *
- * @param {object} bid The bid to validate.
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: function(bid) {
- return !!bid.params.pid && bid.sizes.some(validateSize);
- },
-
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server.
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: function(bidRequests, bidderRequest) {
- const payload = {
- id: bidRequests[0].bidId,
- site: {
- domain: utils.getOrigin()
- },
- device: {
- w: window.screen.width,
- h: window.screen.height,
- language: navigator.language
- },
- cur: ENDPOINT_CONFIG.defaultCurrency,
- imp: bidRequests.map(buildImpression),
- user: {}
- };
-
- if (bidderRequest.refererInfo) {
- if (bidderRequest.refererInfo.referer) {
- payload.site.ref = bidderRequest.refererInfo.referer;
- }
-
- if (utils.isArray(bidderRequest.refererInfo) && bidderRequest.refererInfo.stack.length > 0) {
- payload.site.page = bidderRequest.refererInfo.stack[0];
- }
- }
-
- if (utils.deepAccess(bidderRequest, 'gdprConsent.gdprApplies')) {
- payload.user.ext = {
- consent: bidderRequest.gdprConsent.consentString,
- gdpr: bidderRequest.gdprConsent.gdprApplies & 1
- }
- }
-
- const payloadString = JSON.stringify(payload);
-
- return {
- method: 'POST',
- url: buildURI(bidRequests[0].params.pid),
- 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) {
- const bids = [];
-
- if (!utils.isArray(serverResponse.body.seatbid) || !serverResponse.body.seatbid[0]) {
- return bids;
- }
-
- serverResponse.body.seatbid[0].bid.forEach(bidResponse => {
- const bid = {
- requestId: serverResponse.body.id,
- cpm: bidResponse.price,
- width: bidResponse.w,
- height: bidResponse.h,
- creativeId: bidResponse.crid,
- netRevenue: bidResponse.netRevenue !== undefined ? bidResponse.netRevenue : true,
- dealId: bidResponse.dealid,
- currency: ENDPOINT_CONFIG.defaultCurrency[0],
- ttl: bidResponse.exp || 900,
- ad: bidResponse.adm
- }
-
- bids.push(bid);
- });
-
- return bids;
- },
-
- getUserSyncs: function(syncOptions, serverResponses) {
- const syncs = [];
-
- if (syncOptions.pixelEnabled && serverResponses[0] && utils.deepAccess(serverResponses[0], 'body.ext.syncUrl')) {
- syncs.push({
- type: 'image',
- url: serverResponses[0].body.ext.syncUrl
- });
- }
-
- if (syncOptions.iframeEnabled) {
- syncs.push({
- type: 'iframe',
- url: SYNC_ENDPOINT
- });
- }
-
- return syncs;
- }
-}
-
-registerBidder(spec);
diff --git a/modules/mediaforceBidAdapter.js b/modules/mediaforceBidAdapter.js
index e03423f36ac..4c303ea9b37 100644
--- a/modules/mediaforceBidAdapter.js
+++ b/modules/mediaforceBidAdapter.js
@@ -123,7 +123,7 @@ export const spec = {
validBidRequests.forEach(bid => {
isTest = isTest || bid.params.is_test;
let tagid = bid.params.placement_id;
- let bidfloor = bid.params.bidfloor ? parseFloat(bid.params.bidfloor) : 0;
+ let bidfloor = 0;
let validImp = false;
let impObj = {
id: bid.bidId,
@@ -219,6 +219,9 @@ export const spec = {
currency: cur,
netRevenue: true,
ttl: serverBid.ttl || 300,
+ meta: {
+ advertiserDomains: serverBid.adomain ? serverBid.adomain : []
+ },
burl: serverBid.burl,
};
if (serverBid.dealid) {
diff --git a/modules/mediagoBidAdapter.js b/modules/mediagoBidAdapter.js
deleted file mode 100644
index 022d216a84a..00000000000
--- a/modules/mediagoBidAdapter.js
+++ /dev/null
@@ -1,375 +0,0 @@
-/**
- * gulp serve --modules=mediagoBidAdapter --nolint --notest
- */
-
-import * as utils from '../src/utils.js';
-import { getStorageManager } from '../src/storageManager.js';
-import {
- registerBidder
-} from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'mediago';
-const PROTOCOL = window.document.location.protocol;
-const IS_SECURE = (PROTOCOL === 'https:') ? 1 : 0;
-const ENDPOINT_URL =
- // ((PROTOCOL === 'https:') ? 'https' : 'http') +
- 'https://rtb-us.mediago.io/api/bid?tn=';
-const TIME_TO_LIVE = 500;
-// const ENDPOINT_URL = '/api/bid?tn=';
-const storage = getStorageManager();
-let globals = {};
-let itemMaps = {};
-
-/**
- * 获取随机id
- * @param {number} a random number from 0 to 15
- * @return {string} random number or random string
- */
-function getRandomId(
- a // placeholder
-) {
- return a // if the placeholder was passed, return
- ? ( // a random number from 0 to 15
- a ^ // unless b is 8,
- Math.random() * // in which case
- 16 >> // a random number from
- a / 4 // 8 to 11
- ).toString(16) // in hexadecimal
- : ( // or otherwise a concatenated string:
- [1e7] + // 10000000 +
- 1e3 + // -1000 +
- 4e3 + // -4000 +
- 8e3 + // -80000000 +
- 1e11 // -100000000000,
- ).replace( // replacing
- /[018]/g, // zeroes, ones, and eights with
- getRandomId // random hex digits
- );
-}
-
-/* ----- mguid:start ------ */
-const COOKIE_KEY_MGUID = '__mguid_';
-
-/**
- * 获取用户id
- * @return {string}
- */
-const getUserID = () => {
- const i = storage.getCookie(COOKIE_KEY_MGUID);
-
- if (i === null) {
- const uuid = utils.generateUUID();
- storage.setCookie(COOKIE_KEY_MGUID, uuid);
- return uuid;
- }
- return i;
-};
-
-/* ----- mguid:end ------ */
-
-/**
- * 获取一个对象的某个值,如果没有则返回空字符串
- * @param {Object} obj 对象
- * @param {...string} keys 键名
- * @return {any}
- */
-function getProperty(obj, ...keys) {
- let o = obj;
-
- for (let key of keys) {
- // console.log(key, o);
- if (o && o[key]) {
- o = o[key];
- } else {
- return '';
- }
- }
- return o;
-}
-
-/**
- * 是不是移动设备或者平板
- * @return {boolean}
- */
-function isMobileAndTablet() {
- let check = false;
- (function(a) {
- let reg1 = new RegExp(['(android|bb\d+|meego)',
- '.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)',
- '|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone',
- '|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap',
- '|windows ce|xda|xiino|android|ipad|playbook|silk'
- ].join(''), 'i');
- let reg2 = new RegExp(['1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)',
- '|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )',
- '|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell',
- '|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)',
- '|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene',
- '|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c',
- '|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom',
- '|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)',
- '|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)',
- '|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]',
- '|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)',
- '|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio',
- '|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms',
- '|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al',
- '|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)',
- '|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|',
- 'v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)',
- '|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-',
- '|your|zeto|zte\-'
- ].join(''), 'i');
- if (reg1.test(a) ||
- reg2.test(a.substr(0, 4))) {
- check = true;
- }
- })(navigator.userAgent || navigator.vendor || window.opera);
- return check;
-}
-
-/**
- * 将尺寸转为RTB识别的尺寸
- *
- * @param {Array|Object} requestSizes 配置尺寸
- * @return {Object}
- */
-function transformSizes(requestSizes) {
- let sizes = [];
- let sizeObj = {};
-
- if (utils.isArray(requestSizes) && requestSizes.length === 2 &&
- !utils.isArray(requestSizes[0])) {
- sizeObj.width = parseInt(requestSizes[0], 10);
- sizeObj.height = parseInt(requestSizes[1], 10);
- sizes.push(sizeObj);
- } else if (typeof requestSizes === 'object') {
- for (let i = 0; i < requestSizes.length; i++) {
- let size = requestSizes[i];
- sizeObj = {};
- sizeObj.width = parseInt(size[0], 10);
- sizeObj.height = parseInt(size[1], 10);
- sizes.push(sizeObj);
- }
- }
-
- return sizes;
-}
-
-/**
- * 获取广告位配置
- * @param {Array} validBidRequests an an array of bids
- * @param {Object} bidderRequest The master bidRequest object
- * @return {Object}
- */
-function getItems(validBidRequests, bidderRequest) {
- let items = [];
- for (let i in validBidRequests) {
- let req = validBidRequests[i];
- let ret;
- let mediaTypes = getProperty(req, 'mediaTypes');
-
- let sizes = transformSizes(getProperty(req, 'sizes'));
- let matchSize;
-
- // 确认尺寸是否符合我们要求
- for (let size of sizes) {
- if (size.width === 300 && size.height === 250) {
- matchSize = size;
- break;
- }
- }
-
- // Continue only if there is a matching size
- if (matchSize) {
- // banner广告类型
- if (mediaTypes.banner) {
- let id = '' + (+i + 1);
- ret = {
- id: id,
- // bidFloor: 0, // todo
- banner: {
- h: matchSize.height,
- w: matchSize.width,
- pos: 1,
- },
- secure: IS_SECURE // for server-side to check if it's secure page
- };
- itemMaps[id] = {
- req,
- ret
- };
- }
- }
-
- if (ret) {
- items.push(ret);
- }
- }
-
- return items;
-}
-
-/**
- * 获取rtb请求参数
- *
- * @param {Array} validBidRequests an an array of bids
- * @param {Object} bidderRequest The master bidRequest object
- * @return {Object}
- */
-function getParam(validBidRequests, bidderRequest) {
- // console.log(validBidRequests, bidderRequest);
- let isMobile = isMobileAndTablet() ? 1 : 0;
- let isTest = 0;
- let auctionId = getProperty(bidderRequest, 'auctionId') || getRandomId();
- let items = getItems(validBidRequests, bidderRequest);
-
- const domain = document.domain;
- const location = utils.deepAccess(bidderRequest, 'refererInfo.referer');
-
- if (items && items.length) {
- let c = {
- 'id': 'mgprebidjs_' + auctionId,
- 'test': +isTest,
- 'at': 1,
- 'cur': ['USD'],
- 'device': {
- // 'dnt':0,
- // 'devicetype':2,
- 'js': 1,
- 'os': navigator.platform || '',
- 'ua': navigator.userAgent,
- 'language': /en/.test(navigator.language) ? 'en' : navigator.language,
- // 'geo':{
- // 'country':'USA'
- // }
- },
- 'user': {
- 'id': getUserID() // todo
- },
- 'site': {
- 'name': domain,
- 'domain': domain,
- 'page': location,
- 'ref': location,
- 'mobile': isMobile,
- 'cat': [], // todo
- 'publisher': { // todo
- 'id': domain,
- 'name': domain
- }
- },
- 'imp': items
- };
- return c;
- } else {
- return null;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- // aliases: ['ex'], // 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) {
- // console.log('mediago', {
- // bid
- // });
- if (bid.params.token) {
- globals['token'] = bid.params.token;
- }
- return !!(bid.params.token);
- },
-
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {Array} validBidRequests an an array of bids
- * @param {Object} bidderRequest The master bidRequest object
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: function(validBidRequests, bidderRequest) {
- let payload = getParam(validBidRequests, bidderRequest);
-
- // request ad only if there is a matching size
- if (payload) {
- const payloadString = JSON.stringify(payload);
- return {
- method: 'POST',
- url: ENDPOINT_URL + globals['token'],
- data: payloadString,
- };
- } else {
- return null;
- }
- },
-
- /**
- * 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, bidRequest) {
- const bids = getProperty(serverResponse, 'body', 'seatbid', 0, 'bid');
- const cur = getProperty(serverResponse, 'body', 'cur');
-
- const bidResponses = [];
-
- for (let bid of bids) {
- let impid = getProperty(bid, 'impid');
- if (itemMaps[impid]) {
- let bidId = getProperty(itemMaps[impid], 'req', 'bidId');
- const bidResponse = {
- requestId: bidId,
- cpm: getProperty(bid, 'price'),
- width: getProperty(bid, 'w'),
- height: getProperty(bid, 'h'),
- creativeId: getProperty(bid, 'crid'),
- dealId: '',
- currency: cur,
- netRevenue: true,
- ttl: TIME_TO_LIVE,
- // referrer: REFERER,
- ad: getProperty(bid, 'adm')
- };
- bidResponses.push(bidResponse);
- }
- }
-
- return bidResponses;
- },
-
- /**
- * Register bidder specific code, which will execute if bidder timed out after an auction
- * @param {data} Containing timeout specific data
- */
- onTimeout: function(data) {
- // console.log('onTimeout', data);
- // Bidder specifc code
- },
-
- /**
- * Register bidder specific code, which will execute if a bid from this bidder won the auction
- * @param {Bid} The bid that won the auction
- */
- onBidWon: function(bid) {
- // console.log('onBidWon', bid);
- // Bidder specific code
- },
-
- /**
- * Register bidder specific code, which will execute when the adserver targeting has been set for a bid from this bidder
- * @param {Bid} The bid of which the targeting has been set
- */
- onSetTargeting: function(bid) {
- // console.log('onSetTargeting', bid);
- // Bidder specific code
- }
-};
-registerBidder(spec);
diff --git a/modules/medianetBidAdapter.js b/modules/medianetBidAdapter.js
index 1a4269a8a1d..3b7e555cc72 100644
--- a/modules/medianetBidAdapter.js
+++ b/modules/medianetBidAdapter.js
@@ -114,8 +114,8 @@ function getSize(size) {
function getWindowSize() {
return {
- w: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth || -1,
- h: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight || -1
+ w: window.screen.width || -1,
+ h: window.screen.height || -1
}
}
diff --git a/modules/medianetBidAdapter.md b/modules/medianetBidAdapter.md
index b465d678fc9..fbe967122e9 100644
--- a/modules/medianetBidAdapter.md
+++ b/modules/medianetBidAdapter.md
@@ -79,17 +79,16 @@ var videoAdUnit = {
mediaTypes: {
video: {
context: "instream",
- playerSize: [640, 480]
+ playerSize: [640, 480],
+ mimes: ['video/mp4'],
+ placement: 1
}
},
bids: [{
bidder: 'medianet',
params: {
cid: '8CUX0H51C',
- video: {
- mimes: ['video/mp4'],
- placement: 1
- },
+ crid: '776755783',
// Site member is to be used only for testing
site: {
page: 'http://smoketesting.net/prebidtest/',
@@ -111,8 +110,10 @@ var videoAdUnit = {
code: 'video1',
mediaTypes: {
video: {
- context: "outstream",
- playerSize: [640, 480]
+ context: "outstream",
+ playerSize: [640, 480],
+ mimes: ['video/mp4'],
+ placement: 1
}
},
/**
@@ -128,10 +129,7 @@ var videoAdUnit = {
bidder: 'medianet',
params: {
cid: '8CUX0H51C',
- video: {
- mimes: ['video/mp4'],
- placement: 1
- },
+ crid: '776755783',
// Site member is to be used only for testing
site: {
page: 'http://smoketesting.net/prebidtest/',
diff --git a/modules/medianetRtdProvider.js b/modules/medianetRtdProvider.js
new file mode 100644
index 00000000000..77889db5ff2
--- /dev/null
+++ b/modules/medianetRtdProvider.js
@@ -0,0 +1,112 @@
+import { submodule } from '../src/hook.js';
+import * as utils from '../src/utils.js';
+import { getGlobal } from '../src/prebidGlobal.js';
+import includes from 'core-js-pure/features/array/includes.js';
+
+const MODULE_NAME = 'medianet';
+const SOURCE = MODULE_NAME + 'rtd';
+const AD_UNIT_CODE_TARGETING_KEY = 'mnadc';
+const OPEN_RTB_FIELD = 'ortb2Imp';
+
+const getClientUrl = (customerId, domain) => `https://warp.media.net/js/tags/prebidrtdclient.js?cid=${customerId}&dn=${domain}`;
+
+window.mnjs = window.mnjs || {};
+window.mnjs.que = window.mnjs.que || [];
+
+function init(config) {
+ const customerId = config.params && config.params.cid;
+ if (!customerId || !utils.isStr(customerId) || utils.isEmptyStr(customerId)) {
+ utils.logError(`${SOURCE}: cid should be a string`);
+ return false;
+ }
+
+ loadRtdScript(customerId);
+ executeCommand(() => window.mnjs.setData({
+ module: 'iref',
+ name: 'initIRefresh',
+ data: {config, prebidGlobal: getGlobal()},
+ }, SOURCE));
+ return true;
+}
+
+function getBidRequestData(requestBidsProps, callback, config, userConsent) {
+ executeCommand(() => {
+ let adUnits = getAdUnits(requestBidsProps.adUnits, requestBidsProps.adUnitCodes);
+ const request = window.mnjs.onPrebidRequestBid({requestBidsProps, config, userConsent});
+ if (!request) {
+ callback();
+ return;
+ }
+ const success = (adUnitProps, openRtbProps) => {
+ adUnits.forEach(adUnit => {
+ adUnit[OPEN_RTB_FIELD] = adUnit[OPEN_RTB_FIELD] || {};
+ utils.mergeDeep(adUnit[OPEN_RTB_FIELD], openRtbProps[adUnit.code]);
+ utils.mergeDeep(adUnit, adUnitProps[adUnit.code]);
+ });
+ callback();
+ };
+ const error = () => callback();
+ request.onComplete(error, success);
+ });
+}
+
+function onAuctionInitEvent(auctionInit) {
+ executeCommand(() => window.mnjs.setData({
+ module: 'iref',
+ name: 'auctionInit',
+ data: {auction: auctionInit},
+ }, SOURCE));
+}
+
+function getTargetingData(adUnitCode) {
+ const adUnits = getAdUnits(undefined, adUnitCode);
+ let targetingData = {};
+ if (window.mnjs.loaded && utils.isFn(window.mnjs.getTargetingData)) {
+ targetingData = window.mnjs.getTargetingData(adUnitCode, adUnits, SOURCE) || {};
+ }
+ const targeting = {};
+ adUnitCode.forEach(adUnitCode => {
+ targeting[adUnitCode] = targeting[adUnitCode] || {};
+ targetingData[adUnitCode] = targetingData[adUnitCode] || {};
+ targeting[adUnitCode] = {
+ // we use this to find gpt slot => prebid ad unit
+ [AD_UNIT_CODE_TARGETING_KEY]: adUnitCode,
+ ...targetingData[adUnitCode]
+ };
+ });
+ return targeting;
+}
+
+function executeCommand(command) {
+ window.mnjs.que.push(command);
+}
+
+function loadRtdScript(customerId) {
+ const script = document.createElement('script');
+ script.type = 'text/javascript';
+ script.async = true;
+ script.src = getClientUrl(customerId, window.location.hostname);
+ utils.insertElement(script, window.document, 'head');
+}
+
+function getAdUnits(adUnits, adUnitCodes) {
+ adUnits = adUnits || getGlobal().adUnits || [];
+ if (adUnitCodes && adUnitCodes.length) {
+ adUnits = adUnits.filter(unit => includes(adUnitCodes, unit.code));
+ }
+ return adUnits;
+}
+
+export const medianetRtdModule = {
+ name: MODULE_NAME,
+ init,
+ getBidRequestData,
+ onAuctionInitEvent,
+ getTargetingData,
+};
+
+function registerSubModule() {
+ submodule('realTimeData', medianetRtdModule);
+}
+
+registerSubModule();
diff --git a/modules/medianetRtdProvider.md b/modules/medianetRtdProvider.md
new file mode 100644
index 00000000000..ed74d3bf348
--- /dev/null
+++ b/modules/medianetRtdProvider.md
@@ -0,0 +1,38 @@
+## Overview
+
+Module Name: Media.net Realtime Module
+Module Type: Rtd Provider
+Maintainer: prebid-support@media.net
+
+# Description
+
+The module currently provisions Media.net's Intelligent Refresh configured by the publisher.
+
+### Intelligent Refresh
+
+Intelligent Refresh (IR) module lets publisher refresh their ad inventory without affecting page experience of visitors through configured criteria. The module optionally provides tracking of refresh inventory and appropriate targeting in GAM. Publisher configured criteria is fetched via an external JS payload.
+
+# Integration
+
+1) Build the Media.net Intelligent Refresh RTD module into the Prebid.js package with:
+
+```
+gulp build --modules=medianetRtdProvider
+```
+
+# Configurations
+
+2) Enable Media.net Real Time Module using `pbjs.setConfig`
+
+```javascript
+pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [{
+ name: 'medianet',
+ params: {
+ cid: '8CUX0H51C'
+ }
+ }]
+ }
+});
+```
diff --git a/modules/merkleIdSystem.js b/modules/merkleIdSystem.js
index 353cc45473d..4ab29ec6f68 100644
--- a/modules/merkleIdSystem.js
+++ b/modules/merkleIdSystem.js
@@ -8,42 +8,80 @@
import * as utils from '../src/utils.js'
import {ajax} from '../src/ajax.js';
import {submodule} from '../src/hook.js'
-import { getStorageManager } from '../src/storageManager.js';
+import {getStorageManager} from '../src/storageManager.js';
const MODULE_NAME = 'merkleId';
-const SESSION_COOKIE_NAME = '_svsid';
const ID_URL = 'https://id2.sv.rkdms.com/identity/';
+const DEFAULT_REFRESH = 7 * 3600;
+const SESSION_COOKIE_NAME = '_svsid';
export const storage = getStorageManager();
function getSession(configParams) {
let session = null;
- if (typeof configParams.sv_session !== 'string') {
+ if (typeof configParams.sv_session === 'string') {
session = configParams.sv_session;
} else {
- session = readCookie() || readFromLocalStorage();
+ session = storage.getCookie(SESSION_COOKIE_NAME);
}
return session;
}
-function readCookie() {
- return storage.cookiesAreEnabled() ? storage.getCookie(SESSION_COOKIE_NAME) : null;
+function setCookie(name, value, expires) {
+ let expTime = new Date();
+ expTime.setTime(expTime.getTime() + expires * 1000 * 60);
+ storage.setCookie(name, value, expTime.toUTCString());
}
-function readFromLocalStorage() {
- return storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(SESSION_COOKIE_NAME) : null;
+function setSession(storage, response) {
+ utils.logInfo('Merkle setting session ');
+ if (response && response.c && response.c.value && typeof response.c.value === 'string') {
+ setCookie(SESSION_COOKIE_NAME, response.c.value, storage.expires);
+ }
}
function constructUrl(configParams) {
const session = getSession(configParams);
let url = ID_URL + `?vendor=${configParams.vendor}&sv_cid=${configParams.sv_cid}&sv_domain=${configParams.sv_domain}&sv_pubid=${configParams.sv_pubid}`;
if (session) {
- url.append(`&sv_session=${session}`);
+ url = `${url}&sv_session=${session}`;
}
utils.logInfo('Merkle url :' + url);
return url;
}
+function generateId(configParams, configStorage) {
+ const url = constructUrl(configParams);
+
+ const resp = function (callback) {
+ const callbacks = {
+ success: response => {
+ let responseObj;
+ if (response) {
+ try {
+ responseObj = JSON.parse(response);
+ setSession(configStorage, responseObj)
+ utils.logInfo('Merkle responseObj ' + JSON.stringify(responseObj));
+ } catch (error) {
+ utils.logError(error);
+ }
+ }
+
+ const date = new Date().toUTCString();
+ responseObj.date = date;
+ utils.logInfo('Merkle responseObj with date ' + JSON.stringify(responseObj));
+ callback(responseObj);
+ },
+ error: error => {
+ utils.logError(`${MODULE_NAME}: merkleId fetch encountered an error`, error);
+ callback();
+ }
+ };
+ ajax(url, callbacks, undefined, {method: 'GET', withCredentials: true});
+ };
+ return resp;
+}
+
/** @type {Submodule} */
export const merkleIdSubmodule = {
/**
@@ -60,7 +98,7 @@ export const merkleIdSubmodule = {
decode(value) {
const id = (value && value.pam_id && typeof value.pam_id.id === 'string') ? value.pam_id : undefined;
utils.logInfo('Merkle id ' + JSON.stringify(id));
- return id ? { 'merkleId': id } : undefined;
+ return id ? {'merkleId': id} : undefined;
},
/**
* performs action to obtain id and return a value in the callback's response argument
@@ -70,7 +108,10 @@ export const merkleIdSubmodule = {
* @returns {IdResponse|undefined}
*/
getId(config, consentData) {
+ utils.logInfo('User ID - merkleId generating id');
+
const configParams = (config && config.params) || {};
+
if (!configParams || typeof configParams.vendor !== 'string') {
utils.logError('User ID - merkleId submodule requires a valid vendor to be defined');
return;
@@ -85,41 +126,54 @@ export const merkleIdSubmodule = {
utils.logError('User ID - merkleId submodule requires a valid sv_pubid string to be defined');
return;
}
+ if (consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies) {
+ utils.logError('User ID - merkleId submodule does not currently handle consent strings');
+ return;
+ }
if (typeof configParams.sv_domain !== 'string') {
- utils.logError('User ID - merkleId submodule requires a valid sv_domain string to be defined');
- return;
+ configParams.sv_domain = merkleIdSubmodule.findRootDomain();
}
+ const configStorage = (config && config.storage) || {};
+ const resp = generateId(configParams, configStorage)
+ return {callback: resp};
+ },
+ extendId: function (config = {}, consentData, storedId) {
+ utils.logInfo('User ID - merkleId stored id ' + storedId);
+ const configParams = (config && config.params) || {};
+
if (consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies) {
utils.logError('User ID - merkleId submodule does not currently handle consent strings');
return;
}
- const url = constructUrl(configParams);
-
- const resp = function (callback) {
- const callbacks = {
- success: response => {
- let responseObj;
- if (response) {
- try {
- responseObj = JSON.parse(response);
- utils.logInfo('Merkle responseObj ' + JSON.stringify(responseObj));
- } catch (error) {
- utils.logError(error);
- }
- }
- callback(responseObj);
- },
- error: error => {
- utils.logError(`${MODULE_NAME}: merkleId fetch encountered an error`, error);
- callback();
- }
- };
- ajax(url, callbacks, undefined, {method: 'GET', withCredentials: true});
- };
- return {callback: resp};
+
+ if (typeof configParams.sv_domain !== 'string') {
+ configParams.sv_domain = merkleIdSubmodule.findRootDomain();
+ }
+ const configStorage = (config && config.storage) || {};
+ if (configStorage && configStorage.refreshInSeconds && typeof configParams.refreshInSeconds === 'number') {
+ return {id: storedId};
+ }
+ let refreshInSeconds = DEFAULT_REFRESH;
+ if (configParams && configParams.refreshInSeconds && typeof configParams.refreshInSeconds === 'number') {
+ refreshInSeconds = configParams.refreshInSeconds;
+ utils.logInfo('User ID - merkleId param refreshInSeconds' + refreshInSeconds);
+ }
+ const storedDate = new Date(storedId.date);
+ let refreshNeeded = false;
+ if (storedDate) {
+ refreshNeeded = storedDate && (Date.now() - storedDate.getTime() > refreshInSeconds * 1000);
+ if (refreshNeeded) {
+ utils.logInfo('User ID - merkleId needs refreshing id');
+ const resp = generateId(configParams, configStorage)
+ return {callback: resp};
+ }
+ }
+ utils.logInfo('User ID - merkleId not refreshed');
+ return {id: storedId};
}
+
};
submodule('userId', merkleIdSubmodule);
diff --git a/modules/mgidBidAdapter.js b/modules/mgidBidAdapter.js
deleted file mode 100644
index 957b9a1d703..00000000000
--- a/modules/mgidBidAdapter.js
+++ /dev/null
@@ -1,576 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import * as utils from '../src/utils.js';
-import {BANNER, NATIVE} from '../src/mediaTypes.js';
-import {config} from '../src/config.js';
-import { getStorageManager } from '../src/storageManager.js';
-
-const storage = getStorageManager();
-const DEFAULT_CUR = 'USD';
-const BIDDER_CODE = 'mgid';
-const ENDPOINT_URL = 'https://prebid.mgid.com/prebid/';
-const LOG_WARN_PREFIX = '[MGID warn]: ';
-const LOG_INFO_PREFIX = '[MGID info]: ';
-const NATIVE_ASSETS = {
- 'TITLE': { ID: 1, KEY: 'title', TYPE: 0 },
- 'IMAGE': { ID: 2, KEY: 'image', TYPE: 0 },
- 'ICON': { ID: 3, KEY: 'icon', TYPE: 0 },
- 'SPONSOREDBY': { ID: 4, KEY: 'sponsoredBy', TYPE: 1 }, // please note that type of SPONSORED is also 1
- 'DESC': { ID: 5, KEY: 'data', TYPE: 2 }, // please note that type of BODY is also set to 2
- 'PRICE': { ID: 6, KEY: 'price', TYPE: 6 },
- 'SALEPRICE': { ID: 7, KEY: 'saleprice', TYPE: 7 },
- 'DISPLAYURL': { ID: 8, KEY: 'displayurl', TYPE: 11 },
- 'CTA': { ID: 9, KEY: 'cta', TYPE: 12 },
- 'BODY': { ID: 10, KEY: 'body', TYPE: 2 }, // please note that type of DESC is also set to 2
- 'SPONSORED': { ID: 11, KEY: 'sponsored', TYPE: 1 }, // please note that type of SPONSOREDBY is also set to 1
-};
-const NATIVE_ASSET_IMAGE_TYPE = {
- 'ICON': 1,
- 'IMAGE': 3
-};
-const DEFAULT_IMAGE_WIDTH = 492;
-const DEFAULT_IMAGE_HEIGHT = 328;
-const DEFAULT_ICON_WIDTH = 50;
-const DEFAULT_ICON_HEIGHT = 50;
-const DEFAULT_TITLE_LENGTH = 80;
-
-let isInvalidNativeRequest = false;
-
-// check if title, image can be added with mandatory field default values
-const NATIVE_MINIMUM_REQUIRED_IMAGE_ASSETS = [
- {
- id: NATIVE_ASSETS.SPONSOREDBY.ID,
- required: true,
- data: {
- type: 1
- }
- },
- {
- id: NATIVE_ASSETS.TITLE.ID,
- required: true,
- },
- {
- id: NATIVE_ASSETS.IMAGE.ID,
- required: true,
- }
-];
-let _NATIVE_ASSET_ID_TO_KEY_MAP = {};
-let _NATIVE_ASSET_KEY_TO_ASSET_MAP = {};
-
-// loading _NATIVE_ASSET_ID_TO_KEY_MAP
-utils._each(NATIVE_ASSETS, anAsset => { _NATIVE_ASSET_ID_TO_KEY_MAP[anAsset.ID] = anAsset.KEY });
-// loading _NATIVE_ASSET_KEY_TO_ASSET_MAP
-utils._each(NATIVE_ASSETS, anAsset => { _NATIVE_ASSET_KEY_TO_ASSET_MAP[anAsset.KEY] = anAsset });
-
-export const spec = {
- VERSION: '1.4',
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, NATIVE],
- reId: /^[1-9][0-9]*$/,
- NATIVE_ASSET_ID_TO_KEY_MAP: _NATIVE_ASSET_ID_TO_KEY_MAP,
- NATIVE_ASSET_KEY_TO_ASSET_MAP: _NATIVE_ASSET_KEY_TO_ASSET_MAP,
- /**
- * 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) => {
- const banner = utils.deepAccess(bid, 'mediaTypes.banner');
- const native = utils.deepAccess(bid, 'mediaTypes.native');
- let nativeOk = utils.isPlainObject(native);
- if (nativeOk) {
- const nativeParams = utils.deepAccess(bid, 'nativeParams');
- let assetsCount = 0;
- if (utils.isPlainObject(nativeParams)) {
- for (let k in nativeParams) {
- let v = nativeParams[k];
- const supportProp = spec.NATIVE_ASSET_KEY_TO_ASSET_MAP.hasOwnProperty(k);
- if (supportProp) {
- assetsCount++
- }
- if (!utils.isPlainObject(v) || (!supportProp && utils.deepAccess(v, 'required'))) {
- nativeOk = false;
- break;
- }
- }
- }
- nativeOk = nativeOk && (assetsCount > 0);
- }
- let bannerOk = utils.isPlainObject(banner);
- if (bannerOk) {
- const sizes = utils.deepAccess(banner, 'sizes');
- bannerOk = utils.isArray(sizes) && sizes.length > 0;
- for (let f = 0; bannerOk && f < sizes.length; f++) {
- bannerOk = sizes[f].length === 2;
- }
- }
- let acc = Number(bid.params.accountId);
- let plcmt = Number(bid.params.placementId);
- return (bannerOk || nativeOk) && utils.isPlainObject(bid.params) && !!bid.adUnitCode && utils.isStr(bid.adUnitCode) && (plcmt > 0 ? bid.params.placementId.toString().search(spec.reId) === 0 : true) &&
- !!acc && acc > 0 && bid.params.accountId.toString().search(spec.reId) === 0;
- },
- /**
- * 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) => {
- utils.logInfo(LOG_INFO_PREFIX + `buildRequests`);
- if (validBidRequests.length === 0) {
- return;
- }
- const info = pageInfo();
- const page = info.location || utils.deepAccess(bidderRequest, 'refererInfo.referer') || utils.deepAccess(bidderRequest, 'refererInfo.canonicalUrl');
- const hostname = utils.parseUrl(page).hostname;
- let domain = extractDomainFromHost(hostname) || hostname;
- const accountId = setOnAny(validBidRequests, 'params.accountId');
- const muid = getLocalStorageSafely('mgMuidn');
- let url = (setOnAny(validBidRequests, 'params.bidUrl') || ENDPOINT_URL) + accountId;
- if (utils.isStr(muid) && muid.length > 0) {
- url += '?muid=' + muid;
- }
- const cur = [setOnAny(validBidRequests, 'params.currency') || setOnAny(validBidRequests, 'params.cur') || config.getConfig('currency.adServerCurrency') || DEFAULT_CUR];
- const secure = window.location.protocol === 'https:' ? 1 : 0;
- let imp = [];
- validBidRequests.forEach(bid => {
- let tagid = utils.deepAccess(bid, 'params.placementId') || 0;
- tagid = !tagid ? bid.adUnitCode : tagid + '/' + bid.adUnitCode;
- let impObj = {
- id: bid.bidId,
- tagid,
- secure,
- };
- const bidFloor = utils.deepAccess(bid, 'params.bidFloor') || utils.deepAccess(bid, 'params.bidfloor') || 0;
- if (bidFloor && utils.isNumber(bidFloor)) {
- impObj.bidfloor = bidFloor;
- }
- for (let mediaTypes in bid.mediaTypes) {
- switch (mediaTypes) {
- case BANNER:
- impObj.banner = createBannerRequest(bid);
- imp.push(impObj);
- break;
- case NATIVE:
- const native = createNativeRequest(bid.nativeParams);
- if (!isInvalidNativeRequest) {
- impObj.native = {
- 'request': native
- };
- imp.push(impObj);
- }
- break;
- }
- }
- });
-
- if (imp.length === 0) {
- return;
- }
-
- let request = {
- id: utils.deepAccess(bidderRequest, 'bidderRequestId'),
- site: {domain, page},
- cur: cur,
- geo: {utcoffset: info.timeOffset},
- device: {
- ua: navigator.userAgent,
- js: 1,
- dnt: (navigator.doNotTrack === 'yes' || navigator.doNotTrack === '1' || navigator.msDoNotTrack === '1') ? 1 : 0,
- h: screen.height,
- w: screen.width,
- language: getLanguage()
- },
- ext: {mgid_ver: spec.VERSION, prebid_ver: $$PREBID_GLOBAL$$.version},
- imp
- };
- if (bidderRequest && bidderRequest.gdprConsent) {
- request.user = {ext: {consent: bidderRequest.gdprConsent.consentString}};
- request.regs = {ext: {gdpr: (bidderRequest.gdprConsent.gdprApplies ? 1 : 0)}}
- }
- if (info.referrer) {
- request.site.ref = info.referrer
- }
- utils.logInfo(LOG_INFO_PREFIX + `buildRequest:`, request);
- return {
- method: 'POST',
- url: url,
- data: JSON.stringify(request),
- };
- },
- /**
- * 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: (serverResponse, bidRequests) => {
- utils.logInfo(LOG_INFO_PREFIX + `interpretResponse`, serverResponse);
- if (serverResponse == null || serverResponse.body == null || serverResponse.body === '' || !utils.isArray(serverResponse.body.seatbid) || !serverResponse.body.seatbid.length) {
- return;
- }
- const returnedBids = [];
- const muidn = utils.deepAccess(serverResponse.body, 'ext.muidn')
- if (utils.isStr(muidn) && muidn.length > 0) {
- setLocalStorageSafely('mgMuidn', muidn)
- }
- serverResponse.body.seatbid.forEach((bids) => {
- bids.bid.forEach((bid) => {
- const pbid = prebidBid(bid, serverResponse.body.cur);
- if (pbid.mediaType === NATIVE && utils.isEmpty(pbid.native)) {
- return;
- }
- returnedBids.push(pbid);
- })
- });
-
- utils.logInfo(LOG_INFO_PREFIX + `interpretedResponse`, returnedBids);
- return returnedBids;
- },
- onBidWon: (bid) => {
- const cpm = utils.deepAccess(bid, 'adserverTargeting.hb_pb') || '';
- if (utils.isStr(bid.nurl) && bid.nurl !== '') {
- bid.nurl = bid.nurl.replace(
- /\${AUCTION_PRICE}/,
- cpm
- );
- utils.triggerPixel(bid.nurl);
- }
- if (bid.isBurl) {
- if (bid.mediaType === BANNER) {
- bid.ad = bid.ad.replace(
- /\${AUCTION_PRICE}/,
- cpm
- )
- } else {
- bid.burl = bid.burl.replace(
- /\${AUCTION_PRICE}/,
- cpm
- );
- utils.triggerPixel(bid.burl);
- }
- }
- utils.logInfo(LOG_INFO_PREFIX + `onBidWon`);
- },
- getUserSyncs: (syncOptions, serverResponses) => {
- utils.logInfo(LOG_INFO_PREFIX + `getUserSyncs`);
- }
-};
-
-registerBidder(spec);
-
-function setOnAny(collection, key) {
- for (let i = 0, result; i < collection.length; i++) {
- result = utils.deepAccess(collection[i], key);
- if (result) {
- return result;
- }
- }
-}
-
-/**
- * Unpack the Server's Bid into a Prebid-compatible one.
- * @param serverBid
- * @return Bid
- */
-function prebidBid(serverBid, cur) {
- if (!utils.isStr(cur) || cur === '') {
- cur = DEFAULT_CUR;
- }
- const bid = {
- requestId: serverBid.impid,
- ad: serverBid.adm,
- cpm: serverBid.price,
- creativeId: serverBid.adid,
- currency: cur,
- dealId: serverBid.dealid || '',
- width: serverBid.w,
- height: serverBid.h,
- mediaType: 'banner',
- netRevenue: true,
- ttl: serverBid.ttl || 300,
- nurl: serverBid.nurl || '',
- burl: serverBid.burl || '',
- isBurl: utils.isStr(serverBid.burl) && serverBid.burl.length > 0,
- };
- setMediaType(serverBid, bid);
- switch (bid.mediaType) {
- case BANNER:
- break;
- case NATIVE:
- parseNativeResponse(serverBid, bid);
- break;
- }
- return bid;
-}
-
-function setMediaType(bid, newBid) {
- if (utils.deepAccess(bid, 'ext.crtype') === 'native') {
- newBid.mediaType = NATIVE;
- } else {
- newBid.mediaType = BANNER;
- }
-}
-
-function extractDomainFromHost(pageHost) {
- if (pageHost == 'localhost') {
- return 'localhost'
- }
- let domain = null;
- try {
- let domains = /[-\w]+\.([-\w]+|[-\w]{3,}|[-\w]{1,3}\.[-\w]{2})$/i.exec(pageHost);
- if (domains != null && domains.length > 0) {
- domain = domains[0];
- for (let i = 1; i < domains.length; i++) {
- if (domains[i].length > domain.length) {
- domain = domains[i];
- }
- }
- }
- } catch (e) {
- domain = null;
- }
- return domain;
-}
-
-function getLanguage() {
- const language = navigator.language ? 'language' : 'userLanguage';
- const lang2 = navigator[language].split('-')[0];
- if (lang2.length === 2 || lang2.length === 3) {
- return lang2;
- }
- return '';
-}
-
-function getLocalStorageSafely(key) {
- try {
- return storage.getDataFromLocalStorage(key);
- } catch (e) {
- return null;
- }
-}
-
-function setLocalStorageSafely(key, val) {
- try {
- return storage.setDataInLocalStorage(key, val);
- } catch (e) {
- return null;
- }
-}
-
-function createBannerRequest(bid) {
- const sizes = utils.deepAccess(bid, 'mediaTypes.banner.sizes');
- let format = [];
- if (sizes.length > 1) {
- for (let f = 0; f < sizes.length; f++) {
- if (sizes[f].length === 2) {
- format.push({w: sizes[f][0], h: sizes[f][1]});
- }
- }
- }
- let r = {
- w: sizes && sizes[0][0],
- h: sizes && sizes[0][1],
- };
- if (format.length) {
- r.format = format
- }
- return r
-}
-
-function createNativeRequest(params) {
- let nativeRequestObject = {
- plcmtcnt: 1,
- assets: []
- };
- for (let key in params) {
- let assetObj = {};
- if (params.hasOwnProperty(key)) {
- if (!(nativeRequestObject.assets && nativeRequestObject.assets.length > 0 && nativeRequestObject.assets.hasOwnProperty(key))) {
- switch (key) {
- case NATIVE_ASSETS.TITLE.KEY:
- assetObj = {
- id: NATIVE_ASSETS.TITLE.ID,
- required: params[key].required ? 1 : 0,
- title: {
- len: params[key].len || params[key].length || DEFAULT_TITLE_LENGTH
- }
- };
- break;
- case NATIVE_ASSETS.IMAGE.KEY:
- const wmin = params[key].wmin || params[key].minimumWidth || (utils.isArray(params[key].minsizes) && params[key].minsizes.length > 0 ? params[key].minsizes[0] : 0);
- const hmin = params[key].hmin || params[key].minimumHeight || (utils.isArray(params[key].minsizes) && params[key].minsizes.length > 1 ? params[key].minsizes[1] : 0);
- assetObj = {
- id: NATIVE_ASSETS.IMAGE.ID,
- required: params[key].required ? 1 : 0,
- img: {
- type: NATIVE_ASSET_IMAGE_TYPE.IMAGE,
- w: params[key].w || params[key].width || (utils.isArray(params[key].sizes) && params[key].sizes.length > 0 ? params[key].sizes[0] : 0),
- h: params[key].h || params[key].height || (utils.isArray(params[key].sizes) && params[key].sizes.length > 1 ? params[key].sizes[1] : 0),
- mimes: params[key].mimes,
- ext: params[key].ext,
- }
- };
- if (wmin > 0) {
- assetObj.img.wmin = wmin;
- }
- if (hmin > 0) {
- assetObj.img.hmin = hmin;
- }
- if (!assetObj.img.w) {
- assetObj.img.w = DEFAULT_IMAGE_WIDTH;
- }
- if (!assetObj.img.h) {
- assetObj.img.h = DEFAULT_IMAGE_HEIGHT;
- }
- break;
- case NATIVE_ASSETS.ICON.KEY:
- assetObj = {
- id: NATIVE_ASSETS.ICON.ID,
- required: params[key].required ? 1 : 0,
- img: {
- type: NATIVE_ASSET_IMAGE_TYPE.ICON,
- w: params[key].w || params[key].width || (utils.isArray(params[key].sizes) && params[key].sizes.length > 0 ? params[key].sizes[0] : 0),
- h: params[key].h || params[key].height || (utils.isArray(params[key].sizes) && params[key].sizes.length > 0 ? params[key].sizes[1] : 0),
- }
- };
- if (!assetObj.img.w) {
- assetObj.img.w = DEFAULT_ICON_WIDTH;
- }
- if (!assetObj.img.h) {
- assetObj.img.h = DEFAULT_ICON_HEIGHT;
- }
- break;
- case NATIVE_ASSETS.SPONSORED.KEY:
- case NATIVE_ASSETS.SPONSOREDBY.KEY:
- case NATIVE_ASSETS.PRICE.KEY:
- case NATIVE_ASSETS.SALEPRICE.KEY:
- case NATIVE_ASSETS.DESC.KEY:
- case NATIVE_ASSETS.BODY.KEY:
- case NATIVE_ASSETS.DISPLAYURL.KEY:
- case NATIVE_ASSETS.CTA.KEY:
- assetObj = commonNativeRequestObject(spec.NATIVE_ASSET_KEY_TO_ASSET_MAP[key], params);
- break;
- default:
- if (params[key].required) {
- isInvalidNativeRequest = true;
- return;
- }
- }
- }
- }
- if (assetObj.id) {
- nativeRequestObject.assets[nativeRequestObject.assets.length] = assetObj;
- }
- }
-
- // for native image adtype prebid has to have few required assests i.e. title,sponsoredBy, image
- // if any of these are missing from the request then request will not be sent
- let requiredAssetCount = NATIVE_MINIMUM_REQUIRED_IMAGE_ASSETS.length;
- let presentrequiredAssetCount = 0;
- NATIVE_MINIMUM_REQUIRED_IMAGE_ASSETS.forEach(ele => {
- let lengthOfExistingAssets = nativeRequestObject.assets.length;
- for (let i = 0; i < lengthOfExistingAssets; i++) {
- if (ele.id === nativeRequestObject.assets[i].id) {
- presentrequiredAssetCount++;
- break;
- } else {
- if (ele.id === 4 && nativeRequestObject.assets[i].id === 11) {
- if (utils.deepAccess(nativeRequestObject.assets[i], 'data.type') === ele.data.type) {
- presentrequiredAssetCount++;
- break;
- }
- }
- }
- }
- });
- isInvalidNativeRequest = requiredAssetCount !== presentrequiredAssetCount;
- return nativeRequestObject;
-}
-
-function commonNativeRequestObject(nativeAsset, params) {
- const key = nativeAsset.KEY;
- return {
- id: nativeAsset.ID,
- required: params[key].required ? 1 : 0,
- data: {
- type: nativeAsset.TYPE,
- len: params[key].len,
- ext: params[key].ext
- }
- };
-}
-
-function parseNativeResponse(bid, newBid) {
- newBid.native = {};
- if (bid.hasOwnProperty('adm')) {
- let adm = '';
- try {
- adm = JSON.parse(bid.adm);
- } catch (ex) {
- utils.logWarn(LOG_WARN_PREFIX + 'Error: Cannot parse native response for ad response: ' + newBid.adm);
- return;
- }
- if (adm && adm.native && adm.native.assets && adm.native.assets.length > 0) {
- newBid.mediaType = NATIVE;
- for (let i = 0, len = adm.native.assets.length; i < len; i++) {
- switch (adm.native.assets[i].id) {
- case NATIVE_ASSETS.TITLE.ID:
- newBid.native.title = adm.native.assets[i].title && adm.native.assets[i].title.text;
- break;
- case NATIVE_ASSETS.IMAGE.ID:
- newBid.native.image = {
- url: adm.native.assets[i].img && adm.native.assets[i].img.url,
- height: adm.native.assets[i].img && adm.native.assets[i].img.h,
- width: adm.native.assets[i].img && adm.native.assets[i].img.w,
- };
- break;
- case NATIVE_ASSETS.ICON.ID:
- newBid.native.icon = {
- url: adm.native.assets[i].img && adm.native.assets[i].img.url,
- height: adm.native.assets[i].img && adm.native.assets[i].img.h,
- width: adm.native.assets[i].img && adm.native.assets[i].img.w,
- };
- break;
- case NATIVE_ASSETS.SPONSOREDBY.ID:
- case NATIVE_ASSETS.SPONSORED.ID:
- case NATIVE_ASSETS.PRICE:
- case NATIVE_ASSETS.SALEPRICE.ID:
- case NATIVE_ASSETS.DESC.ID:
- case NATIVE_ASSETS.BODY.ID:
- case NATIVE_ASSETS.DISPLAYURL.ID:
- case NATIVE_ASSETS.CTA.ID:
- newBid.native[spec.NATIVE_ASSET_ID_TO_KEY_MAP[adm.native.assets[i].id]] = adm.native.assets[i].data && adm.native.assets[i].data.value;
- break;
- }
- }
- newBid.native.clickUrl = adm.native.link && adm.native.link.url;
- newBid.native.clickTrackers = (adm.native.link && adm.native.link.clicktrackers) || [];
- newBid.native.impressionTrackers = adm.native.imptrackers || [];
- newBid.native.jstracker = adm.native.jstracker || [];
- newBid.width = 0;
- newBid.height = 0;
- }
- }
-}
-
-function pageInfo() {
- var w, d, l, r, m, p, t;
- for (w = window, d = w.document, l = d.location.href, r = d.referrer, m = 0, t = new Date(); w !== w.parent;) {
- try {
- p = w.parent; l = p.location.href; r = p.document.referrer; w = p;
- } catch (e) {
- m = top !== w.parent ? 2 : 1;
- break
- }
- }
- return {
- location: l,
- referrer: r || '',
- masked: m,
- wWidth: w.innerWidth,
- wHeight: w.innerHeight,
- date: t.toUTCString(),
- timeOffset: t.getTimezoneOffset()
- };
-}
diff --git a/modules/microadBidAdapter.js b/modules/microadBidAdapter.js
index 9611946b495..c78a66aecee 100644
--- a/modules/microadBidAdapter.js
+++ b/modules/microadBidAdapter.js
@@ -1,5 +1,6 @@
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER } from '../src/mediaTypes.js';
+import * as utils from '../src/utils.js';
const BIDDER_CODE = 'microad';
@@ -81,6 +82,11 @@ export const spec = {
}
}
+ const idlEnv = utils.deepAccess(bid, 'userId.idl_env')
+ if (!utils.isEmpty(idlEnv) && utils.isStr(idlEnv)) {
+ params['idl_env'] = idlEnv
+ }
+
requests.push({
method: 'GET',
url: ENDPOINT_URLS[ENVIRONMENT],
@@ -105,6 +111,7 @@ export const spec = {
creativeId: body.creativeId,
netRevenue: body.netRevenue,
currency: body.currency,
+ meta: body.meta || { advertiserDomains: [] }
};
if (body.dealId) {
diff --git a/modules/missenaBidAdapter.js b/modules/missenaBidAdapter.js
deleted file mode 100644
index 2b1d6bdb118..00000000000
--- a/modules/missenaBidAdapter.js
+++ /dev/null
@@ -1,94 +0,0 @@
-import * as utils from '../src/utils.js';
-import { BANNER } from '../src/mediaTypes.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'missena';
-const ENDPOINT_URL = 'https://bid.missena.io/';
-
-export const spec = {
- aliases: [BIDDER_CODE],
- code: BIDDER_CODE,
- gvlid: 687,
- supportedMediaTypes: [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) {
- return typeof bid == 'object' && !!bid.params.apiKey;
- },
-
- /**
- * 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) {
- return validBidRequests.map((bidRequest) => {
- const payload = {
- request_id: bidRequest.bidId,
- timeout: bidderRequest.timeout,
- };
-
- if (bidderRequest && bidderRequest.refererInfo) {
- payload.referer = bidderRequest.refererInfo.referer;
- payload.referer_canonical = bidderRequest.refererInfo.canonicalUrl;
- }
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- payload.consent_string = bidderRequest.gdprConsent.consentString;
- payload.consent_required = bidderRequest.gdprConsent.gdprApplies;
- }
-
- return {
- method: 'POST',
- url:
- ENDPOINT_URL +
- '?' +
- utils.formatQS({
- t: bidRequest.params.apiKey,
- }),
- data: JSON.stringify(payload),
- };
- });
- },
-
- /**
- * 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, bidRequest) {
- const bidResponses = [];
- const response = serverResponse.body;
-
- if (response && !response.timeout && !!response.ad) {
- bidResponses.push(response);
- }
-
- return bidResponses;
- },
-
- /**
- * Register bidder specific code, which will execute if bidder timed out after an auction
- * @param {data} Containing timeout specific data
- */
- onTimeout: function onTimeout(timeoutData) {
- utils.logInfo('Missena - Timeout from adapter', timeoutData);
- },
-
- /**
- * Register bidder specific code, which@ will execute if a bid from this bidder won the auction
- * @param {Bid} The bid that won the auction
- */
- onBidWon: function (bid) {
- utils.logInfo('Missena - Bid won', bid);
- },
-};
-
-registerBidder(spec);
diff --git a/modules/mobfoxBidAdapter.js b/modules/mobfoxBidAdapter.js
deleted file mode 100644
index 7c356e71089..00000000000
--- a/modules/mobfoxBidAdapter.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const utils = require('../src/utils.js');
-const BIDDER_CODE = 'mobfox';
-const BID_REQUEST_BASE_URL = 'https://my.mobfox.com/request.php';
-const CPM_HEADER = 'X-Pricing-CPM';
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['mf'], // short code
- isBidRequestValid: function (bid) {
- return bid.params.s !== null && bid.params.s !== undefined;
- },
- buildRequests: function (validBidRequests) {
- if (validBidRequests.length > 1) {
- throw ('invalid number of valid bid requests, expected 1 element')
- }
-
- let bidParams = validBidRequests[0].params;
- let bid = validBidRequests[0];
-
- let params = {
- // -------------------- Mandatory Parameters ------------------
- rt: bidParams.rt || 'api-fetchip',
- r_type: bidParams.r_type || 'banner',
- r_resp: bidParams.r_resp || 'json', // string | vast20
- // i: bidParams.i || undefined , // string | 69.197.148.18
- s: bidParams.s, // string | 80187188f458cfde788d961b6882fd53
- u: bidParams.u || window.navigator.userAgent, // string
-
- // ------------------- Global Parameters ----------------------
- adspace_width: bidParams.adspace_width || bid.sizes[0][0], // integer | 320
- adspace_height: bidParams.adspace_height || bid.sizes[0][1], // integer | 48
- r_floor: bidParams.r_floor || undefined, // 0.8
-
- o_andadvid: bidParams.o_andadvid || undefined, // 'c6292267-56ad-4326-965d-deef6fcd5er9'
- longitude: bidParams.longitude || undefined, // 12.12
- latitude: bidParams.latitude || undefined, // 280.12
- demo_age: bidParams.demo_age || undefined, // 1978
-
- // ------------------- banner / interstitial ----------------------
- adspace_strict: bidParams.adspace_strict || undefined,
-
- // ------------------- interstitial / video ----------------------
- imp_instl: bidParams.imp_instl || undefined, // integer | 1
-
- // ------------------- mraid ----------------------
- c_mraid: bidParams.c_mraid || undefined, // integer | 1
-
- // ------------------- video ----------------------
- v_dur_min: bidParams.v_dur_min || undefined, // integer | 0
- v_dur_max: bidParams.v_dur_max || undefined, // integer | 999
- v_autoplay: bidParams.v_autoplay || undefined, // integer | 1
- v_startmute: bidParams.v_startmute || undefined, // integer | 0
- v_rewarded: bidParams.v_rewarded || undefined, // integer | 0
- v_api: bidParams.v_api || undefined, // string | vpaid20
- n_ver: bidParams.n_ver || undefined, //
- n_adunit: bidParams.n_adunit || undefined, //
- n_layout: bidParams.n_layout || undefined, //
- n_context: bidParams.n_context || undefined, //
- n_plcmttype: bidParams.n_plcmttype || undefined, //
- n_img_icon_req: bidParams.n_img_icon_req || undefined, // boolean0
- n_img_icon_size: bidParams.n_img_icon_size || undefined, // string80
- n_img_large_req: bidParams.n_img_large_req || undefined, // boolean0
- n_img_large_w: bidParams.n_img_large_w || undefined, // integer1200
- n_img_large_h: bidParams.n_img_large_h || undefined, // integer627
- n_title_req: bidParams.n_title_req || undefined, // boolean0
- n_title_len: bidParams.n_title_len || undefined, // string25
- n_desc_req: bidParams.n_desc_req || undefined, // boolean0
- n_desc_len: bidParams.n_desc_len || undefined, // string140
- n_rating_req: bidParams.n_rating_req || undefined
- };
-
- let payloadString = buildPayloadString(params);
-
- return {
- method: 'GET',
- url: BID_REQUEST_BASE_URL,
- data: payloadString,
- requestId: bid.bidId
- };
- },
- interpretResponse: function (serverResponse, bidRequest) {
- const bidResponses = [];
- let serverResponseBody = serverResponse.body;
-
- if (!serverResponseBody || serverResponseBody.error) {
- let errorMessage = `in response for ${BIDDER_CODE} adapter`;
- if (serverResponseBody && serverResponseBody.error) {
- errorMessage += `: ${serverResponseBody.error}`;
- }
- utils.logError(errorMessage);
- return bidResponses;
- }
- try {
- let serverResponseHeaders = serverResponse.headers;
- let bidRequestData = bidRequest.data.split('&');
- const bidResponse = {
- requestId: bidRequest.requestId,
- cpm: serverResponseHeaders.get(CPM_HEADER),
- width: bidRequestData[5].split('=')[1],
- height: bidRequestData[6].split('=')[1],
- creativeId: bidRequestData[3].split('=')[1],
- currency: 'USD',
- netRevenue: true,
- ttl: 360,
- referrer: serverResponseBody.request.clickurl,
- ad: serverResponseBody.request.htmlString
- };
- bidResponses.push(bidResponse);
- } catch (e) {
- throw 'could not build bid response: ' + e;
- }
- return bidResponses;
- }
-};
-
-function buildPayloadString(params) {
- for (let key in params) {
- if (params.hasOwnProperty(key)) {
- if (params[key] === undefined) {
- delete params[key];
- } else {
- params[key] = encodeURIComponent(params[key]);
- }
- }
- }
-
- return utils._map(Object.keys(params), key => `${key}=${params[key]}`)
- .join('&')
-}
-
-registerBidder(spec);
diff --git a/modules/mobfoxpbBidAdapter.js b/modules/mobfoxpbBidAdapter.js
deleted file mode 100644
index c7e96b95179..00000000000
--- a/modules/mobfoxpbBidAdapter.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'mobfoxpb';
-const AD_URL = 'https://bes.mobfox.com/?c=o&m=multi';
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId ||
- !bid.ttl || !bid.currency) {
- return false;
- }
- switch (bid.mediaType) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- return Boolean(bid.native && bid.native.impressionTrackers);
- default:
- return false;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(parseInt(bid.params.placementId)));
- },
-
- buildRequests: (validBidRequests = [], bidderRequest) => {
- const winTop = utils.getWindowTop();
- const location = winTop.location;
- const placements = [];
- const request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language.split('-')[0] : '',
- 'secure': 1,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
-
- if (bidderRequest) {
- if (bidderRequest.uspConsent) {
- request.ccpa = bidderRequest.uspConsent;
- }
- if (bidderRequest.gdprConsent) {
- request.gdpr = bidderRequest.gdprConsent
- }
- }
-
- const len = validBidRequests.length;
- for (let i = 0; i < len; i++) {
- const bid = validBidRequests[i];
- const placement = {
- placementId: bid.params.placementId,
- bidId: bid.bidId,
- schain: bid.schain || {},
- };
- const mediaType = bid.mediaTypes
-
- if (mediaType && mediaType[BANNER] && mediaType[BANNER].sizes) {
- placement.sizes = mediaType[BANNER].sizes;
- placement.traffic = BANNER;
- } else if (mediaType && mediaType[VIDEO] && mediaType[VIDEO].playerSize) {
- placement.wPlayer = mediaType[VIDEO].playerSize[0];
- placement.hPlayer = mediaType[VIDEO].playerSize[1];
- placement.traffic = VIDEO;
- } else if (mediaType && mediaType[NATIVE]) {
- placement.native = mediaType[NATIVE];
- placement.traffic = NATIVE;
- }
- placements.push(placement);
- }
-
- return {
- method: 'POST',
- url: AD_URL,
- data: request
- };
- },
-
- interpretResponse: (serverResponse) => {
- let response = [];
- for (let i = 0; i < serverResponse.body.length; i++) {
- let resItem = serverResponse.body[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- return response;
- },
-};
-
-registerBidder(spec);
diff --git a/modules/mobsmartBidAdapter.js b/modules/mobsmartBidAdapter.js
deleted file mode 100644
index e5ff38ec69a..00000000000
--- a/modules/mobsmartBidAdapter.js
+++ /dev/null
@@ -1,94 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { config } from '../src/config.js';
-
-const BIDDER_CODE = 'mobsmart';
-const ENDPOINT = 'https://prebid.mobsmart.net/prebid/endpoint';
-
-export const spec = {
- code: BIDDER_CODE,
- isBidRequestValid: function(bid) {
- if (bid.bidder !== BIDDER_CODE) {
- return false;
- }
-
- return true;
- },
- buildRequests: function(validBidRequests, bidderRequest) {
- const timeout = config.getConfig('bidderTimeout');
- const referrer = encodeURIComponent(bidderRequest.refererInfo.referer);
-
- return validBidRequests.map(bidRequest => {
- const adUnit = {
- code: bidRequest.adUnitCode,
- bids: {
- bidder: bidRequest.bidder,
- params: bidRequest.params
- },
- mediaTypes: bidRequest.mediaTypes
- };
-
- if (bidRequest.hasOwnProperty('sizes') && bidRequest.sizes.length > 0) {
- adUnit.sizes = bidRequest.sizes;
- }
-
- const request = {
- auctionId: bidRequest.auctionId,
- requestId: bidRequest.bidId,
- bidRequestsCount: bidRequest.bidRequestsCount,
- bidderRequestId: bidRequest.bidderRequestId,
- transactionId: bidRequest.transactionId,
- referrer: referrer,
- timeout: timeout,
- adUnit: adUnit
- };
-
- if (bidRequest.userId && bidRequest.userId.pubcid) {
- request.userId = {pubcid: bidRequest.userId.pubcid};
- }
-
- return {
- method: 'POST',
- url: ENDPOINT,
- data: JSON.stringify(request)
- }
- });
- },
- interpretResponse: function(serverResponse) {
- const bidResponses = [];
-
- if (serverResponse.body) {
- const response = serverResponse.body;
- const bidResponse = {
- requestId: response.requestId,
- cpm: response.cpm,
- width: response.width,
- height: response.height,
- creativeId: response.creativeId,
- currency: response.currency,
- netRevenue: response.netRevenue,
- ttl: response.ttl,
- ad: response.ad,
- };
- bidResponses.push(bidResponse);
- }
-
- return bidResponses;
- },
- getUserSyncs: function(syncOptions, serverResponses) {
- let syncs = [];
- if (syncOptions.iframeEnabled) {
- syncs.push({
- type: 'iframe',
- url: 'https://tags.mobsmart.net/tags/iframe'
- });
- } else if (syncOptions.pixelEnabled) {
- syncs.push({
- type: 'image',
- url: 'https://tags.mobsmart.net/tags/image'
- });
- }
-
- return syncs;
- }
-}
-registerBidder(spec);
diff --git a/modules/mytargetBidAdapter.js b/modules/mytargetBidAdapter.js
deleted file mode 100644
index bcf8e7ad17f..00000000000
--- a/modules/mytargetBidAdapter.js
+++ /dev/null
@@ -1,113 +0,0 @@
-import * as utils from '../src/utils.js';
-import { config } from '../src/config.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'mytarget';
-const BIDDER_URL = 'https://ad.mail.ru/hbid_prebid/';
-const DEFAULT_CURRENCY = 'RUB';
-const DEFAULT_TTL = 180;
-
-function buildPlacement(bidRequest) {
- let { bidId, params } = bidRequest;
- let { placementId, position, response, bidfloor } = params;
- let placement = {
- placementId,
- id: bidId,
- position: position || 0,
- response: response || 0
- };
-
- if (typeof bidfloor !== 'undefined') {
- placement.bidfloor = bidfloor;
- }
-
- return placement;
-}
-
-function getSiteName(referrer) {
- let sitename = config.getConfig('mytarget.sitename');
-
- if (!sitename) {
- sitename = utils.parseUrl(referrer).hostname;
- }
-
- return sitename;
-}
-
-function getCurrency() {
- let currency = config.getConfig('currency.adServerCurrency');
-
- return (currency === 'USD') ? currency : DEFAULT_CURRENCY;
-}
-
-function generateRandomId() {
- return Math.random().toString(16).substring(2);
-}
-
-export const spec = {
- code: BIDDER_CODE,
-
- isBidRequestValid: function(bid) {
- return !!bid.params.placementId;
- },
-
- buildRequests: function(validBidRequests, bidderRequest) {
- let referrer = '';
-
- if (bidderRequest && bidderRequest.refererInfo) {
- referrer = bidderRequest.refererInfo.referer;
- }
-
- const payload = {
- places: utils._map(validBidRequests, buildPlacement),
- site: {
- sitename: getSiteName(referrer),
- page: referrer
- },
- settings: {
- currency: getCurrency(),
- windowSize: {
- width: window.screen.width,
- height: window.screen.height
- }
- }
- };
-
- return {
- method: 'POST',
- url: BIDDER_URL,
- data: payload,
- };
- },
-
- interpretResponse: function(serverResponse, bidRequest) {
- let { body } = serverResponse;
-
- if (body.bids) {
- return utils._map(body.bids, (bid) => {
- let bidResponse = {
- requestId: bid.id,
- cpm: bid.price,
- width: bid.size.width,
- height: bid.size.height,
- ttl: bid.ttl || DEFAULT_TTL,
- currency: bid.currency || DEFAULT_CURRENCY,
- creativeId: bid.creativeId || generateRandomId(),
- netRevenue: true
- }
-
- if (bid.adm) {
- bidResponse.ad = bid.adm;
- } else {
- bidResponse.adUrl = bid.displayUrl;
- }
-
- return bidResponse;
- });
- }
-
- return [];
- }
-}
-
-registerBidder(spec);
diff --git a/modules/nafdigitalBidAdapter.js b/modules/nafdigitalBidAdapter.js
deleted file mode 100644
index d64e079b52a..00000000000
--- a/modules/nafdigitalBidAdapter.js
+++ /dev/null
@@ -1,245 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER } from '../src/mediaTypes.js';
-import { config } from '../src/config.js';
-
-const BIDDER_CODE = 'nafdigital';
-const URL = 'https://nafdigitalbidder.com/hb';
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER],
- isBidRequestValid,
- buildRequests,
- interpretResponse,
- getUserSyncs
-};
-
-function buildRequests(bidReqs, bidderRequest) {
- try {
- let referrer = '';
- if (bidderRequest && bidderRequest.refererInfo) {
- referrer = bidderRequest.refererInfo.referer;
- }
- const nafdigitalImps = [];
- const publisherId = utils.getBidIdParameter('publisherId', bidReqs[0].params);
- utils._each(bidReqs, 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));
- const processedSizes = bid.sizes.map(size => ({w: parseInt(size[0], 10), h: parseInt(size[1], 10)}));
-
- const element = document.getElementById(bid.adUnitCode);
- const minSize = _getMinSize(processedSizes);
- const viewabilityAmount = _isViewabilityMeasurable(element)
- ? _getViewability(element, utils.getWindowTop(), minSize)
- : 'na';
- const viewabilityAmountRounded = isNaN(viewabilityAmount) ? viewabilityAmount : Math.round(viewabilityAmount);
-
- const imp = {
- id: bid.bidId,
- banner: {
- format: processedSizes,
- ext: {
- viewability: viewabilityAmountRounded
- }
- },
- tagid: String(bid.adUnitCode)
- };
- const bidFloor = utils.getBidIdParameter('bidFloor', bid.params);
- if (bidFloor) {
- imp.bidfloor = bidFloor;
- }
- nafdigitalImps.push(imp);
- });
- const nafdigitalBidReq = {
- id: utils.getUniqueIdentifierStr(),
- imp: nafdigitalImps,
- site: {
- domain: utils.parseUrl(referrer).host,
- page: referrer,
- publisher: {
- id: publisherId
- }
- },
- device: {
- devicetype: _getDeviceType(),
- w: screen.width,
- h: screen.height
- },
- tmax: config.getConfig('bidderTimeout')
- };
-
- return {
- method: 'POST',
- url: URL,
- data: JSON.stringify(nafdigitalBidReq),
- options: {contentType: 'text/plain', withCredentials: false}
- };
- } catch (e) {
- utils.logError(e, {bidReqs, bidderRequest});
- }
-}
-
-function isBidRequestValid(bid) {
- if (bid.bidder !== BIDDER_CODE || typeof bid.params === 'undefined') {
- return false;
- }
-
- if (typeof bid.params.publisherId === 'undefined') {
- return false;
- }
-
- return true;
-}
-
-function interpretResponse(serverResponse) {
- if (!serverResponse.body || typeof serverResponse.body != 'object') {
- utils.logWarn('NAF digital server returned empty/non-json response: ' + JSON.stringify(serverResponse.body));
- return [];
- }
- const { body: {id, seatbid} } = serverResponse;
- try {
- const nafdigitalBidResponses = [];
- if (id &&
- seatbid &&
- seatbid.length > 0 &&
- seatbid[0].bid &&
- seatbid[0].bid.length > 0) {
- seatbid[0].bid.map(nafdigitalBid => {
- nafdigitalBidResponses.push({
- requestId: nafdigitalBid.impid,
- cpm: parseFloat(nafdigitalBid.price),
- width: parseInt(nafdigitalBid.w),
- height: parseInt(nafdigitalBid.h),
- creativeId: nafdigitalBid.crid || nafdigitalBid.id,
- currency: 'USD',
- netRevenue: true,
- mediaType: BANNER,
- ad: _getAdMarkup(nafdigitalBid),
- ttl: 60
- });
- });
- }
- return nafdigitalBidResponses;
- } catch (e) {
- utils.logError(e, {id, seatbid});
- }
-}
-
-// Don't do user sync for now
-function getUserSyncs(syncOptions, responses, gdprConsent) {
- return [];
-}
-
-function _isMobile() {
- return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
-}
-
-function _isConnectedTV() {
- return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
-}
-
-function _getDeviceType() {
- return _isMobile() ? 1 : _isConnectedTV() ? 3 : 2;
-}
-
-function _getAdMarkup(bid) {
- let adm = bid.adm;
- if ('nurl' in bid) {
- adm += utils.createTrackPixelHtml(bid.nurl);
- }
- return adm;
-}
-
-function _isViewabilityMeasurable(element) {
- return !_isIframe() && element !== null;
-}
-
-function _getViewability(element, topWin, { w, h } = {}) {
- return utils.getWindowTop().document.visibilityState === 'visible'
- ? _getPercentInView(element, topWin, { w, h })
- : 0;
-}
-
-function _isIframe() {
- try {
- return utils.getWindowSelf() !== utils.getWindowTop();
- } catch (e) {
- return true;
- }
-}
-
-function _getMinSize(sizes) {
- return sizes.reduce((min, size) => size.h * size.w < min.h * min.w ? size : min);
-}
-
-function _getBoundingBox(element, { w, h } = {}) {
- let { width, height, left, top, right, bottom } = element.getBoundingClientRect();
-
- if ((width === 0 || height === 0) && w && h) {
- width = w;
- height = h;
- right = left + w;
- bottom = top + h;
- }
-
- return { width, height, left, top, right, bottom };
-}
-
-function _getIntersectionOfRects(rects) {
- const bbox = {
- left: rects[0].left,
- right: rects[0].right,
- top: rects[0].top,
- bottom: rects[0].bottom
- };
-
- for (let i = 1; i < rects.length; ++i) {
- bbox.left = Math.max(bbox.left, rects[i].left);
- bbox.right = Math.min(bbox.right, rects[i].right);
-
- if (bbox.left >= bbox.right) {
- return null;
- }
-
- bbox.top = Math.max(bbox.top, rects[i].top);
- bbox.bottom = Math.min(bbox.bottom, rects[i].bottom);
-
- if (bbox.top >= bbox.bottom) {
- return null;
- }
- }
-
- bbox.width = bbox.right - bbox.left;
- bbox.height = bbox.bottom - bbox.top;
-
- return bbox;
-}
-
-function _getPercentInView(element, topWin, { w, h } = {}) {
- const elementBoundingBox = _getBoundingBox(element, { w, h });
-
- // Obtain the intersection of the element and the viewport
- const elementInViewBoundingBox = _getIntersectionOfRects([ {
- left: 0,
- top: 0,
- right: topWin.innerWidth,
- bottom: topWin.innerHeight
- }, elementBoundingBox ]);
-
- let elementInViewArea, elementTotalArea;
-
- if (elementInViewBoundingBox !== null) {
- // Some or all of the element is in view
- elementInViewArea = elementInViewBoundingBox.width * elementInViewBoundingBox.height;
- elementTotalArea = elementBoundingBox.width * elementBoundingBox.height;
-
- return ((elementInViewArea / elementTotalArea) * 100);
- }
-
- // No overlap between element and the viewport; therefore, the element
- // lies completely out of view
- return 0;
-}
-
-registerBidder(spec);
diff --git a/modules/nanointeractiveBidAdapter.js b/modules/nanointeractiveBidAdapter.js
deleted file mode 100644
index 42a343efc03..00000000000
--- a/modules/nanointeractiveBidAdapter.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import * as utils from '../src/utils.js';
-import {config} from '../src/config.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { getStorageManager } from '../src/storageManager.js';
-
-const storage = getStorageManager();
-
-export const BIDDER_CODE = 'nanointeractive';
-export const END_POINT_URL = 'https://ad.audiencemanager.de';
-
-export const SSP_PLACEMENT_ID = 'pid';
-export const NQ = 'nq';
-export const NQ_NAME = 'name';
-export const CATEGORY = 'category';
-export const CATEGORY_NAME = 'categoryName';
-export const SUB_ID = 'subId';
-export const REF = 'ref';
-export const LOCATION = 'loc';
-
-var nanoPid = '5a1ec660eb0a191dfa591172';
-
-export const spec = {
-
- code: BIDDER_CODE,
- aliases: ['ni'],
-
- isBidRequestValid(bid) {
- const pid = bid.params[SSP_PLACEMENT_ID];
- return !!(pid);
- },
-
- buildRequests(validBidRequests, bidderRequest) {
- let payload = [];
- validBidRequests.forEach(
- bid => payload.push(createSingleBidRequest(bid, bidderRequest))
- );
- const url = getEndpointUrl() + '/hb';
-
- return {
- method: 'POST',
- url: url,
- data: JSON.stringify(payload)
- };
- },
- interpretResponse(serverResponse) {
- const bids = [];
- serverResponse.body.forEach(serverBid => {
- if (isEngineResponseValid(serverBid)) {
- bids.push(createSingleBidResponse(serverBid));
- }
- });
- return bids;
- },
- getUserSyncs: function(syncOptions) {
- const syncs = [];
- if (syncOptions.iframeEnabled) {
- syncs.push({
- type: 'iframe',
- url: getEndpointUrl() + '/hb/cookieSync/' + nanoPid
- });
- }
-
- if (syncOptions.pixelEnabled) {
- syncs.push({
- type: 'image',
- url: getEndpointUrl() + '/hb/cookieSync/' + nanoPid
- });
- }
- return syncs;
- }
-
-};
-
-function createSingleBidRequest(bid, bidderRequest) {
- const location = utils.deepAccess(bidderRequest, 'refererInfo.referer');
- const origin = utils.getOrigin();
-
- nanoPid = bid.params[SSP_PLACEMENT_ID] || nanoPid;
-
- const data = {
- [SSP_PLACEMENT_ID]: bid.params[SSP_PLACEMENT_ID],
- [NQ]: [createNqParam(bid)],
- [CATEGORY]: [createCategoryParam(bid)],
- [SUB_ID]: createSubIdParam(bid),
- [REF]: createRefParam(),
- sizes: bid.sizes.map(value => value[0] + 'x' + value[1]),
- bidId: bid.bidId,
- cors: origin,
- [LOCATION]: location,
- lsUserId: getLsUserId()
- };
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- data['gdprConsent'] = bidderRequest.gdprConsent.consentString;
- data['gdprApplies'] = (bidderRequest.gdprConsent.gdprApplies) ? '1' : '0';
- }
-
- return data;
-}
-
-function createSingleBidResponse(serverBid) {
- if (serverBid.userId) {
- storage.setDataInLocalStorage('lsUserId', serverBid.userId);
- }
- return {
- requestId: serverBid.id,
- cpm: serverBid.cpm,
- width: serverBid.width,
- height: serverBid.height,
- ad: serverBid.ad,
- ttl: serverBid.ttl,
- creativeId: serverBid.creativeId,
- netRevenue: serverBid.netRevenue || true,
- currency: serverBid.currency
- };
-}
-
-function createNqParam(bid) {
- return bid.params[NQ_NAME] ? utils.getParameterByName(bid.params[NQ_NAME]) : bid.params[NQ] || null;
-}
-
-function createCategoryParam(bid) {
- return bid.params[CATEGORY_NAME] ? utils.getParameterByName(bid.params[CATEGORY_NAME]) : bid.params[CATEGORY] || null;
-}
-
-function createSubIdParam(bid) {
- return bid.params[SUB_ID] || null;
-}
-
-function createRefParam() {
- try {
- return window.top.document.referrer;
- } catch (ex) {
- return document.referrer;
- }
-}
-
-function isEngineResponseValid(response) {
- return !!response.cpm && !!response.ad;
-}
-
-/**
- * Used mainly for debugging
- *
- * @returns string
- */
-function getEndpointUrl() {
- const nanoConfig = config.getConfig('nano');
- return (nanoConfig && nanoConfig['endpointUrl']) || END_POINT_URL;
-}
-
-function getLsUserId() {
- if (storage.getDataFromLocalStorage('lsUserId') != null) {
- return storage.getDataFromLocalStorage('lsUserId');
- }
- return null;
-}
-
-registerBidder(spec);
diff --git a/modules/nasmediaAdmixerBidAdapter.js b/modules/nasmediaAdmixerBidAdapter.js
deleted file mode 100644
index fd7a7baa58a..00000000000
--- a/modules/nasmediaAdmixerBidAdapter.js
+++ /dev/null
@@ -1,85 +0,0 @@
-
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import {BANNER} from '../src/mediaTypes.js';
-
-const ADMIXER_ENDPOINT = 'https://adn.admixer.co.kr:10443/prebid/ad_req';
-const BIDDER_CODE = 'nasmediaAdmixer';
-
-const DEFAULT_BID_TTL = 360;
-const DEFAULT_CURRENCY = 'USD';
-const DEFAULT_REVENUE = false;
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER],
-
- isBidRequestValid: function (bid) {
- return !!(bid && bid.params && bid.params.media_key && bid.params.adunit_id);
- },
-
- buildRequests: function (validBidRequests, bidderRequest) {
- return validBidRequests.map(bid => {
- const payload = {
- media_key: bid.params.media_key,
- adunit_id: bid.params.adunit_id,
- req_id: bid.bidId,
- referrer: bidderRequest.refererInfo.referer,
- os: getOs(),
- platform: getPlatform(),
- };
-
- return {
- method: 'GET',
- url: ADMIXER_ENDPOINT,
- data: payload,
- }
- })
- },
-
- interpretResponse: function (serverResponse, bidRequest) {
- const serverBody = serverResponse.body;
- const bidResponses = [];
-
- if (serverBody && serverBody.error_code === 0 && serverBody.body && serverBody.body.length > 0) {
- let bidData = serverBody.body[0];
-
- const bidResponse = {
- ad: bidData.ad,
- requestId: serverBody.req_id,
- creativeId: bidData.ad_id,
- cpm: bidData.cpm,
- width: bidData.width,
- height: bidData.height,
- currency: bidData.currency ? bidData.currency : DEFAULT_CURRENCY,
- netRevenue: DEFAULT_REVENUE,
- ttl: DEFAULT_BID_TTL
- };
-
- bidResponses.push(bidResponse);
- }
- return bidResponses;
- }
-}
-
-function getOs() {
- let ua = navigator.userAgent;
- if (ua.match(/(iPhone|iPod|iPad)/)) {
- return 'ios';
- } else if (ua.match(/Android/)) {
- return 'android';
- } else if (ua.match(/Window/)) {
- return 'windows';
- } else {
- return 'etc';
- }
-}
-
-function getPlatform() {
- return (isMobile()) ? 'm_web' : 'pc_web';
-}
-
-function isMobile() {
- return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent.toLowerCase());
-}
-
-registerBidder(spec);
diff --git a/modules/nativoBidAdapter.js b/modules/nativoBidAdapter.js
index fc0925bf2ca..880ff4b6a8e 100644
--- a/modules/nativoBidAdapter.js
+++ b/modules/nativoBidAdapter.js
@@ -11,6 +11,7 @@ const TIME_TO_LIVE = 360
const SUPPORTED_AD_TYPES = [BANNER]
const bidRequestMap = {}
+const adUnitsRequested = {}
// Prebid adapter referrence doc: https://docs.prebid.org/dev-docs/bidder-adaptor.html
@@ -57,6 +58,8 @@ export const spec = {
// Build adUnit data
const adUnitData = {
adUnits: validBidRequests.map((adUnit) => {
+ // Track if we've already requested for this ad unit code
+ adUnitsRequested[adUnit.adUnitCode] = adUnitsRequested[adUnit.adUnitCode] !== undefined ? adUnitsRequested[adUnit.adUnitCode]++ : 0
return {
adUnitCode: adUnit.adUnitCode,
mediaTypes: adUnit.mediaTypes,
@@ -72,10 +75,14 @@ export const spec = {
key: 'ntv_ppc',
value: btoa(JSON.stringify(adUnitData)), // Convert to Base 64
},
+ {
+ key: 'ntv_dbr',
+ value: btoa(JSON.stringify(adUnitsRequested))
+ },
{
key: 'ntv_url',
value: encodeURIComponent(pageUrl),
- },
+ }
]
if (bidderRequest.gdprConsent) {
diff --git a/modules/newborntownWebBidAdapter.js b/modules/newborntownWebBidAdapter.js
deleted file mode 100644
index 56c63e2bb4d..00000000000
--- a/modules/newborntownWebBidAdapter.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import {BANNER, NATIVE} from '../src/mediaTypes.js';
-import { getStorageManager } from '../src/storageManager.js';
-
-const storage = getStorageManager();
-const BIDDER_CODE = 'newborntownWeb';
-
-const REQUEST_URL = 'https://us-west.solortb.com/adx/api/rtb?from=4'
-
-function randomn(n) {
- return parseInt((Math.random() + 1) * Math.pow(10, n - 1)) + '';
-}
-function generateGUID() {
- var d = new Date().getTime();
- var guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
- var r = (d + Math.random() * 16) % 16 | 0;
- d = Math.floor(d / 16);
- return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
- })
- return guid;
-}
-function _isMobile() {
- return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
-}
-function _isConnectedTV() {
- return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
-}
-function _getDeviceType() {
- return _isMobile() ? 1 : _isConnectedTV() ? 3 : 2;
-}
-var platform = (function getPlatform() {
- var ua = navigator.userAgent;
- if (ua.indexOf('Android') > -1 || ua.indexOf('Adr') > -1) {
- return 'Android'
- }
- if (ua.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)) {
- return 'iOS'
- }
- return 'windows'
-})();
-function getLanguage() {
- const language = navigator.language ? 'language' : 'userLanguage';
- return navigator[language].split('-')[0];
-}
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, NATIVE],
- isBidRequestValid: function(bid) {
- return !!(bid.params.publisher_id && bid.params.slot_id && bid.params.bidfloor);
- },
-
- buildRequests: function(validBidRequests, bidderRequest) {
- let requestArr = []
- if (validBidRequests.length === 0) {
- return null;
- }
- var guid;
- if (storage.getDataFromLocalStorage('sax_user_id') == null) {
- storage.setDataInLocalStorage('sax_user_id', generateGUID())
- }
- guid = storage.getDataFromLocalStorage('sax_user_id')
- utils._each(validBidRequests, function(bidRequest) {
- const bidRequestObj = bidRequest.params
- var req = {
- id: randomn(12) + randomn(12),
- tmax: bidderRequest.timeout,
- bidId: bidRequest.bidId,
- user: {
- id: guid
- },
- imp: [
- {
- id: '1',
- bidfloor: bidRequestObj.bidfloor,
- bidfloorcur: 'USD',
- banner: {
- w: 0,
- h: 0
- }
- }
- ],
- site: {
- domain: window.location.host,
- id: bidRequestObj.slot_id,
- page: window.location.href,
- publisher: {
- id: bidRequestObj.publisher_id
- },
- },
- device: {
- ip: '',
- ua: navigator.userAgent,
- os: platform,
- geo: {
- country: '',
- type: 0,
- ipservice: 1,
- region: '',
- city: '',
- },
- language: getLanguage(),
- devicetype: _getDeviceType()
- },
- ext: {
- solomath: {
- slotid: bidRequestObj.slot_id
- }
- }
- };
- var sizes = bidRequest.sizes;
- if (sizes) {
- if (sizes && utils.isArray(sizes[0])) {
- req.imp[0].banner.w = sizes[0][0];
- req.imp[0].banner.h = sizes[0][1];
- } else if (sizes && utils.isNumber(sizes[0])) {
- req.imp[0].banner.w = sizes[0];
- req.imp[0].banner.h = sizes[1];
- }
- } else {
- return false;
- }
- const options = {
- withCredentials: false
- }
- requestArr.push({
- method: 'POST',
- url: REQUEST_URL,
- data: req,
- bidderRequest,
- options: options
- })
- })
- return requestArr;
- },
- interpretResponse: function(serverResponse, request) {
- var bidResponses = [];
- if (serverResponse.body.seatbid && serverResponse.body.seatbid.length > 0 && serverResponse.body.seatbid[0].bid && serverResponse.body.seatbid[0].bid.length > 0 && serverResponse.body.seatbid[0].bid[0].adm) {
- utils._each(serverResponse.body.seatbid[0].bid, function(bodyAds) {
- var adstr = '';
- adstr = bodyAds.adm;
- var bidResponse = {
- requestId: request.data.bidId || 0,
- cpm: bodyAds.price || 0,
- width: bodyAds.w ? bodyAds.w : 0,
- height: bodyAds.h ? bodyAds.h : 0,
- ad: adstr,
- netRevenue: true,
- currency: serverResponse.body.cur || 'USD',
- ttl: 600,
- creativeId: bodyAds.cid
- };
- bidResponses.push(bidResponse);
- });
- }
- return bidResponses;
- }
-}
-registerBidder(spec);
diff --git a/modules/nextMillenniumBidAdapter.js b/modules/nextMillenniumBidAdapter.js
deleted file mode 100644
index af1f0562ba4..00000000000
--- a/modules/nextMillenniumBidAdapter.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'nextMillennium';
-const HOST = 'https://brainlyads.com';
-const CURRENCY = 'USD';
-const TIME_TO_LIVE = 360;
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER],
-
- isBidRequestValid: function(bid) {
- return !!(
- bid.params.placement_id && utils.isNumber(bid.params.placement_id)
- );
- },
-
- buildRequests: function(validBidRequests) {
- let requests = [];
-
- utils._each(validBidRequests, function(bid) {
- requests.push({
- method: 'POST',
- url: HOST + '/hb/s2s',
- options: {
- contentType: 'application/json',
- withCredentials: true
- },
- data: JSON.stringify({
- placement_id: utils.getBidIdParameter('placement_id', bid.params)
- }),
- bidId: bid.bidId
- });
- });
-
- return requests;
- },
-
- interpretResponse: function(serverResponse, bidRequest) {
- try {
- const bidResponse = serverResponse.body;
- const bidResponses = [];
-
- if (Number(bidResponse.cpm) > 0) {
- bidResponses.push({
- requestId: bidRequest.bidId,
- cpm: bidResponse.cpm,
- width: bidResponse.width,
- height: bidResponse.height,
- creativeId: bidResponse.creativeId,
- currency: CURRENCY,
- netRevenue: false,
- ttl: TIME_TO_LIVE,
- ad: bidResponse.ad
- });
- }
-
- return bidResponses;
- } catch (err) {
- utils.logError(err);
- return [];
- }
- },
-
- getUserSyncs: function(syncOptions) {
- const syncs = []
- if (syncOptions.iframeEnabled) {
- syncs.push({
- type: 'iframe',
- url: HOST + '/hb/s2s/matching'
- });
- }
-
- if (syncOptions.pixelEnabled) {
- syncs.push({
- type: 'image',
- url: HOST + '/hb/s2s/matching'
- });
- }
- return syncs;
- }
-};
-registerBidder(spec);
diff --git a/modules/nextMillenniumBidAdapter.md b/modules/nextMillenniumBidAdapter.md
index c583969b4af..048fe907ac7 100644
--- a/modules/nextMillenniumBidAdapter.md
+++ b/modules/nextMillenniumBidAdapter.md
@@ -2,7 +2,7 @@
```
Module Name: NextMillennium Bid Adapter
Module Type: Bidder Adapter
-Maintainer: mikhail.ivanchenko@iageengineering.net
+Maintainer: mihail.ivanchenko@nextmillennium.io
```
# Description
@@ -21,7 +21,7 @@ Currently module supports only banner mediaType.
bids: [{
bidder: 'nextMillennium',
params: {
- placement_id: -1
+ placement_id: '-1'
}
}]
}];
diff --git a/modules/nextrollBidAdapter.js b/modules/nextrollBidAdapter.js
deleted file mode 100644
index cb317190bea..00000000000
--- a/modules/nextrollBidAdapter.js
+++ /dev/null
@@ -1,345 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE } from '../src/mediaTypes.js';
-
-import find from 'core-js-pure/features/array/find.js';
-
-const BIDDER_CODE = 'nextroll';
-const BIDDER_ENDPOINT = 'https://d.adroll.com/bid/prebid/';
-const ADAPTER_VERSION = 5;
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, NATIVE],
-
- /**
- * 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 (bidRequest) {
- return bidRequest !== undefined && !!bidRequest.params && !!bidRequest.bidId;
- },
-
- /**
- * 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) {
- let topLocation = utils.parseUrl(utils.deepAccess(bidderRequest, 'refererInfo.referer'));
-
- return validBidRequests.map((bidRequest) => {
- return {
- method: 'POST',
- options: {
- withCredentials: true,
- },
- url: BIDDER_ENDPOINT,
- data: {
- id: bidRequest.bidId,
- imp: {
- id: bidRequest.bidId,
- bidfloor: utils.getBidIdParameter('bidfloor', bidRequest.params),
- banner: _getBanner(bidRequest),
- native: _getNative(utils.deepAccess(bidRequest, 'mediaTypes.native')),
- ext: {
- zone: {
- id: utils.getBidIdParameter('zoneId', bidRequest.params)
- },
- nextroll: {
- adapter_version: ADAPTER_VERSION
- }
- }
- },
-
- user: _getUser(validBidRequests),
- site: _getSite(bidRequest, topLocation),
- seller: _getSeller(bidRequest),
- device: _getDevice(bidRequest),
- regs: _getRegs(bidderRequest)
- }
- };
- });
- },
-
- /**
- * 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, bidRequest) {
- if (!serverResponse.body) {
- return [];
- } else {
- let response = serverResponse.body
- let bids = response.seatbid.reduce((acc, seatbid) => acc.concat(seatbid.bid), []);
- return bids.map((bid) => _buildResponse(response, bid));
- }
- }
-}
-
-function _getBanner(bidRequest) {
- let sizes = _getSizes(bidRequest);
- if (sizes === undefined) return undefined;
- return {format: sizes};
-}
-
-function _getNative(mediaTypeNative) {
- if (mediaTypeNative === undefined) return undefined;
- let assets = _getNativeAssets(mediaTypeNative);
- if (assets === undefined || assets.length == 0) return undefined;
- return {
- request: {
- native: {
- assets: assets
- }
- }
- };
-}
-
-/*
- id: Unique numeric id for the asset
- kind: OpenRTB kind of asset. Supported: title, img and data.
- key: Name of property that comes in the mediaType.native object.
- type: OpenRTB type for that spefic kind of asset.
- required: Overrides the asset required field configured, only overrides when is true.
-*/
-const NATIVE_ASSET_MAP = [
- {id: 1, kind: 'title', key: 'title', required: true},
- {id: 2, kind: 'img', key: 'image', type: 3, required: true},
- {id: 3, kind: 'img', key: 'icon', type: 1},
- {id: 4, kind: 'img', key: 'logo', type: 2},
- {id: 5, kind: 'data', key: 'sponsoredBy', type: 1},
- {id: 6, kind: 'data', key: 'body', type: 2}
-];
-
-const ASSET_KIND_MAP = {
- title: _getTitleAsset,
- img: _getImageAsset,
- data: _getDataAsset,
-};
-
-function _getAsset(mediaTypeNative, assetMap) {
- const asset = mediaTypeNative[assetMap.key];
- if (asset === undefined) return undefined;
- const assetFunc = ASSET_KIND_MAP[assetMap.kind];
- return {
- id: assetMap.id,
- required: (assetMap.required || !!asset.required) ? 1 : 0,
- [assetMap.kind]: assetFunc(asset, assetMap)
- };
-}
-
-function _getTitleAsset(title, _assetMap) {
- return {len: title.len || 0};
-}
-
-function _getMinAspectRatio(aspectRatio, property) {
- if (!utils.isPlainObject(aspectRatio)) return 1;
-
- const ratio = aspectRatio['ratio_' + property];
- const min = aspectRatio['min_' + property];
-
- if (utils.isNumber(ratio)) return ratio;
- if (utils.isNumber(min)) return min;
-
- return 1;
-}
-
-function _getImageAsset(image, assetMap) {
- const sizes = image.sizes;
- const aspectRatio = image.aspect_ratios ? image.aspect_ratios[0] : undefined;
-
- return {
- type: assetMap.type,
- w: (sizes ? sizes[0] : undefined),
- h: (sizes ? sizes[1] : undefined),
- wmin: _getMinAspectRatio(aspectRatio, 'width'),
- hmin: _getMinAspectRatio(aspectRatio, 'height'),
- };
-}
-
-function _getDataAsset(data, assetMap) {
- return {
- type: assetMap.type,
- len: data.len || 0
- };
-}
-
-function _getNativeAssets(mediaTypeNative) {
- return NATIVE_ASSET_MAP
- .map(assetMap => _getAsset(mediaTypeNative, assetMap))
- .filter(asset => asset !== undefined);
-}
-
-function _getUser(requests) {
- const id = utils.deepAccess(requests, '0.userId.nextrollId');
- if (id === undefined) {
- return;
- }
-
- return {
- ext: {
- eid: [{
- 'source': 'nextroll',
- id
- }]
- }
- };
-}
-
-function _buildResponse(bidResponse, bid) {
- let response = {
- requestId: bidResponse.id,
- cpm: bid.price,
- width: bid.w,
- height: bid.h,
- creativeId: bid.crid,
- dealId: bidResponse.dealId,
- currency: 'USD',
- netRevenue: true,
- ttl: 300
- };
- if (utils.isStr(bid.adm)) {
- response.mediaType = BANNER;
- response.ad = utils.replaceAuctionPrice(bid.adm, bid.price);
- } else {
- response.mediaType = NATIVE;
- response.native = _getNativeResponse(bid.adm, bid.price);
- }
- return response;
-}
-
-const privacyLink = 'https://info.evidon.com/pub_info/573';
-const privacyIcon = 'https://c.betrad.com/pub/icon1.png';
-
-function _getNativeResponse(adm, price) {
- let baseResponse = {
- clickTrackers: (adm.link && adm.link.clicktrackers) || [],
- jstracker: adm.jstracker || [],
- clickUrl: utils.replaceAuctionPrice(adm.link.url, price),
- impressionTrackers: adm.imptrackers.map(impTracker => utils.replaceAuctionPrice(impTracker, price)),
- privacyLink: privacyLink,
- privacyIcon: privacyIcon
- };
- return adm.assets.reduce((accResponse, asset) => {
- const assetMaps = NATIVE_ASSET_MAP.filter(assetMap => assetMap.id === asset.id && asset[assetMap.kind] !== undefined);
- if (assetMaps.length === 0) return accResponse;
- const assetMap = assetMaps[0];
- accResponse[assetMap.key] = _getAssetResponse(asset, assetMap);
- return accResponse;
- }, baseResponse);
-}
-
-function _getAssetResponse(asset, assetMap) {
- switch (assetMap.kind) {
- case 'title':
- return asset.title.text;
-
- case 'img':
- return {
- url: asset.img.url,
- width: asset.img.w,
- height: asset.img.h
- };
-
- case 'data':
- return asset.data.value;
- }
-}
-
-function _getSite(bidRequest, topLocation) {
- return {
- page: topLocation.href,
- domain: topLocation.hostname,
- publisher: {
- id: utils.getBidIdParameter('publisherId', bidRequest.params)
- }
- };
-}
-
-function _getSeller(bidRequest) {
- return {
- id: utils.getBidIdParameter('sellerId', bidRequest.params)
- };
-}
-
-function _getSizes(bidRequest) {
- if (!utils.isArray(bidRequest.sizes)) {
- return undefined;
- }
- return bidRequest.sizes.filter(_isValidSize).map(size => {
- return {
- w: size[0],
- h: size[1]
- }
- });
-}
-
-function _isValidSize(size) {
- const isNumber = x => typeof x === 'number';
- return (size.length === 2 && isNumber(size[0]) && isNumber(size[1]));
-}
-
-function _getDevice(_bidRequest) {
- return {
- ua: navigator.userAgent,
- language: navigator['language'],
- os: _getOs(navigator.userAgent.toLowerCase()),
- osv: _getOsVersion(navigator.userAgent)
- };
-}
-
-function _getRegs(bidderRequest) {
- if (!bidderRequest || !bidderRequest.uspConsent) {
- return undefined;
- }
- return {
- ext: {
- us_privacy: bidderRequest.uspConsent
- }
- };
-}
-
-function _getOs(userAgent) {
- const osTable = {
- 'android': /android/i,
- 'ios': /iphone|ipad/i,
- 'mac': /mac/i,
- 'linux': /linux/i,
- 'windows': /windows/i
- };
-
- return find(Object.keys(osTable), os => {
- if (userAgent.match(osTable[os])) {
- return os;
- }
- }) || 'etc';
-}
-
-function _getOsVersion(userAgent) {
- const clientStrings = [
- { s: 'Android', r: /Android/ },
- { s: 'iOS', r: /(iPhone|iPad|iPod)/ },
- { s: 'Mac OS X', r: /Mac OS X/ },
- { s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ },
- { s: 'Linux', r: /(Linux|X11)/ },
- { s: 'Windows 10', r: /(Windows 10.0|Windows NT 10.0)/ },
- { s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/ },
- { s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/ },
- { s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/ },
- { s: 'Windows Vista', r: /Windows NT 6.0/ },
- { s: 'Windows Server 2003', r: /Windows NT 5.2/ },
- { s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/ },
- { s: 'UNIX', r: /UNIX/ },
- { s: 'Search Bot', r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ }
- ];
- let cs = find(clientStrings, cs => cs.r.test(userAgent));
- return cs ? cs.s : 'unknown';
-}
-
-registerBidder(spec);
diff --git a/modules/nobidBidAdapter.js b/modules/nobidBidAdapter.js
index 3aabd8f0635..619b46ecd1f 100644
--- a/modules/nobidBidAdapter.js
+++ b/modules/nobidBidAdapter.js
@@ -4,9 +4,10 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER, VIDEO } from '../src/mediaTypes.js';
import { getStorageManager } from '../src/storageManager.js';
-const storage = getStorageManager();
+const GVLID = 816;
const BIDDER_CODE = 'nobid';
-window.nobidVersion = '1.3.0';
+const storage = getStorageManager(GVLID, BIDDER_CODE);
+window.nobidVersion = '1.3.1';
window.nobid = window.nobid || {};
window.nobid.bidResponses = window.nobid.bidResponses || {};
window.nobid.timeoutTotal = 0;
@@ -144,6 +145,7 @@ function nobidBuildRequests(bids, bidderRequest) {
state['ref'] = document.referrer;
state['gdpr'] = gdprConsent(bidderRequest);
state['usp'] = uspConsent(bidderRequest);
+ state['pjbdr'] = (bidderRequest && bidderRequest.bidderCode) ? bidderRequest.bidderCode : 'nobid';
const sch = schain(bids);
if (sch) state['schain'] = sch;
const cop = coppa();
@@ -337,6 +339,10 @@ window.addEventListener('message', function (event) {
}, false);
export const spec = {
code: BIDDER_CODE,
+ gvlid: GVLID,
+ aliases: [
+ { code: 'duration', gvlid: 674 }
+ ],
supportedMediaTypes: [BANNER, VIDEO],
/**
* Determines whether or not the given bid request is valid.
diff --git a/modules/oguryBidAdapter.js b/modules/oguryBidAdapter.js
index 0b4982bc8dc..44c9b7a509a 100644
--- a/modules/oguryBidAdapter.js
+++ b/modules/oguryBidAdapter.js
@@ -6,7 +6,8 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
const BIDDER_CODE = 'ogury';
const DEFAULT_TIMEOUT = 1000;
-const BID_HOST = 'https://webmobile.presage.io/api/header-bidding-request';
+const BID_HOST = 'https://mweb-hb.presage.io/api/header-bidding-request';
+const MS_COOKIE_SYNC_DOMAIN = 'https://ms-cookie-sync.presage.io';
function isBidRequestValid(bid) {
const adUnitSizes = getAdUnitSizes(bid);
@@ -18,6 +19,15 @@ function isBidRequestValid(bid) {
return (isValidSizes && isValidAdUnitId && isValidAssetKey);
}
+function getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) {
+ if (!syncOptions.pixelEnabled) return [];
+
+ return [{
+ type: 'image',
+ url: `${MS_COOKIE_SYNC_DOMAIN}/v1/init-sync/bid-switch?iab_string=${gdprConsent.consentString}&source=prebid`
+ }]
+}
+
function buildRequests(validBidRequests, bidderRequest) {
const openRtbBidRequestBanner = {
id: bidderRequest.auctionId,
@@ -72,7 +82,8 @@ function buildRequests(validBidRequests, bidderRequest) {
return {
method: 'POST',
url: BID_HOST,
- data: openRtbBidRequestBanner
+ data: openRtbBidRequestBanner,
+ options: {contentType: 'application/json'},
};
}
@@ -98,6 +109,7 @@ function interpretResponse(openRtbBidResponse) {
creativeId: bid.id,
netRevenue: true,
ttl: 60,
+ ext: bid.ext,
meta: {
advertiserDomains: bid.adomain
}
@@ -127,6 +139,7 @@ export const spec = {
code: BIDDER_CODE,
supportedMediaTypes: [BANNER],
isBidRequestValid,
+ getUserSyncs,
buildRequests,
interpretResponse,
getFloor
diff --git a/modules/oguryBidAdapter.md b/modules/oguryBidAdapter.md
index 00896762dc4..7264602de14 100644
--- a/modules/oguryBidAdapter.md
+++ b/modules/oguryBidAdapter.md
@@ -27,9 +27,12 @@ Ogury bid adapter supports Banner media type.
params: {
assetKey: 'OGY-CA41D116484F',
adUnitId: '2c4d61d0-90aa-0139-0cda-0242ac120004'
+ xMargin?: 20
+ yMargin?: 20
+ gravity?: 'TOP_LEFT' || 'TOP_RIGHT' || 'BOTTOM_LEFT' || 'BOTTOM_RIGHT' || 'BOTTOM_CENTER' || 'TOP_CENTER' || 'CENTER'
}
}
]
}
];
-```
+```
\ No newline at end of file
diff --git a/modules/oneVideoBidAdapter.js b/modules/oneVideoBidAdapter.js
index e57c9d12ff7..880f4992614 100644
--- a/modules/oneVideoBidAdapter.js
+++ b/modules/oneVideoBidAdapter.js
@@ -4,7 +4,7 @@ import {registerBidder} from '../src/adapters/bidderFactory.js';
const BIDDER_CODE = 'oneVideo';
export const spec = {
code: 'oneVideo',
- VERSION: '3.1.0',
+ VERSION: '3.1.2',
ENDPOINT: 'https://ads.adaptv.advertising.com/rtb/openrtb?ext_id=',
E2ETESTENDPOINT: 'https://ads-wc.v.ssp.yahoo.com/rtb/openrtb?ext_id=',
SYNC_ENDPOINT1: 'https://pixel.advertising.com/ups/57304/sync?gdpr=&gdpr_consent=&_origin=0&redir=true',
@@ -17,26 +17,46 @@ export const spec = {
* @return boolean True if this is a valid bid, and false otherwise.
*/
isBidRequestValid: function(bid) {
+ // Bidder code validation
if (bid.bidder !== BIDDER_CODE || typeof bid.params === 'undefined') {
return false;
}
- // Video validations
- if (typeof bid.params.video === 'undefined' || typeof bid.params.video.playerWidth === 'undefined' || typeof bid.params.video.playerHeight == 'undefined' || typeof bid.params.video.mimes == 'undefined') {
- return false;
+ // E2E test skip validations
+ if (bid.params && bid.params.video && bid.params.video.e2etest) {
+ return true;
}
+ // MediaTypes Video / Banner validation
+ if (typeof bid.mediaTypes.video === 'undefined' && typeof bid.mediaTypes.banner === 'undefined') {
+ utils.logError('Failed validation: adUnit mediaTypes.video OR mediaTypes.banner not declared');
+ return false;
+ };
- // Prevend DAP Outstream validation, Banner DAP validation & Multi-Format adUnit support
if (bid.mediaTypes.video) {
- if (bid.mediaTypes.video.context === 'outstream' && bid.params.video.display === 1) {
+ // Player size validation
+ if (typeof bid.mediaTypes.video.playerSize === 'undefined') {
+ if (bid.params.video && (typeof bid.params.video.playerWidth === 'undefined' || typeof bid.params.video.playerHeight === 'undefined')) {
+ utils.logError('Failed validation: Player size not declared in either mediaTypes.playerSize OR bid.params.video.plauerWidth & bid.params.video.playerHeight.');
+ return false;
+ };
+ };
+ // Mimes validation
+ if (typeof bid.mediaTypes.video.mimes === 'undefined') {
+ if (!bid.params.video || typeof bid.params.video.mimes === 'undefined') {
+ utils.logError('Failed validation: adUnit mediaTypes.mimes OR params.video.mimes not declared');
+ return false;
+ };
+ };
+ // Prevend DAP Outstream validation, Banner DAP validation & Multi-Format adUnit support
+ if (bid.mediaTypes.video.context === 'outstream' && bid.params.video && bid.params.video.display === 1) {
+ utils.logError('Failed validation: Dynamic Ad Placement cannot be used with context Outstream (params.video.display=1)');
return false;
- }
- } else if (bid.mediaTypes.banner && !bid.params.video.display) {
- return false;
- }
+ };
+ };
- // Pub Id validation
+ // Publisher Id (Exchange) validation
if (typeof bid.params.pubId === 'undefined') {
+ utils.logError('Failed validation: Adapter cannot send requests without bid.params.pubId');
return false;
}
@@ -49,7 +69,7 @@ export const spec = {
* @param bidderRequest
* @return ServerRequest Info describing the request to the server.
*/
- buildRequests: function(bids, bidRequest) {
+ buildRequests: function (bids, bidRequest) {
let consentData = bidRequest ? bidRequest.gdprConsent : null;
return bids.map(bid => {
@@ -100,7 +120,10 @@ export const spec = {
currency: response.cur,
ttl: (bidRequest.params.video.ttl > 0 && bidRequest.params.video.ttl <= 3600) ? bidRequest.params.video.ttl : 300,
netRevenue: true,
- adUnitCode: bidRequest.adUnitCode
+ adUnitCode: bidRequest.adUnitCode,
+ meta: {
+ advertiserDomains: bid.adomain
+ }
};
bidResponse.mediaType = (bidRequest.mediaTypes.banner) ? 'banner' : 'video'
@@ -194,40 +217,54 @@ function getRequestData(bid, consentData, bidRequest) {
if (bid.params.video.display == undefined || bid.params.video.display != 1) {
bidData.imp[0].video = {
- mimes: bid.params.video.mimes,
- w: bid.params.video.playerWidth,
- h: bid.params.video.playerHeight,
- pos: bid.params.video.position,
+ linearity: 1
+ };
+ if (bid.params.video.playerWidth && bid.params.video.playerHeight) {
+ bidData.imp[0].video.w = bid.params.video.playerWidth;
+ bidData.imp[0].video.h = bid.params.video.playerHeight;
+ } else {
+ const playerSize = getSize(bid.mediaTypes.video.playerSize);
+ bidData.imp[0].video.w = playerSize.width;
+ bidData.imp[0].video.h = playerSize.height;
+ };
+ if (bid.params.video.mimes) {
+ bidData.imp[0].video.mimes = bid.params.video.mimes;
+ } else {
+ bidData.imp[0].video.mimes = bid.mediaTypes.video.mimes;
};
- if (bid.params.video.maxbitrate) {
- bidData.imp[0].video.maxbitrate = bid.params.video.maxbitrate
+ if (bid.mediaTypes.video.maxbitrate || bid.params.video.maxbitrate) {
+ bidData.imp[0].video.maxbitrate = bid.params.video.maxbitrate || bid.mediaTypes.video.maxbitrate;
}
- if (bid.params.video.maxduration) {
- bidData.imp[0].video.maxduration = bid.params.video.maxduration
+ if (bid.mediaTypes.video.maxduration || bid.params.video.maxduration) {
+ bidData.imp[0].video.maxduration = bid.params.video.maxduration || bid.mediaTypes.video.maxduration;
}
- if (bid.params.video.minduration) {
- bidData.imp[0].video.minduration = bid.params.video.minduration
+ if (bid.mediaTypes.video.minduration || bid.params.video.minduration) {
+ bidData.imp[0].video.minduration = bid.params.video.minduration || bid.mediaTypes.video.minduration;
}
- if (bid.params.video.api) {
- bidData.imp[0].video.api = bid.params.video.api
+ if (bid.mediaTypes.video.api || bid.params.video.api) {
+ bidData.imp[0].video.api = bid.params.video.api || bid.mediaTypes.video.api;
}
- if (bid.params.video.delivery) {
- bidData.imp[0].video.delivery = bid.params.video.delivery
+ if (bid.mediaTypes.video.delivery || bid.params.video.delivery) {
+ bidData.imp[0].video.delivery = bid.params.video.delivery || bid.mediaTypes.video.delivery;
}
- if (bid.params.video.position) {
- bidData.imp[0].video.pos = bid.params.video.position
+ if (bid.mediaTypes.video.position || bid.params.video.position) {
+ bidData.imp[0].video.pos = bid.params.video.position || bid.mediaTypes.video.position;
}
- if (bid.params.video.playbackmethod) {
- bidData.imp[0].video.playbackmethod = bid.params.video.playbackmethod
+ if (bid.mediaTypes.video.playbackmethod || bid.params.video.playbackmethod) {
+ bidData.imp[0].video.playbackmethod = bid.params.video.playbackmethod || bid.mediaTypes.video.playbackmethod;
}
- if (bid.params.video.placement) {
- bidData.imp[0].video.placement = bid.params.video.placement
+ if (bid.mediaTypes.video.placement || bid.params.video.placement) {
+ bidData.imp[0].video.placement = bid.params.video.placement || bid.mediaTypes.video.placement;
}
if (bid.params.video.rewarded) {
bidData.imp[0].ext.rewarded = bid.params.video.rewarded
}
- bidData.imp[0].video.linearity = 1;
- bidData.imp[0].video.protocols = bid.params.video.protocols || [2, 5];
+ if (bid.mediaTypes.video.linearity || bid.params.video.linearity) {
+ bidData.imp[0].video.linearity = bid.params.video.linearity || bid.mediaTypes.video.linearity || 1;
+ }
+ if (bid.mediaTypes.video.protocols || bid.params.video.protocols) {
+ bidData.imp[0].video.protocols = bid.params.video.protocols || bid.mediaTypes.video.protocols || [2, 5];
+ }
} else if (bid.params.video.display == 1) {
getFloorRequestObject.mediaType = 'banner';
bidData.imp[0].banner = {
@@ -307,7 +344,7 @@ function getRequestData(bid, consentData, bidRequest) {
}
}
if (bid.params.video.e2etest) {
- utils.logMessage('+++ oneVideoBidAdapter: E2E test mode enabled. \n The following parameters are being overridden by e2etest mode:\n* bidfloor:null\n* width:300\n* height:250\n* mimes: video/mp4, application/javascript\n* api:2\n* site.page/ref: verizonmedia.com\n* tmax:1000');
+ utils.logMessage('E2E test mode enabled: \n The following parameters are being overridden by e2etest mode:\n* bidfloor:null\n* width:300\n* height:250\n* mimes: video/mp4, application/javascript\n* api:2\n* site.page/ref: verizonmedia.com\n* tmax:1000');
bidData.imp[0].bidfloor = null;
bidData.imp[0].video.w = 300;
bidData.imp[0].video.h = 250;
diff --git a/modules/oneVideoBidAdapter.md b/modules/oneVideoBidAdapter.md
index a42433e80b5..149a4b20e2f 100644
--- a/modules/oneVideoBidAdapter.md
+++ b/modules/oneVideoBidAdapter.md
@@ -3,12 +3,18 @@
**Module Name**: One Video Bidder Adapter
**Module Type**: Bidder Adapter
**Maintainer**: deepthi.neeladri.sravana@verizonmedia.com
+ adam.browning@verizonmedia.com
# Description
Connects to Verizon Media's Video SSP (AKA ONE Video / Adap.tv) demand source to fetch bids.
-
+# Prebid.js V5.0 Support
+The oneVideo adapter now reads `mediaTypes.video` for mandatory parameters such as `playerSize` & `mimes`.
+Note: You can use the `bid.params.video` object to specify explicit overrides for whatever is declared in `mediaTypes.video`.
+Important: You must pass `bid.params.video = {}` as bare minimum for the adapter to work.
# Integration Examples:
-## Instream Video adUnit example & parameters
+
+## Instream Video adUnit using mediaTypes.video
+*Note:* By default, the adapter will read the mandatory parameters from mediaTypes.video.
*Note:* The Video SSP ad server will respond with an VAST XML to load into your defined player.
```
var adUnits = [
@@ -17,7 +23,18 @@ Connects to Verizon Media's Video SSP (AKA ONE Video / Adap.tv) demand source to
mediaTypes: {
video: {
context: 'instream',
- playerSize: [480, 640]
+ playerSize: [480, 640],
+ mimes: ['video/mp4', 'application/javascript'],
+ protocols: [2,5],
+ api: [2],
+ position: 1,
+ delivery: [2],
+ minduration: 10,
+ maxduration: 30,
+ placement: 1,
+ playbackmethod: [1,5],
+ protocols: [2,5],
+ api: [2],
}
},
bids: [
@@ -25,21 +42,10 @@ Connects to Verizon Media's Video SSP (AKA ONE Video / Adap.tv) demand source to
bidder: 'oneVideo',
params: {
video: {
- playerWidth: 480,
- playerHeight: 640,
- mimes: ['video/mp4', 'application/javascript'],
- protocols: [2,5],
- api: [2],
- position: 1,
- delivery: [2],
- playbackmethod: [1,5],
sid: YOUR_VSSP_ORG_ID,
hp: 1,
rewarded: 1,
- placement: 1,
inventoryid: 123,
- minduration: 10,
- maxduration: 30,
ttl: 300,
custom: {
key1: "value1",
@@ -59,16 +65,16 @@ Connects to Verizon Media's Video SSP (AKA ONE Video / Adap.tv) demand source to
}
]
```
-## Outstream Video adUnit example & parameters
-*Note:* The Video SSP ad server will load it's own Outstream Renderer (player) as a fallback if no player is defined on the publisher page. The Outstream player will inject into the div id that has an identical adUnit code.
+## Instream Video adUnit using params.video overrides
+*Note:* If the mandatory parameters are not specified in mediaTypes.video the adapter will read check to see if overrides are set in params.video. Decalring values using params.video will always override the settings in mediaTypes.video.
+*Note:* The Video SSP ad server will respond with an VAST XML to load into your defined player.
```
var adUnits = [
{
code: 'video1',
mediaTypes: {
video: {
- context: 'outstream',
- playerSize: [480, 640]
+ context: 'instream',
}
},
bids: [
@@ -76,21 +82,74 @@ Connects to Verizon Media's Video SSP (AKA ONE Video / Adap.tv) demand source to
bidder: 'oneVideo',
params: {
video: {
- playerWidth: 480,
- playerHeight: 640,
+ playerWidth: 640,
+ playerHeight: 480,
mimes: ['video/mp4', 'application/javascript'],
protocols: [2,5],
api: [2],
position: 1,
delivery: [2],
+ minduration: 10,
+ maxduration: 30,
+ placement: 1,
playbackmethod: [1,5],
+ protocols: [2,5],
+ api: [2],
sid: YOUR_VSSP_ORG_ID,
hp: 1,
rewarded: 1,
- placement: 1,
inventoryid: 123,
+ ttl: 300,
+ custom: {
+ key1: "value1",
+ key2: 123345
+ }
+ },
+ bidfloor: 0.5,
+ site: {
+ id: 1,
+ page: 'https://verizonmedia.com',
+ referrer: 'https://verizonmedia.com'
+ },
+ pubId: 'HBExchange'
+ }
+ }
+ ]
+ }
+ ]
+```
+## Outstream Video adUnit example & parameters
+*Note:* The Video SSP ad server will load it's own Outstream Renderer (player) as a fallback if no player is defined on the publisher page. The Outstream player will inject into the div id that has an identical adUnit code.
+```
+ var adUnits = [
+ {
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ context: 'outstream',
+ playerSize: [480, 640],
+ mimes: ['video/mp4', 'application/javascript'],
+ protocols: [2,5],
+ api: [2],
+ position: 1,
+ delivery: [2],
minduration: 10,
maxduration: 30,
+ placement: 1,
+ playbackmethod: [1,5],
+ protocols: [2,5],
+ api: [2],
+
+ }
+ },
+ bids: [
+ {
+ bidder: 'oneVideo',
+ params: {
+ video: {
+ sid: YOUR_VSSP_ORG_ID,
+ hp: 1,
+ rewarded: 1,
ttl: 250
},
bidfloor: 0.5,
@@ -116,7 +175,8 @@ Connects to Verizon Media's Video SSP (AKA ONE Video / Adap.tv) demand source to
mediaTypes: {
video: {
context: "instream",
- playerSize: [480, 640]
+ playerSize: [480, 640],
+ mimes: ['video/mp4', 'application/javascript'],
}
},
bids: [
@@ -124,11 +184,7 @@ Connects to Verizon Media's Video SSP (AKA ONE Video / Adap.tv) demand source to
bidder: 'oneVideo',
params: {
video: {
- playerWidth: 480,
- playerHeight: 640,
- mimes: ['video/mp4', 'application/javascript'],
- position: 1,
- display: 1
+ ttl: 250
},
bidfloor: 0.5,
site: {
@@ -190,6 +246,7 @@ var adUnits = [
video: {
context: "instream",
playerSize: [480, 640]
+ mimes: ['video/mp4', 'application/javascript'],
}
},
bids: [
@@ -197,12 +254,8 @@ var adUnits = [
bidder: 'oneVideo',
params: {
video: {
- playerWidth: 300,
- playerHeight: 250,
- mimes: ['video/mp4', 'application/javascript'],
e2etest: true
- },
- pubId: 'YOUR_PUBLISHER_ID'
+ }
}
}
]
@@ -226,7 +279,10 @@ var adUnits = [
mediaTypes: {
video: {
context: 'instream',
- playerSize: [480, 640]
+ playerSize: [480, 640],
+ mimes: ['video/mp4', 'application/javascript'],
+ protocols: [2,5],
+ api: [2],
}
},
bids: [
@@ -234,12 +290,7 @@ var adUnits = [
bidder: 'oneVideo',
params: {
video: {
- playerWidth: 480,
- playerHeight: 640,
- mimes: ['video/mp4', 'application/javascript'],
- protocols: [2,5],
- api: [2],
- sid:
+ sid: 123456
},
bidfloor: 0.5,
site: {
@@ -279,7 +330,10 @@ var adUnits = [
mediaTypes: {
video: {
context: 'instream',
- playerSize: [480, 640]
+ playerSize: [480, 640],
+ mimes: ['video/mp4', 'application/javascript'],
+ protocols: [2,5],
+ api: [2],
}
},
bids: [
@@ -287,11 +341,7 @@ var adUnits = [
bidder: 'oneVideo',
params: {
video: {
- playerWidth: 480,
- playerHeight: 640,
- mimes: ['video/mp4', 'application/javascript'],
- protocols: [2,5],
- api: [2],
+ ttl: 250
},
bidfloor: 0.5,
site: {
@@ -315,18 +365,16 @@ const adUnits = [{
mediaTypes: {
video: {
context: 'outstream',
- playerSize: [640, 480]
+ playerSize: [640, 480],
+ mimes: ['video/mp4', 'application/javascript'],
+ protocols: [2, 5],
+ api: [1, 2],
}
},
bids: [{
bidder: 'oneVideo',
params: {
video: {
- playerWidth: 640,
- playerHeight: 480,
- mimes: ['video/mp4', 'application/javascript'],
- protocols: [2, 5],
- api: [1, 2],
ttl: 300,
content: {
id: "1234",
@@ -373,18 +421,16 @@ const adUnits = [{
mediaTypes: {
video: {
context: 'outstream',
- playerSize: [640, 480]
+ playerSize: [640, 480],
+ mimes: ['video/mp4', 'application/javascript'],
+ protocols: [2, 5],
+ api: [1, 2],
}
},
bids: [{
bidder: 'oneVideo',
params: {
video: {
- playerWidth: 640,
- playerHeight: 480,
- mimes: ['video/mp4', 'application/javascript'],
- protocols: [2, 5],
- api: [1, 2],
ttl: 300
},
bidfloor: 0.5,
diff --git a/modules/onetagBidAdapter.js b/modules/onetagBidAdapter.js
index 0974f9db4cf..aab68176d87 100644
--- a/modules/onetagBidAdapter.js
+++ b/modules/onetagBidAdapter.js
@@ -109,7 +109,10 @@ function interpretResponse(serverResponse, bidderRequest) {
if (bid.mediaType === BANNER) {
responseBid.ad = bid.ad;
} else if (bid.mediaType === VIDEO) {
- const {context, adUnitCode} = find(requestData.bids, (item) => item.bidId === bid.requestId);
+ const {context, adUnitCode} = find(requestData.bids, (item) =>
+ item.bidId === bid.requestId &&
+ item.type === VIDEO
+ );
if (context === INSTREAM) {
responseBid.vastUrl = bid.vastUrl;
responseBid.videoCacheKey = bid.videoCacheKey;
@@ -201,6 +204,10 @@ function getPageInfo() {
topmostFrame.document.referrer !== ''
? topmostFrame.document.referrer
: null,
+ ancestorOrigin:
+ window.location.ancestorOrigins && window.location.ancestorOrigins[0] != null
+ ? window.location.ancestorOrigins[0]
+ : null,
masked: currentFrameNesting,
wWidth: topmostFrame.innerWidth,
wHeight: topmostFrame.innerHeight,
@@ -240,6 +247,7 @@ function requestsToBids(bidRequests) {
videoObj['protocols'] = bidRequest.mediaTypes.video.protocols;
videoObj['maxDuration'] = bidRequest.mediaTypes.video.maxduration;
videoObj['api'] = bidRequest.mediaTypes.video.api;
+ videoObj['playbackmethod'] = bidRequest.mediaTypes.video.playbackmethod || [];
videoObj['type'] = VIDEO;
return videoObj;
});
diff --git a/modules/onomagicBidAdapter.js b/modules/onomagicBidAdapter.js
index 55fca29fbf3..548c0170c05 100644
--- a/modules/onomagicBidAdapter.js
+++ b/modules/onomagicBidAdapter.js
@@ -46,7 +46,7 @@ function buildRequests(bidReqs, bidderRequest) {
},
tagid: String(bid.adUnitCode)
};
- const bidFloor = utils.getBidIdParameter('bidFloor', bid.params);
+ const bidFloor = _getBidFloor(bid);
if (bidFloor) {
imp.bidfloor = bidFloor;
}
@@ -117,7 +117,10 @@ function interpretResponse(serverResponse) {
netRevenue: true,
mediaType: BANNER,
ad: _getAdMarkup(onomagicBid),
- ttl: 60
+ ttl: 60,
+ meta: {
+ advertiserDomains: onomagicBid && onomagicBid.adomain ? onomagicBid.adomain : []
+ }
});
});
}
@@ -243,4 +246,20 @@ function _getPercentInView(element, topWin, { w, h } = {}) {
return 0;
}
+function _getBidFloor(bid) {
+ if (!utils.isFn(bid.getFloor)) {
+ return bid.params.bidFloor ? bid.params.bidFloor : null;
+ }
+
+ let floor = bid.getFloor({
+ currency: 'USD',
+ mediaType: '*',
+ size: '*'
+ });
+ if (utils.isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'USD') {
+ return floor.floor;
+ }
+ return null;
+}
+
registerBidder(spec);
diff --git a/modules/open8BidAdapter.js b/modules/open8BidAdapter.js
deleted file mode 100644
index 744cce2b5f9..00000000000
--- a/modules/open8BidAdapter.js
+++ /dev/null
@@ -1,185 +0,0 @@
-import { Renderer } from '../src/Renderer.js';
-import {ajax} from '../src/ajax.js';
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { VIDEO, BANNER } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'open8';
-const URL = 'https://as.vt.open8.com/v1/control/prebid';
-const AD_TYPE = {
- VIDEO: 1,
- BANNER: 2
-};
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [VIDEO, BANNER],
-
- isBidRequestValid: function(bid) {
- return !!(bid.params.slotKey);
- },
-
- buildRequests: function(validBidRequests, bidderRequest) {
- var requests = [];
- for (var i = 0; i < validBidRequests.length; i++) {
- var bid = validBidRequests[i];
- var queryString = '';
- var slotKey = utils.getBidIdParameter('slotKey', bid.params);
- queryString = utils.tryAppendQueryString(queryString, 'slot_key', slotKey);
- queryString = utils.tryAppendQueryString(queryString, 'imp_id', generateImpId());
- queryString += ('bid_id=' + bid.bidId);
-
- requests.push({
- method: 'GET',
- url: URL,
- data: queryString
- });
- }
- return requests;
- },
-
- interpretResponse: function(serverResponse, request) {
- var bidderResponse = serverResponse.body;
-
- if (!bidderResponse.isAdReturn) {
- return [];
- }
-
- var ad = bidderResponse.ad;
-
- const bid = {
- slotKey: bidderResponse.slotKey,
- userId: bidderResponse.userId,
- impId: bidderResponse.impId,
- media: bidderResponse.media,
- ds: ad.ds,
- spd: ad.spd,
- fa: ad.fa,
- pr: ad.pr,
- mr: ad.mr,
- nurl: ad.nurl,
- requestId: ad.bidId,
- cpm: ad.price,
- creativeId: ad.creativeId,
- dealId: ad.dealId,
- currency: ad.currency || 'JPY',
- netRevenue: true,
- ttl: 360, // 6 minutes
- }
-
- if (ad.adType === AD_TYPE.VIDEO) {
- const videoAd = bidderResponse.ad.video;
- Object.assign(bid, {
- vastXml: videoAd.vastXml,
- width: videoAd.w,
- height: videoAd.h,
- renderer: newRenderer(bidderResponse),
- adResponse: bidderResponse,
- mediaType: VIDEO
- });
- } else if (ad.adType === AD_TYPE.BANNER) {
- const bannerAd = bidderResponse.ad.banner;
- Object.assign(bid, {
- width: bannerAd.w,
- height: bannerAd.h,
- ad: bannerAd.adm,
- mediaType: BANNER
- });
- if (bannerAd.imps) {
- try {
- bannerAd.imps.forEach(impTrackUrl => {
- const tracker = utils.createTrackPixelHtml(impTrackUrl);
- bid.ad += tracker;
- });
- } catch (error) {
- utils.logError('Error appending imp tracking pixel', error);
- }
- }
- }
- return [bid];
- },
-
- getUserSyncs: function(syncOptions, serverResponses) {
- const syncs = [];
- if (syncOptions.iframeEnabled && serverResponses.length) {
- const syncIFs = serverResponses[0].body.syncIFs;
- if (syncIFs) {
- syncIFs.forEach(sync => {
- syncs.push({
- type: 'iframe',
- url: sync
- });
- });
- }
- }
- if (syncOptions.pixelEnabled && serverResponses.length) {
- const syncPixs = serverResponses[0].body.syncPixels;
- if (syncPixs) {
- syncPixs.forEach(sync => {
- syncs.push({
- type: 'image',
- url: sync
- });
- });
- }
- }
- return syncs;
- },
- onBidWon: function(bid) {
- if (!bid.nurl) { return; }
- const winUrl = bid.nurl.replace(
- /\$\{AUCTION_PRICE\}/,
- bid.cpm
- );
- ajax(winUrl, null);
- }
-}
-
-function generateImpId() {
- var l = 16;
- var c = 'abcdefghijklmnopqrstuvwsyz0123456789';
- var cl = c.length;
- var r = '';
- for (var i = 0; i < l; i++) {
- r += c[Math.floor(Math.random() * cl)];
- }
- return r;
-}
-
-function newRenderer(bidderResponse) {
- const renderer = Renderer.install({
- id: bidderResponse.ad.bidId,
- url: bidderResponse.ad.video.purl,
- loaded: false,
- });
-
- try {
- renderer.setRender(outstreamRender);
- } catch (err) {
- utils.logWarn('Prebid Error calling setRender on newRenderer', err);
- }
-
- return renderer;
-}
-
-function outstreamRender(bid) {
- bid.renderer.push(() => {
- window.op8.renderPrebid({
- vastXml: bid.vastXml,
- adUnitCode: bid.adUnitCode,
- slotKey: bid.slotKey,
- impId: bid.impId,
- userId: bid.userId,
- media: bid.media,
- ds: bid.ds,
- spd: bid.spd,
- fa: bid.fa,
- pr: bid.pr,
- mr: bid.mr,
- adResponse: bid.adResponse,
- mediaType: bid.mediaType
- });
- });
-}
-
-registerBidder(spec);
diff --git a/modules/openwebBidAdapter.js b/modules/openwebBidAdapter.js
new file mode 100644
index 00000000000..7aa4e05663e
--- /dev/null
+++ b/modules/openwebBidAdapter.js
@@ -0,0 +1,247 @@
+import * as utils from '../src/utils.js';
+import { registerBidder } from '../src/adapters/bidderFactory.js';
+import { ADPOD, BANNER, VIDEO } from '../src/mediaTypes.js';
+import { config } from '../src/config.js';
+import find from 'core-js-pure/features/array/find.js';
+
+const ENDPOINT = 'https://ghb.spotim.market';
+const BIDDER_CODE = 'openweb';
+const DISPLAY = 'display';
+const syncsCache = {};
+
+export const spec = {
+ code: BIDDER_CODE,
+ gvlid: 280,
+ supportedMediaTypes: [VIDEO, BANNER, ADPOD],
+ isBidRequestValid: function (bid) {
+ return utils.isNumber(utils.deepAccess(bid, 'params.aid'));
+ },
+ getUserSyncs: function (syncOptions, serverResponses) {
+ const syncs = [];
+
+ function addSyncs(bid) {
+ const uris = bid.cookieURLs;
+ const types = bid.cookieURLSTypes || [];
+
+ if (Array.isArray(uris)) {
+ uris.forEach((uri, i) => {
+ const type = types[i] || 'image';
+
+ if ((!syncOptions.pixelEnabled && type === 'image') ||
+ (!syncOptions.iframeEnabled && type === 'iframe') ||
+ syncsCache[uri]) {
+ return;
+ }
+
+ syncsCache[uri] = true;
+ syncs.push({
+ type: type,
+ url: uri
+ })
+ })
+ }
+ }
+
+ if (syncOptions.pixelEnabled || syncOptions.iframeEnabled) {
+ utils.isArray(serverResponses) && serverResponses.forEach((response) => {
+ if (response.body) {
+ if (utils.isArray(response.body)) {
+ response.body.forEach(b => {
+ addSyncs(b);
+ })
+ } else {
+ addSyncs(response.body)
+ }
+ }
+ })
+ }
+ return syncs;
+ },
+ /**
+ * Make a server request from the list of BidRequests
+ * @param bidRequests
+ * @param adapterRequest
+ */
+ buildRequests: function (bidRequests, adapterRequest) {
+ const { tag, bids } = bidToTag(bidRequests, adapterRequest);
+ return [{
+ data: Object.assign({}, tag, { BidRequests: bids }),
+ adapterRequest,
+ method: 'POST',
+ url: ENDPOINT
+ }];
+ },
+
+ /**
+ * Unpack the response from the server into a list of bids
+ * @param serverResponse
+ * @param bidderRequest
+ * @return {Bid[]} An array of bids which were nested inside the server
+ */
+ interpretResponse: function (serverResponse, { adapterRequest }) {
+ serverResponse = serverResponse.body;
+ let bids = [];
+
+ if (!utils.isArray(serverResponse)) {
+ return parseRTBResponse(serverResponse, adapterRequest);
+ }
+
+ serverResponse.forEach(serverBidResponse => {
+ bids = utils.flatten(bids, parseRTBResponse(serverBidResponse, adapterRequest));
+ });
+
+ return bids;
+ },
+
+ transformBidParams(params) {
+ return utils.convertTypes({
+ 'aid': 'number',
+ }, params);
+ }
+};
+
+function parseRTBResponse(serverResponse, adapterRequest) {
+ const isEmptyResponse = !serverResponse || !utils.isArray(serverResponse.bids);
+ const bids = [];
+
+ if (isEmptyResponse) {
+ return bids;
+ }
+
+ serverResponse.bids.forEach(serverBid => {
+ const request = find(adapterRequest.bids, (bidRequest) => {
+ return bidRequest.bidId === serverBid.requestId;
+ });
+
+ if (serverBid.cpm !== 0 && request !== undefined) {
+ const bid = createBid(serverBid, request);
+
+ bids.push(bid);
+ }
+ });
+
+ return bids;
+}
+
+function bidToTag(bidRequests, adapterRequest) {
+ // start publisher env
+ const tag = {
+ Domain: utils.deepAccess(adapterRequest, 'refererInfo.referer')
+ };
+ if (config.getConfig('coppa') === true) {
+ tag.Coppa = 1;
+ }
+ if (utils.deepAccess(adapterRequest, 'gdprConsent.gdprApplies')) {
+ tag.GDPR = 1;
+ tag.GDPRConsent = utils.deepAccess(adapterRequest, 'gdprConsent.consentString');
+ }
+ if (utils.deepAccess(adapterRequest, 'uspConsent')) {
+ tag.USP = utils.deepAccess(adapterRequest, 'uspConsent');
+ }
+ if (utils.deepAccess(bidRequests[0], 'schain')) {
+ tag.Schain = utils.deepAccess(bidRequests[0], 'schain');
+ }
+ if (utils.deepAccess(bidRequests[0], 'userId')) {
+ tag.UserIds = utils.deepAccess(bidRequests[0], 'userId');
+ }
+ if (utils.deepAccess(bidRequests[0], 'userIdAsEids')) {
+ tag.UserEids = utils.deepAccess(bidRequests[0], 'userIdAsEids');
+ }
+ // end publisher env
+ const bids = []
+
+ for (let i = 0, length = bidRequests.length; i < length; i++) {
+ const bid = prepareBidRequests(bidRequests[i]);
+ bids.push(bid);
+ }
+
+ return { tag, bids };
+}
+
+/**
+ * Parse mediaType
+ * @param bidReq {object}
+ * @returns {object}
+ */
+function prepareBidRequests(bidReq) {
+ const mediaType = utils.deepAccess(bidReq, 'mediaTypes.video') ? VIDEO : DISPLAY;
+ const sizes = mediaType === VIDEO ? utils.deepAccess(bidReq, 'mediaTypes.video.playerSize') : utils.deepAccess(bidReq, 'mediaTypes.banner.sizes');
+ const bidReqParams = {
+ 'CallbackId': bidReq.bidId,
+ 'Aid': bidReq.params.aid,
+ 'AdType': mediaType,
+ 'Sizes': utils.parseSizesInput(sizes).join(',')
+ };
+
+ bidReqParams.PlacementId = bidReq.adUnitCode;
+ if (bidReq.params.iframe) {
+ bidReqParams.AdmType = 'iframe';
+ }
+ if (mediaType === VIDEO) {
+ const context = utils.deepAccess(bidReq, 'mediaTypes.video.context');
+ if (context === ADPOD) {
+ bidReqParams.Adpod = utils.deepAccess(bidReq, 'mediaTypes.video');
+ }
+ }
+ return bidReqParams;
+}
+
+/**
+ * Prepare all parameters for request
+ * @param bidderRequest {object}
+ * @returns {object}
+ */
+function getMediaType(bidderRequest) {
+ return utils.deepAccess(bidderRequest, 'mediaTypes.video') ? VIDEO : BANNER;
+}
+
+/**
+ * Configure new bid by response
+ * @param bidResponse {object}
+ * @param bidRequest {Object}
+ * @returns {object}
+ */
+function createBid(bidResponse, bidRequest) {
+ const mediaType = getMediaType(bidRequest)
+ const context = utils.deepAccess(bidRequest, 'mediaTypes.video.context');
+ const bid = {
+ requestId: bidResponse.requestId,
+ creativeId: bidResponse.cmpId,
+ height: bidResponse.height,
+ currency: bidResponse.cur,
+ width: bidResponse.width,
+ cpm: bidResponse.cpm,
+ netRevenue: true,
+ mediaType,
+ ttl: 300,
+ meta: {
+ advertiserDomains: bidResponse.adomain || []
+ }
+ };
+
+ if (mediaType === BANNER) {
+ return Object.assign(bid, {
+ ad: bidResponse.ad,
+ adUrl: bidResponse.adUrl,
+ });
+ }
+ if (context === ADPOD) {
+ Object.assign(bid, {
+ meta: {
+ primaryCatId: bidResponse.primaryCatId,
+ },
+ video: {
+ context: ADPOD,
+ durationSeconds: bidResponse.durationSeconds
+ }
+ });
+ }
+
+ Object.assign(bid, {
+ vastUrl: bidResponse.vastUrl
+ });
+
+ return bid;
+}
+
+registerBidder(spec);
diff --git a/modules/openwebBidAdapter.md b/modules/openwebBidAdapter.md
new file mode 100644
index 00000000000..dc8bfa6c59e
--- /dev/null
+++ b/modules/openwebBidAdapter.md
@@ -0,0 +1,27 @@
+# Overview
+
+**Module Name**: OpenWeb Bidder Adapter
+**Module Type**: Bidder Adapter
+**Maintainer**: monetization@openweb.com
+
+# Description
+
+OpenWeb.com official prebid adapter. Available in both client and server side versions.
+OpenWeb header bidding adapter provides solution for accessing both Video and Display demand.
+
+# Test Parameters
+```
+ var adUnits = [
+ // Banner adUnit
+ {
+ code: 'div-test-div',
+ sizes: [[300, 250]],
+ bids: [{
+ bidder: 'openweb',
+ params: {
+ aid: 529814
+ }
+ }]
+ }
+ ];
+```
diff --git a/modules/openxAnalyticsAdapter.js b/modules/openxAnalyticsAdapter.js
index 07966e9e401..0c01d4b461e 100644
--- a/modules/openxAnalyticsAdapter.js
+++ b/modules/openxAnalyticsAdapter.js
@@ -46,9 +46,9 @@ const UTM_TO_CAMPAIGN_PROPERTIES = {
* @property {string} orgId
* @property {string} publisherPlatformId
* @property {number} publisherAccountId
+ * @property {string} configId
+ * @property {string} optimizerConfig
* @property {number} sampling
- * @property {boolean} enableV2
- * @property {boolean} testPipeline
* @property {Object} campaign
* @property {number} payloadWaitTime
* @property {number} payloadWaitTimePadding
@@ -141,9 +141,9 @@ function isValidConfig({options: analyticsOptions}) {
['orgId', 'string', hasOrgId],
['publisherPlatformId', 'string', !hasOrgId],
['publisherAccountId', 'number', !hasOrgId],
+ ['configId', 'string', false],
+ ['optimizerConfig', 'string', false],
['sampling', 'number', false],
- ['enableV2', 'boolean', false],
- ['testPipeline', 'boolean', false],
['adIdKey', 'string', false],
['payloadWaitTime', 'number', false],
['payloadWaitTimePadding', 'number', false],
@@ -271,7 +271,7 @@ function prebidAnalyticsEventHandler({eventType, args}) {
* @property {Array} bidsReceived //: []
* @property {Array} winningBids //: []
* @property {number} timeout //: 3000
- * @property {Object} config //: {publisherPlatformId: "a3aece0c-9e80-4316-8deb-faf804779bd1", publisherAccountId: 537143056, sampling: 1, enableV2: true}/*
+ * @property {Object} config //: {publisherPlatformId: "a3aece0c-9e80-4316-8deb-faf804779bd1", publisherAccountId: 537143056, sampling: 1}/*
*/
function onAuctionInit({auctionId, timestamp: startTime, timeout, adUnitCodes}) {
@@ -437,7 +437,18 @@ function onBidWon(bidResponse) {
`${auctionId}.adUnitCodeToAdUnitMap.${adUnitCode}.bidRequestsMap.${requestId}.bids.${adId}`);
if (winningBid) {
- winningBid.winner = true
+ winningBid.winner = true;
+ const auction = auctionMap[auctionId];
+ if (auction.sent) {
+ const endpoint = (analyticsConfig.endpoint || ENDPOINT) + 'event';
+ const bidder = auction.adUnitCodeToAdUnitMap[adUnitCode].bidRequestsMap[requestId].bidder;
+ ajax(`${endpoint}?t=win&b=${adId}&a=${analyticsConfig.orgId}&bidder=${bidder}&ts=${auction.startTime}`,
+ () => {
+ utils.logInfo(`Openx Analytics - Sending complete impression event for ${adId} at ${Date.now()}`)
+ });
+ } else {
+ utils.logInfo(`Openx Analytics - impression event for ${adId} will be sent with auction data`)
+ }
}
}
@@ -529,17 +540,20 @@ function getPageOffset() {
}
function delayedSend(auction) {
+ if (auction.sent) {
+ return;
+ }
const delayTime = auction.adunitCodesRenderedCount === auction.adUnitCodesCount
? analyticsConfig.payloadWaitTime
: analyticsConfig.payloadWaitTime + analyticsConfig.payloadWaitTimePadding;
auction.auctionSendDelayTimer = setTimeout(() => {
+ auction.sent = true; // any BidWon emitted after this will be recorded separately
let payload = JSON.stringify([buildAuctionPayload(auction)]);
- ajax(ENDPOINT, deleteAuctionMap, payload, { contentType: 'application/json' });
- function deleteAuctionMap() {
- delete auctionMap[auction.id];
- }
+ ajax(analyticsConfig.endpoint || ENDPOINT, () => {
+ utils.logInfo(`OpenX Analytics - Sending complete auction at ${Date.now()}`);
+ }, payload, { contentType: 'application/json' });
}, delayTime);
}
@@ -606,15 +620,19 @@ function getAuctionByGoogleTagSLot(slot) {
}
function buildAuctionPayload(auction) {
- let {startTime, endTime, state, timeout, auctionOrder, userIds, adUnitCodeToAdUnitMap} = auction;
- let {orgId, publisherPlatformId, publisherAccountId, campaign} = analyticsConfig;
+ let {startTime, endTime, state, timeout, auctionOrder, userIds, adUnitCodeToAdUnitMap, id} = auction;
+ const auctionId = id;
+ let {orgId, publisherPlatformId, publisherAccountId, campaign, testCode, configId, optimizerConfig} = analyticsConfig;
return {
+ auctionId,
adapterVersion: ADAPTER_VERSION,
schemaVersion: SCHEMA_VERSION,
orgId,
publisherPlatformId,
publisherAccountId,
+ configId,
+ optimizerConfig,
campaign,
state,
startTime,
@@ -624,7 +642,7 @@ function buildAuctionPayload(auction) {
deviceType: detectMob() ? 'Mobile' : 'Desktop',
deviceOSType: detectOS(),
browser: detectBrowser(),
- testCode: analyticsConfig.testCode,
+ testCode: testCode,
// return an array of module name that have user data
userIdProviders: buildUserIdProviders(userIds),
adUnits: buildAdUnitsPayload(adUnitCodeToAdUnitMap),
@@ -653,6 +671,7 @@ function buildAuctionPayload(auction) {
timedOut,
bidResponses: utils._map(bidRequest.bids, (bidderBidResponse) => {
let {
+ adId,
cpm,
creativeId,
ts,
@@ -671,6 +690,7 @@ function buildAuctionPayload(auction) {
} = bidderBidResponse;
return {
+ bidId: adId,
microCpm: cpm * 1000000,
netRevenue,
currency,
diff --git a/modules/openxBidAdapter.js b/modules/openxBidAdapter.js
index a398a20a5c5..4644b77bb08 100644
--- a/modules/openxBidAdapter.js
+++ b/modules/openxBidAdapter.js
@@ -31,10 +31,10 @@ export const USER_ID_CODE_TO_QUERY_ARG = {
parrableId: 'parrableid', // Parrable ID
pubcid: 'pubcid', // PubCommon ID
quantcastId: 'quantcastid', // Quantcast ID
- sharedId: 'sharedid', // Shared ID User ID
tapadId: 'tapadid', // Tapad Id
tdid: 'ttduuid', // The Trade Desk Unified ID
- verizonMediaId: 'verizonmediaid', // Verizon Media ConnectID
+ uid2: 'uid2', // Unified ID 2.0
+ flocId: 'floc', // Chrome FLoC
};
export const spec = {
@@ -292,6 +292,12 @@ function appendUserIdsToQueryParams(queryParams, userIds) {
if (USER_ID_CODE_TO_QUERY_ARG.hasOwnProperty(userIdProviderKey)) {
switch (userIdProviderKey) {
+ case 'flocId':
+ queryParams[key] = userIdObjectOrValue.id;
+ break;
+ case 'uid2':
+ queryParams[key] = userIdObjectOrValue.id;
+ break;
case 'lipb':
queryParams[key] = userIdObjectOrValue.lipbid;
break;
diff --git a/modules/operaadsBidAdapter.js b/modules/operaadsBidAdapter.js
new file mode 100644
index 00000000000..85ba25c1404
--- /dev/null
+++ b/modules/operaadsBidAdapter.js
@@ -0,0 +1,818 @@
+import * as utils from '../src/utils.js';
+import { registerBidder } from '../src/adapters/bidderFactory.js';
+import { config } from '../src/config.js';
+import { BANNER, VIDEO, NATIVE } from '../src/mediaTypes.js';
+import { Renderer } from '../src/Renderer.js';
+import { OUTSTREAM } from '../src/video.js';
+
+const BIDDER_CODE = 'operaads';
+
+const ENDPOINT = 'https://s.adx.opera.com/ortb/v2/';
+
+const OUTSTREAM_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';
+
+const DEFAULT_CURRENCY = 'USD';
+const DEFAULT_LANGUAGE = 'en';
+const NET_REVENUE = true;
+
+const BANNER_DEFAULTS = {
+ SIZE: [300, 250]
+}
+
+const VIDEO_DEFAULTS = {
+ PROTOCOLS: [2, 3, 5, 6],
+ MIMES: ['video/mp4'],
+ PLAYBACK_METHODS: [1, 2, 3, 4],
+ DELIVERY: [1],
+ API: [1, 2, 5],
+ SIZE: [640, 480]
+}
+
+const NATIVE_DEFAULTS = {
+ IMAGE_TYPE: {
+ ICON: 1,
+ MAIN: 3,
+ },
+ ASSET_ID: {
+ TITLE: 1,
+ IMAGE: 2,
+ ICON: 3,
+ BODY: 4,
+ SPONSORED: 5,
+ CTA: 6
+ },
+ DATA_ASSET_TYPE: {
+ SPONSORED: 1,
+ DESC: 2,
+ CTA_TEXT: 12,
+ },
+ LENGTH: {
+ TITLE: 90,
+ BODY: 140,
+ SPONSORED: 25,
+ CTA: 20
+ }
+}
+
+export const spec = {
+ code: BIDDER_CODE,
+
+ // short code
+ aliases: ['opera'],
+
+ supportedMediaTypes: [BANNER, VIDEO, NATIVE],
+
+ /**
+ * Determines whether or not the given bid request is valid.
+ *
+ * @param {BidRequest} bid
+ * @returns boolean True if this is a valid bid, and false otherwise.
+ */
+ isBidRequestValid: function (bid) {
+ if (!bid) {
+ utils.logWarn(BIDDER_CODE, 'Invalid bid,', bid);
+ return false;
+ }
+
+ if (!bid.params) {
+ utils.logWarn(BIDDER_CODE, 'bid.params is required.')
+ return false;
+ }
+
+ if (!bid.params.placementId) {
+ utils.logWarn(BIDDER_CODE, 'bid.params.placementId is required.')
+ return false;
+ }
+
+ if (!bid.params.endpointId) {
+ utils.logWarn(BIDDER_CODE, 'bid.params.endpointId is required.')
+ return false;
+ }
+
+ if (!bid.params.publisherId) {
+ utils.logWarn(BIDDER_CODE, 'bid.params.publisherId is required.')
+ return false;
+ }
+
+ return true;
+ },
+
+ /**
+ * Make a server request from the list of BidRequests.
+ *
+ * @param {validBidRequests[]} validBidRequests An array of bidRequest objects
+ * @param {bidderRequest} bidderRequest The master bidRequest object.
+ * @return ServerRequest Info describing the request to the server.
+ */
+ buildRequests: function (validBidRequests, bidderRequest) {
+ return validBidRequests.map(validBidRequest => (buildOpenRtbBidRequest(validBidRequest, bidderRequest)))
+ },
+
+ /**
+ * 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, bidRequest) {
+ let bidResponses = [];
+
+ let serverBody;
+ if ((serverBody = serverResponse.body) && serverBody.seatbid && utils.isArray(serverBody.seatbid)) {
+ serverBody.seatbid.forEach((seatbidder) => {
+ if (seatbidder.bid && utils.isArray(seatbidder.bid)) {
+ bidResponses = seatbidder.bid.map((bid) => buildBidResponse(bid, bidRequest.originalBidRequest, serverBody));
+ }
+ });
+ }
+
+ return bidResponses;
+ },
+
+ /**
+ * 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: function (syncOptions, serverResponses, gdprConsent, uspConsent) {
+ return [];
+ },
+
+ /**
+ * Register bidder specific code, which will execute if bidder timed out after an auction
+ *
+ * @param {data} timeoutData Containing timeout specific data
+ */
+ onTimeout: function (timeoutData) { },
+
+ /**
+ * Register bidder specific code, which will execute if a bid from this bidder won the auction
+ *
+ * @param {Bid} bid The bid that won the auction
+ */
+ onBidWon: function (bid) {
+ if (!bid || !utils.isStr(bid.nurl)) {
+ return;
+ }
+
+ let winCpm, winCurr;
+ if (Object.prototype.hasOwnProperty.call(bid, 'originalCpm')) {
+ winCpm = bid.originalCpm;
+ winCurr = bid.originalCurrency;
+ } else {
+ winCpm = bid.cpm;
+ winCurr = bid.currency;
+ }
+
+ utils.triggerPixel(
+ bid.nurl
+ .replace(/\$\{AUCTION_PRICE\}/g, winCpm)
+ .replace(/\$\{AUCTION_CURRENCY\}/g, winCurr)
+ );
+ },
+
+ /**
+ * Register bidder specific code, which will execute when the adserver targeting has been set for a bid from this bidder
+ *
+ * @param {Bid} bid The bid of which the targeting has been set
+ */
+ onSetTargeting: function (bid) { }
+}
+
+/**
+ * Buid openRtb request from bidRequest and bidderRequest
+ *
+ * @param {BidRequest} bidRequest
+ * @param {BidderRequest} bidderRequest
+ * @returns {Request}
+ */
+function buildOpenRtbBidRequest(bidRequest, bidderRequest) {
+ const currencies = getCurrencies(bidRequest);
+
+ const pageReferrer = utils.deepAccess(bidderRequest, 'refererInfo.referer');
+
+ // build OpenRTB request body
+ const payload = {
+ id: bidderRequest.auctionId,
+ tmax: bidderRequest.timeout || config.getConfig('bidderTimeout'),
+ test: config.getConfig('debug') ? 1 : 0,
+ imp: createImp(bidRequest, currencies[0]),
+ device: getDevice(),
+ site: {
+ id: String(utils.deepAccess(bidRequest, 'params.publisherId')),
+ domain: getDomain(pageReferrer),
+ page: pageReferrer,
+ ref: window.self === window.top ? document.referrer : '',
+ },
+ at: 1,
+ bcat: getBcat(bidRequest),
+ cur: currencies,
+ regs: {
+ coppa: config.getConfig('coppa') ? 1 : 0,
+ ext: {}
+ },
+ user: {
+ id: getUserId(bidRequest)
+ }
+ }
+
+ const gdprConsent = utils.deepAccess(bidderRequest, 'gdprConsent');
+ if (!!gdprConsent && gdprConsent.gdprApplies) {
+ utils.deepSetValue(payload, 'regs.ext.gdpr', 1);
+ utils.deepSetValue(payload, 'user.ext.consent', gdprConsent.consentString);
+ }
+
+ const uspConsent = utils.deepAccess(bidderRequest, 'uspConsent');
+ if (uspConsent) {
+ utils.deepSetValue(payload, 'regs.ext.us_privacy', uspConsent);
+ }
+
+ const eids = utils.deepAccess(bidRequest, 'userIdAsEids', []);
+ if (eids.length > 0) {
+ utils.deepSetValue(payload, 'user.eids', eids);
+ }
+
+ return {
+ method: 'POST',
+ url: ENDPOINT + String(utils.deepAccess(bidRequest, 'params.publisherId')) +
+ '?ep=' + String(utils.deepAccess(bidRequest, 'params.endpointId')),
+ data: JSON.stringify(payload),
+ options: {
+ contentType: 'application/json',
+ customHeaders: {
+ 'x-openrtb-version': 2.5
+ }
+ },
+ // set original bid request, so we can get it from interpretResponse
+ originalBidRequest: bidRequest
+ }
+}
+
+/**
+ * Build bid response from openrtb bid response.
+ *
+ * @param {OpenRtbBid} bid
+ * @param {BidRequest} bidRequest
+ * @param {OpenRtbResponseBody} responseBody
+ * @returns {BidResponse}
+ */
+function buildBidResponse(bid, bidRequest, responseBody) {
+ let mediaType = BANNER;
+ let nativeResponse;
+
+ if (/VAST\s+version/.test(bid.adm)) {
+ mediaType = VIDEO;
+ } else {
+ let markup;
+ try {
+ markup = JSON.parse(bid.adm);
+ } catch (e) {
+ markup = null;
+ }
+
+ // OpenRtb Markup Response Object
+ // https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-Native-Ads-Specification-1-1_2016.pdf#5.1
+ if (markup && utils.isPlainObject(markup.native)) {
+ mediaType = NATIVE;
+ nativeResponse = markup.native;
+ }
+ }
+
+ const currency = responseBody.cur || DEFAULT_CURRENCY;
+ const cpm = (parseFloat(bid.price) || 0).toFixed(2);
+
+ const categories = utils.deepAccess(bid, 'cat', []);
+
+ const bidResponse = {
+ requestId: bid.impid,
+ cpm: cpm,
+ currency: currency,
+ mediaType: mediaType,
+ ttl: 300,
+ creativeId: bid.crid || bid.id,
+ netRevenue: NET_REVENUE,
+ nurl: bid.nurl,
+ lurl: bid.lurl,
+ meta: {
+ mediaType: mediaType,
+ primaryCatId: categories[0],
+ secondaryCatIds: categories.slice(1),
+ }
+ };
+
+ if (bid.adomain && utils.isArray(bid.adomain) && bid.adomain.length > 0) {
+ bidResponse.meta.advertiserDomains = bid.adomain;
+ bidResponse.meta.clickUrl = bid.adomain[0];
+ }
+
+ switch (mediaType) {
+ case VIDEO: {
+ const playerSize = utils.deepAccess(bidRequest, 'mediaTypes.video.playerSize', VIDEO_DEFAULTS.SIZE);
+ const size = canonicalizeSizesArray(playerSize)[0];
+
+ bidResponse.vastXml = bid.adm;
+
+ bidResponse.width = bid.w || size[0];
+ bidResponse.height = bid.h || size[1];
+
+ const context = utils.deepAccess(bidRequest, 'mediaTypes.video.context');
+
+ // if outstream video, add a default render for it.
+ if (context === OUTSTREAM) {
+ // fill adResponse, will be used in ANOutstreamVideo.renderAd
+ bidResponse.adResponse = {
+ content: bidResponse.vastXml,
+ width: bidResponse.width,
+ height: bidResponse.height,
+ player_width: size[0],
+ player_height: size[1],
+ };
+ bidResponse.renderer = createRenderer(bidRequest);
+ }
+ break;
+ }
+ case NATIVE: {
+ bidResponse.native = interpretNativeAd(nativeResponse, currency, cpm);
+ break;
+ }
+ default: {
+ bidResponse.ad = bid.adm;
+
+ bidResponse.width = bid.w;
+ bidResponse.height = bid.h;
+ }
+ }
+ return bidResponse;
+}
+
+/**
+ * Convert OpenRtb native response to bid native object.
+ *
+ * @param {OpenRtbNativeResponse} nativeResponse
+ * @param {String} currency
+ * @param {String} cpm
+ * @returns {BidNative} native
+ */
+function interpretNativeAd(nativeResponse, currency, cpm) {
+ const native = {};
+
+ // OpenRtb Link Object
+ // https://www.iab.com/wp-content/uploads/2016/03/OpenRTB-Native-Ads-Specification-1-1_2016.pdf#5.7
+ const clickUrl = utils.deepAccess(nativeResponse, 'link.url');
+ if (clickUrl && utils.isStr(clickUrl)) {
+ native.clickUrl = decodeURIComponent(clickUrl);
+ }
+
+ const clickTrackers = utils.deepAccess(nativeResponse, 'link.clicktrackers');
+ if (clickTrackers && utils.isArray(clickTrackers)) {
+ native.clickTrackers = clickTrackers
+ .filter(Boolean)
+ .map(
+ url => decodeURIComponent(url)
+ .replace(/\$\{AUCTION_PRICE\}/g, cpm)
+ .replace(/\$\{AUCTION_CURRENCY\}/g, currency)
+ );
+ }
+
+ if (nativeResponse.imptrackers && utils.isArray(nativeResponse.imptrackers)) {
+ native.impressionTrackers = nativeResponse.imptrackers
+ .filter(Boolean)
+ .map(
+ url => decodeURIComponent(url)
+ .replace(/\$\{AUCTION_PRICE\}/g, cpm)
+ .replace(/\$\{AUCTION_CURRENCY\}/g, currency)
+ );
+ }
+
+ if (nativeResponse.jstracker && utils.isStr(nativeResponse.jstracker)) {
+ native.javascriptTrackers = [nativeResponse.jstracker];
+ }
+
+ let assets;
+ if ((assets = nativeResponse.assets) && utils.isArray(assets)) {
+ assets.forEach((asset) => {
+ switch (asset.id) {
+ case NATIVE_DEFAULTS.ASSET_ID.TITLE: {
+ const title = utils.deepAccess(asset, 'title.text');
+ if (title) {
+ native.title = title;
+ }
+ break;
+ }
+ case NATIVE_DEFAULTS.ASSET_ID.IMAGE: {
+ if (asset.img) {
+ native.image = {
+ url: decodeURIComponent(asset.img.url),
+ width: asset.img.w,
+ height: asset.img.h
+ }
+ }
+ break;
+ }
+ case NATIVE_DEFAULTS.ASSET_ID.ICON: {
+ if (asset.img) {
+ native.icon = {
+ url: decodeURIComponent(asset.img.url),
+ width: asset.img.w,
+ height: asset.img.h
+ }
+ }
+ break;
+ }
+ case NATIVE_DEFAULTS.ASSET_ID.BODY: {
+ const body = utils.deepAccess(asset, 'data.value');
+ if (body) {
+ native.body = body;
+ }
+ break;
+ }
+ case NATIVE_DEFAULTS.ASSET_ID.SPONSORED: {
+ const sponsoredBy = utils.deepAccess(asset, 'data.value');
+ if (sponsoredBy) {
+ native.sponsoredBy = sponsoredBy;
+ }
+ break;
+ }
+ case NATIVE_DEFAULTS.ASSET_ID.CTA: {
+ const cta = utils.deepAccess(asset, 'data.value');
+ if (cta) {
+ native.cta = cta;
+ }
+ break;
+ }
+ }
+ });
+ }
+
+ return native;
+}
+
+/**
+ * Create an imp array
+ *
+ * @param {BidRequest} bidRequest
+ * @param {Currency} cur
+ * @returns {Imp[]}
+ */
+function createImp(bidRequest, cur) {
+ const imp = [];
+
+ const floor = getBidFloor(bidRequest, cur);
+
+ const impItem = {
+ id: bidRequest.bidId,
+ tagid: String(utils.deepAccess(bidRequest, 'params.placementId')),
+ bidfloor: floor,
+ };
+
+ let mediaType;
+ let bannerReq, videoReq, nativeReq;
+
+ if ((bannerReq = utils.deepAccess(bidRequest, 'mediaTypes.banner'))) {
+ const size = canonicalizeSizesArray(bannerReq.sizes || BANNER_DEFAULTS.SIZE)[0];
+
+ impItem.banner = {
+ w: size[0],
+ h: size[1],
+ pos: 0,
+ };
+
+ mediaType = BANNER;
+ } else if ((videoReq = utils.deepAccess(bidRequest, 'mediaTypes.video'))) {
+ const size = canonicalizeSizesArray(videoReq.playerSize || VIDEO_DEFAULTS.SIZE)[0];
+
+ impItem.video = {
+ w: size[0],
+ h: size[1],
+ pos: 0,
+ mimes: videoReq.mimes || VIDEO_DEFAULTS.MIMES,
+ protocols: videoReq.protocols || VIDEO_DEFAULTS.PROTOCOLS,
+ startdelay: typeof videoReq.startdelay === 'number' ? videoReq.startdelay : 0,
+ skip: typeof videoReq.skip === 'number' ? videoReq.skip : 0,
+ playbackmethod: videoReq.playbackmethod || VIDEO_DEFAULTS.PLAYBACK_METHODS,
+ delivery: videoReq.delivery || VIDEO_DEFAULTS.DELIVERY,
+ api: videoReq.api || VIDEO_DEFAULTS.API,
+ placement: videoReq.context === OUTSTREAM ? 3 : 1,
+ };
+
+ mediaType = VIDEO;
+ } else if ((nativeReq = utils.deepAccess(bidRequest, 'mediaTypes.native'))) {
+ const params = bidRequest.nativeParams || nativeReq;
+
+ const request = {
+ native: {
+ ver: '1.1',
+ assets: createNativeAssets(params),
+ }
+ };
+
+ impItem.native = {
+ ver: '1.1',
+ request: JSON.stringify(request),
+ };
+
+ mediaType = NATIVE;
+ }
+
+ if (mediaType) {
+ imp.push(impItem);
+ }
+
+ return imp;
+}
+
+/**
+ * Convert bid sizes to size array
+ *
+ * @param {Size[]|Size[][]} sizes
+ * @returns {Size[][]}
+ */
+function canonicalizeSizesArray(sizes) {
+ if (sizes.length === 2 && !utils.isArray(sizes[0])) {
+ return [sizes];
+ }
+ return sizes;
+}
+
+/**
+ * Create Assets Object for Native request
+ *
+ * @param {Object} params
+ * @returns {Asset[]}
+ */
+function createNativeAssets(params) {
+ const assets = [];
+
+ if (params.title) {
+ assets.push({
+ id: NATIVE_DEFAULTS.ASSET_ID.TITLE,
+ required: params.title.required ? 1 : 0,
+ title: {
+ len: params.title.len || NATIVE_DEFAULTS.LENGTH.TITLE
+ }
+ })
+ }
+
+ if (params.image) {
+ assets.push({
+ id: NATIVE_DEFAULTS.ASSET_ID.IMAGE,
+ required: params.image.required ? 1 : 0,
+ img: mapNativeImage(params.image, NATIVE_DEFAULTS.IMAGE_TYPE.MAIN)
+ })
+ }
+
+ if (params.icon) {
+ assets.push({
+ id: NATIVE_DEFAULTS.ASSET_ID.ICON,
+ required: params.icon.required ? 1 : 0,
+ img: mapNativeImage(params.icon, NATIVE_DEFAULTS.IMAGE_TYPE.ICON)
+ })
+ }
+
+ if (params.sponsoredBy) {
+ assets.push({
+ id: NATIVE_DEFAULTS.ASSET_ID.SPONSORED,
+ required: params.sponsoredBy.required ? 1 : 0,
+ data: {
+ type: NATIVE_DEFAULTS.DATA_ASSET_TYPE.SPONSORED,
+ len: params.sponsoredBy.len | NATIVE_DEFAULTS.LENGTH.SPONSORED
+ }
+ })
+ }
+
+ if (params.body) {
+ assets.push({
+ id: NATIVE_DEFAULTS.ASSET_ID.BODY,
+ required: params.body.required ? 1 : 0,
+ data: {
+ type: NATIVE_DEFAULTS.DATA_ASSET_TYPE.DESC,
+ len: params.body.len || NATIVE_DEFAULTS.LENGTH.BODY
+ }
+ })
+ }
+
+ if (params.cta) {
+ assets.push({
+ id: NATIVE_DEFAULTS.ASSET_ID.CTA,
+ required: params.cta.required ? 1 : 0,
+ data: {
+ type: NATIVE_DEFAULTS.DATA_ASSET_TYPE.CTA_TEXT,
+ len: params.cta.len || NATIVE_DEFAULTS.LENGTH.CTA
+ }
+ })
+ }
+
+ return assets;
+}
+
+/**
+ * Create native image object
+ *
+ * @param {Object} image
+ * @param {Number} type
+ * @returns {NativeImage}
+ */
+function mapNativeImage(image, type) {
+ const img = { type: type };
+
+ if (image.aspect_ratios) {
+ const ratio = image.aspect_ratios[0];
+ const minWidth = ratio.min_width || 100;
+
+ img.wmin = minWidth;
+ img.hmin = (minWidth / ratio.ratio_width * ratio.ratio_height);
+ }
+
+ if (image.sizes) {
+ const size = canonicalizeSizesArray(image.sizes)[0];
+
+ img.w = size[0];
+ img.h = size[1];
+ }
+
+ return img;
+}
+
+/**
+ * Get user id from bid request. if no user id module used, return a new uuid.
+ *
+ * @param {BidRequest} bidRequest
+ * @returns {String} userId
+ */
+function getUserId(bidRequest) {
+ let sharedId = utils.deepAccess(bidRequest, 'userId.sharedid.id');
+ if (sharedId) {
+ return sharedId;
+ }
+
+ for (const idModule of ['pubcid', 'tdid']) {
+ let userId = utils.deepAccess(bidRequest, `userId.${idModule}`);
+ if (userId) {
+ return userId;
+ }
+ }
+
+ return utils.generateUUID();
+}
+
+/**
+ * Get publisher domain
+ *
+ * @param {String} referer
+ * @returns {String} domain
+ */
+function getDomain(referer) {
+ let domain;
+
+ if (!(domain = config.getConfig('publisherDomain'))) {
+ const u = utils.parseUrl(referer);
+ domain = u.hostname;
+ }
+
+ return domain.replace(/^https?:\/\/([\w\-\.]+)(?::\d+)?/, '$1');
+}
+
+/**
+ * Get bid floor price
+ *
+ * @param {BidRequest} bid
+ * @param {String} cur
+ * @returns {Number} floor price
+ */
+function getBidFloor(bid, cur) {
+ let floorInfo = {};
+
+ if (typeof bid.getFloor === 'function') {
+ floorInfo = bid.getFloor({
+ currency: cur,
+ mediaType: '*',
+ size: '*'
+ });
+ }
+
+ return floorInfo.floor || 0.0;
+}
+
+/**
+ * Get currencies from bid request
+ *
+ * @param {BidRequest} bidRequest
+ * @returns {String[]} currencies
+ */
+function getCurrencies(bidRequest) {
+ let currencies = [];
+
+ const pCur = utils.deepAccess(bidRequest, 'params.currency');
+ if (pCur) {
+ currencies = currencies.concat(pCur);
+ }
+
+ if (!currencies.length) {
+ let currency;
+ if ((currency = config.getConfig('currency')) && currency.adServerCurrency) {
+ currencies.push(currency.adServerCurrency);
+ } else {
+ currencies.push(DEFAULT_CURRENCY);
+ }
+ }
+
+ return currencies;
+}
+
+/**
+ * Get bcat
+ *
+ * @param {BidRequest} bidRequest
+ * @returns {String[]}
+ */
+function getBcat(bidRequest) {
+ let bcat = [];
+
+ const pBcat = utils.deepAccess(bidRequest, 'params.bcat');
+ if (pBcat) {
+ bcat = bcat.concat(pBcat);
+ }
+
+ return bcat;
+}
+
+/**
+ * Get device info
+ *
+ * @returns {Object}
+ */
+function getDevice() {
+ const device = config.getConfig('device') || {};
+
+ device.w = device.w || window.screen.width;
+ device.h = device.h || window.screen.height;
+ device.ua = device.ua || navigator.userAgent;
+ device.language = device.language || getLanguage();
+ device.dnt = typeof device.dnt === 'number'
+ ? device.dnt : (utils.getDNT() ? 1 : 0);
+
+ return device;
+}
+
+/**
+ * Get browser language
+ *
+ * @returns {String} language
+ */
+function getLanguage() {
+ const lang = (navigator.languages && navigator.languages[0]) ||
+ navigator.language || navigator.userLanguage;
+ return lang ? lang.split('-')[0] : DEFAULT_LANGUAGE;
+}
+
+/**
+ * Create render for outstream video.
+ *
+ * @param {BidRequest} bidRequest
+ * @returns
+ */
+function createRenderer(bidRequest) {
+ const globalRenderer = utils.deepAccess(bidRequest, 'renderer');
+ const currentRenderer = utils.deepAccess(bidRequest, 'mediaTypes.video.renderer');
+
+ let url = OUTSTREAM_RENDERER_URL;
+ let config = {};
+ let render = function (bid) {
+ bid.renderer.push(() => {
+ window.ANOutstreamVideo.renderAd({
+ sizes: [bid.width, bid.height],
+ targetId: bid.adUnitCode,
+ adResponse: bid.adResponse,
+ });
+ });
+ };
+
+ if (currentRenderer) {
+ url = currentRenderer.url;
+ config = currentRenderer.options;
+ render = currentRenderer.render;
+ } else if (globalRenderer) {
+ url = globalRenderer.url;
+ config = globalRenderer.options;
+ render = globalRenderer.render;
+ }
+
+ const renderer = Renderer.install({
+ id: bidRequest.bidId,
+ url: url,
+ loaded: false,
+ config: config,
+ adUnitCode: bidRequest.adUnitCode
+ });
+
+ try {
+ renderer.setRender(render);
+ } catch (e) {
+ utils.logError(BIDDER_CODE, 'Error calling setRender on renderer', e);
+ }
+ return renderer;
+}
+
+registerBidder(spec);
diff --git a/modules/operaadsBidAdapter.md b/modules/operaadsBidAdapter.md
new file mode 100644
index 00000000000..9bfe3e76b88
--- /dev/null
+++ b/modules/operaadsBidAdapter.md
@@ -0,0 +1,155 @@
+# OperaAds Bidder Adapter
+
+## Overview
+
+```
+Module Name: OperaAds Bidder Adapter
+Module Type: Bidder Adapter
+Maintainer: adtech-prebid-group@opera.com
+```
+
+## Description
+
+Module that connects to OperaAds's demand sources
+
+## Bid Parameters
+
+| Name | Scope | Type | Description | Example
+| ---- | ----- | ---- | ----------- | -------
+| `placementId` | required | String | The Placement Id provided by Opera Ads. | `s12345678`
+| `endpointId` | required | String | The Endpoint Id provided by Opera Ads. | `ep12345678`
+| `publisherId` | required | String | The Publisher Id provided by Opera Ads. | `pub12345678`
+| `currency` | optional | String or String[] | Currency. | `USD`
+| `bcat` | optional | String or String[] | The bcat value. | `IAB9-31`
+
+### Bid Video Parameters
+
+Set these parameters to `bid.mediaTypes.video`.
+
+| Name | Scope | Type | Description | Example
+| ---- | ----- | ---- | ----------- | -------
+| `context` | optional | String | `instream` or `outstream`. | `instream`
+| `mimes` | optional | String[] | Content MIME types supported. | `['video/mp4']`
+| `playerSize` | optional | Number[] or Number[][] | Video player size in device independent pixels | `[[640, 480]]`
+| `protocols` | optional | Number[] | Array of supported video protocls. | `[1, 2, 3, 4, 5, 6, 7, 8]`
+| `startdelay` | optional | Number | Indicates the start delay in seconds for pre-roll, mid-roll, or post-roll ad placements. | `0`
+| `skip` | optional | Number | Indicates if the player will allow the video to be skipped, where 0 = no, 1 = yes. | `1`
+| `playbackmethod` | optional | Number[] | Playback methods that may be in use. | `[2]`
+| `delivery` | optional | Number[] | Supported delivery methods. | `[1]`
+| `api` | optional | Number[] | List of supported API frameworks for this impression. | `[1, 2, 5]`
+
+### Bid Native Parameters
+
+Set these parameters to `bid.nativeParams` or `bid.mediaTypes.native`.
+
+| Name | Scope | Type | Description | Example
+| ---- | ----- | ---- | ----------- | -------
+| `title` | optional | Object | Config for native asset title. | `{required: true, len: 25}`
+| `image` | optional | Object | Config for native asset image. | `{required: true, sizes: [[300, 250]], aspect_ratios: [{min_width: 300, min_height: 250, ratio_width: 1, ratio_height: 1}]}`
+| `icon` | optional | Object | Config for native asset icon. | `{required: true, sizes: [[60, 60]], aspect_ratios: [{min_width: 60, min_height: 60, ratio_width: 1, ratio_height: 1}]}}`
+| `sponsoredBy` | optional | Object | Config for native asset sponsoredBy. | `{required: true, len: 20}`
+| `body` | optional | Object | Config for native asset body. | `{required: true, len: 200}`
+| `cta` | optional | Object | Config for native asset cta. | `{required: true, len: 20}`
+
+## Example
+
+### Banner Ads
+
+```javascript
+var adUnits = [{
+ code: 'banner-ad-div',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]
+ }
+ },
+ bids: [{
+ bidder: 'operaads',
+ params: {
+ placementId: 's12345678',
+ endpointId: 's12345678',
+ publisherId: 's12345678'
+ }
+ }]
+}];
+```
+
+### Video Ads
+
+```javascript
+var adUnits = [{
+ code: 'video-ad-div',
+ mediaTypes: {
+ video: {
+ context: 'instream',
+ playerSize: [640, 480],
+ mimes: ['video/mp4'],
+ protocols: [1, 2, 3, 4, 5, 6, 7, 8],
+ playbackmethod: [2],
+ skip: 1
+ }
+ },
+ bids: [{
+ bidder: 'operaads',
+ params: {
+ placementId: 's12345678',
+ endpointId: 's12345678',
+ publisherId: 's12345678'
+ }
+ }]
+}];
+```
+
+* For video ads, enable prebid cache.
+
+```javascript
+pbjs.setConfig({
+ cache: {
+ url: 'https://prebid.adnxs.com/pbc/v1/cache'
+ }
+});
+```
+
+### Native Ads
+
+```javascript
+var adUnits = [{
+ code: 'native-ad-div',
+ mediaTypes: {
+ native: {
+ title: { required: true, len: 75 },
+ image: { required: true, sizes: [[300, 250]] },
+ body: { len: 200 },
+ sponsoredBy: { len: 20 }
+ }
+ },
+ bids: [{
+ bidder: 'operaads',
+ params: {
+ placementId: 's12345678',
+ endpointId: 's12345678',
+ publisherId: 's12345678'
+ }
+ }]
+}];
+```
+
+### User Ids
+
+Opera Ads Bid Adapter uses `sharedId`, `pubcid` or `tdid`, please config at least one.
+
+```javascript
+pbjs.setConfig({
+ ...,
+ userSync: {
+ userIds: [{
+ name: 'sharedId',
+ storage: {
+ name: '_sharedID', // name of the 1st party cookie
+ type: 'cookie',
+ expires: 30
+ }
+ }]
+ }
+});
+```
diff --git a/modules/optimeraBidAdapter.js b/modules/optimeraBidAdapter.js
deleted file mode 100644
index b470e901ec6..00000000000
--- a/modules/optimeraBidAdapter.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { deepAccess } from '../src/utils.js';
-
-const BIDDER_CODE = 'optimera';
-const SCORES_BASE_URL = 'https://dyv1bugovvq1g.cloudfront.net/';
-
-export const spec = {
- code: BIDDER_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 (bidRequest) {
- if (typeof bidRequest.params !== 'undefined' && typeof bidRequest.params.clientID !== 'undefined') {
- return true;
- }
- return false;
- },
- /**
- * Make a server request from the list of BidRequests.
- *
- * We call the existing scores data file for ad slot placement scores.
- * These scores will be added to the dealId to be pushed to DFP.
- *
- * @param {validBidRequests[]} - an array of bids
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests (validBidRequests) {
- const optimeraHost = window.location.host;
- const optimeraPathName = window.location.pathname;
- if (typeof validBidRequests[0].params.clientID !== 'undefined') {
- const { clientID } = validBidRequests[0].params;
- const scoresURL = `${SCORES_BASE_URL + clientID}/${optimeraHost}${optimeraPathName}.js`;
- return {
- method: 'GET',
- url: scoresURL,
- payload: validBidRequests,
- };
- }
- return {};
- },
- /**
- * Unpack the response from the server into a list of bids.
- *
- * Some required bid params are not needed for this so default
- * values are used.
- *
- * @param {*} serverResponse A successful response from the server.
- * @return {Bid[]} An array of bids which were nested inside the server.
- */
- interpretResponse (serverResponse, bidRequest) {
- const validBids = bidRequest.payload;
- const bidResponses = [];
- let dealId = '';
- if (typeof serverResponse.body !== 'undefined') {
- const scores = serverResponse.body;
- for (let i = 0; i < validBids.length; i += 1) {
- if (typeof validBids[i].params.clientID !== 'undefined') {
- if (validBids[i].adUnitCode in scores) {
- const deviceDealId = deepAccess(scores, `device.${validBids[i].params.device}.${validBids[i].adUnitCode}`);
- dealId = deviceDealId || scores[validBids[i].adUnitCode];
- }
- const bidResponse = {
- requestId: validBids[i].bidId,
- ad: '
',
- cpm: 0.01,
- width: 0,
- height: 0,
- dealId,
- ttl: 300,
- creativeId: '1',
- netRevenue: '0',
- currency: 'USD'
- };
- bidResponses.push(bidResponse);
- }
- }
- }
- return bidResponses;
- }
-}
-
-registerBidder(spec);
diff --git a/modules/optimeraBidAdapter.md b/modules/optimeraBidAdapter.md
deleted file mode 100644
index 25da9b6236f..00000000000
--- a/modules/optimeraBidAdapter.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# Overview
-
-```
-Module Name: Optimera Bidder Adapter
-Module Type: Bidder Adapter
-Maintainer: kcandiotti@optimera.nyc
-```
-
-# Description
-
-Module that adds ad placement visibility scores for DFP.
-
-# Test Parameters
-```
- var adUnits = [{
- code: 'div-1',
- sizes: [[300, 250], [300,600]],
- bids: [
- {
- bidder: 'optimera',
- params: {
- clientID: '9999',
- device: 'mo'
- }
- }]
- },{
- code: 'div-0',
- sizes: [[728, 90]],
- bids: [
- {
- bidder: 'optimera',
- params: {
- clientID: '9999',
- device: 'mo'
- }
- }]
- }];
-```
-
-# AppNexus Issue
-There is an issue where the plugin sometimes doesn't return impressions with AppNexus.
-
-There is an open issue here: [#3597](https://github.com/prebid/Prebid.js/issues/3597)
-
-## Configuration Workaround
-
-Optimera's configuration requires the use of size 0,0 which, in some instances, causes the AppNexus ad server to respond to ad requests but not fill impressions. AppNexus and vendors using the AppNexus ad server should monitor 3rd party numbers to ensure there is no decline in fill rate.
-
-Configuration Example:
-
-```
-code: ‘leaderboard',
-mediaTypes: {
- banner: {
- sizes: [[970, 250],[970, 90],[970, 66],[728, 90],[320, 50],[320, 100],[300, 250],[0, 0]],
- }
-}
-```
diff --git a/modules/optimeraRtdProvider.js b/modules/optimeraRtdProvider.js
new file mode 100644
index 00000000000..1e439b28c94
--- /dev/null
+++ b/modules/optimeraRtdProvider.js
@@ -0,0 +1,220 @@
+/**
+ * This module adds optimera provider to the real time data module
+ * The {@link module:modules/realTimeData} module is required
+ *
+ * The module will fetch targeting values from the Optimera server
+ * and apply the tageting to each ad request. These values are created
+ * from the Optimera Mesaurement script which is installed on the
+ * Publisher's site.
+ *
+ * @module modules/optimeraRtdProvider
+ * @requires module:modules/realTimeData
+ */
+
+/**
+ * @typedef {Object} ModuleParams
+ * @property {string} clientID
+ * @property {string} optimeraKeyName
+ * @property {string} device
+ */
+
+import * as utils from '../src/utils.js';
+import { submodule } from '../src/hook.js';
+import { ajaxBuilder } from '../src/ajax.js';
+
+/** @type {ModuleParams} */
+let _moduleParams = {};
+
+/**
+ * Default Optimera Key Name
+ * This can default to hb_deal_optimera for publishers
+ * who used the previous Optimera Bidder Adapter.
+ * @type {string} */
+export let optimeraKeyName = 'hb_deal_optimera';
+
+/**
+ * Optimera Score File Base URL.
+ * This is the base URL for the data endpoint request to fetch
+ * the targeting values.
+ * @type {string}
+ */
+export const scoresBaseURL = 'https://dyv1bugovvq1g.cloudfront.net/';
+
+/**
+ * Optimera Score File URL.
+ * @type {string}
+ */
+export let scoresURL;
+
+/**
+ * Optimera Client ID.
+ * @type {string}
+ */
+export let clientID;
+
+/**
+ * Optional device parameter.
+ * @type {string}
+ */
+export let device = 'default';
+
+/**
+ * Targeting object for all ad positions.
+ * @type {string}
+ */
+export let optimeraTargeting = {};
+
+/**
+ * Flag to indicateo if a new score file should be fetched.
+ * @type {string}
+ */
+export let fetchScoreFile = true;
+
+/**
+ * Make the request for the Score File.
+ */
+export function scoreFileRequest() {
+ utils.logInfo('Fetch Optimera score file.');
+ const ajax = ajaxBuilder();
+ ajax(scoresURL,
+ {
+ success: (res, req) => {
+ if (req.status === 200) {
+ try {
+ setScores(res);
+ } catch (err) {
+ utils.logError('Unable to parse Optimera Score File.', err);
+ }
+ } else if (req.status === 403) {
+ utils.logError('Unable to fetch the Optimera Score File - 403');
+ }
+ },
+ error: () => {
+ utils.logError('Unable to fetch the Optimera Score File.');
+ }
+ });
+}
+
+/**
+ * Apply the Optimera targeting to the ad slots.
+ */
+export function returnTargetingData(adUnits, config) {
+ const targeting = {};
+ try {
+ adUnits.forEach(function(adUnit) {
+ if (optimeraTargeting[adUnit]) {
+ targeting[adUnit] = {};
+ targeting[adUnit][optimeraKeyName] = [optimeraTargeting[adUnit]];
+ }
+ });
+ } catch (err) {
+ utils.logError('error', err);
+ }
+ utils.logInfo('Apply Optimera targeting');
+ return targeting;
+}
+
+/**
+ * Fetch a new score file when an auction starts.
+ * Only fetch the new file if a new score file is needed.
+ */
+export function onAuctionInit(auctionDetails, config, userConsent) {
+ setScoresURL();
+ if (fetchScoreFile) {
+ scoreFileRequest();
+ }
+}
+
+/**
+ * Initialize the Module.
+ */
+export function init(moduleConfig) {
+ _moduleParams = moduleConfig.params;
+ if (_moduleParams && _moduleParams.clientID) {
+ clientID = _moduleParams.clientID;
+ if (_moduleParams.optimeraKeyName) {
+ optimeraKeyName = (_moduleParams.optimeraKeyName);
+ }
+ if (_moduleParams.device) {
+ device = _moduleParams.device;
+ }
+ setScoresURL();
+ scoreFileRequest();
+ return true;
+ } else {
+ if (!_moduleParams.clientID) {
+ utils.logError('Optimera clientID is missing in the Optimera RTD configuration.');
+ }
+ return false;
+ }
+}
+
+/**
+ * Set the score file url.
+ *
+ * This fully-formed URL is for the data endpoint request to fetch
+ * the targeting values. This is not a js library, rather JSON
+ * which has the targeting values for the page.
+ *
+ * The score file url is based on the web page url. If the new score file URL
+ * has been updated, set the fetchScoreFile flag to true to is can be fetched.
+ *
+ */
+export function setScoresURL() {
+ const optimeraHost = window.location.host;
+ const optimeraPathName = window.location.pathname;
+ let newScoresURL = `${scoresBaseURL}${clientID}/${optimeraHost}${optimeraPathName}.js`;
+ if (scoresURL !== newScoresURL) {
+ scoresURL = newScoresURL;
+ fetchScoreFile = true;
+ } else {
+ fetchScoreFile = false;
+ }
+}
+
+/**
+ * Set the scores for the divice if given.
+ * @param {*} result
+ * @returns {string} JSON string of Optimera Scores.
+ */
+export function setScores(result) {
+ let scores = {};
+ try {
+ scores = JSON.parse(result);
+ if (device !== 'default' && scores.device[device]) {
+ scores = scores.device[device];
+ }
+ } catch (e) {
+ utils.logError('Optimera score file could not be parsed.');
+ }
+ optimeraTargeting = scores;
+}
+
+/** @type {RtdSubmodule} */
+export const optimeraSubmodule = {
+ /**
+ * used to link submodule with realTimeData
+ * @type {string}
+ */
+ name: 'optimeraRTD',
+ /**
+ * get data when an auction starts
+ * @function
+ */
+ onAuctionInitEvent: onAuctionInit,
+ /**
+ * get data and send back to realTimeData module
+ * @function
+ */
+ getTargetingData: returnTargetingData,
+ init,
+};
+
+/**
+ * Register the Sub Module.
+ */
+function registerSubModule() {
+ submodule('realTimeData', optimeraSubmodule);
+}
+
+registerSubModule();
diff --git a/modules/optimeraRtdProvider.md b/modules/optimeraRtdProvider.md
new file mode 100644
index 00000000000..610dec537e0
--- /dev/null
+++ b/modules/optimeraRtdProvider.md
@@ -0,0 +1,44 @@
+# Overview
+```
+Module Name: Optimera Real Time Date Module
+Module Type: RTD Module
+Maintainer: mcallari@optimera.nyc
+```
+
+# Description
+
+Optimera Real Time Data Module. Provides targeting for ad requests from data collected by the Optimera Measurement script on your site. Please contact [Optimera](http://optimera.nyc/) for information. This is a port of the Optimera Bidder Adapter.
+
+# Configurations
+
+Compile the Optimera RTD Provider into your Prebid build:
+
+`gulp build --modules=optimeraRtdProvider`
+
+Configuration example for using RTD module with `optimera` provider
+```javascript
+ pbjs.setConfig({
+ realTimeData: {
+ dataProviders: [
+ {
+ name: 'optimeraRTD',
+ waitForIt: true,
+ params: {
+ clientID: '9999',
+ optimeraKeyName: 'optimera',
+ device: 'de'
+ }
+ }
+ ]
+ }
+```
+
+#Params
+
+Contact Optimera to get assistance with the params.
+
+| param name | type |Scope | Description |
+| :------------ | :------------ | :------- | :------- |
+| clientID | string | required | Optimera Client ID |
+| optimeraKeyName | string | optional | GAM key name for Optimera. If migrating from the Optimera bidder adapter this will default to hb_deal_optimera and can be ommitted from the configuration. |
+| device | string | optional | Device type code for mobile, tablet, or desktop. Either mo, tb, de |
diff --git a/modules/optoutBidAdapter.js b/modules/optoutBidAdapter.js
new file mode 100644
index 00000000000..3a2e672013c
--- /dev/null
+++ b/modules/optoutBidAdapter.js
@@ -0,0 +1,85 @@
+import * as utils from '../src/utils.js';
+import {config} from '../src/config.js';
+import {registerBidder} from '../src/adapters/bidderFactory.js';
+
+const BIDDER_CODE = 'optout';
+
+function getDomain(bidderRequest) {
+ return utils.deepAccess(bidderRequest, 'refererInfo.canonicalUrl') || utils.deepAccess(window, 'location.href');
+}
+
+function getCurrency() {
+ let cur = config.getConfig('currency');
+ if (cur === undefined) {
+ cur = {
+ adServerCurrency: 'EUR',
+ granularityMultiplier: 1
+ };
+ }
+ return cur;
+}
+
+function hasPurpose1Consent(bidderRequest) {
+ let result = false;
+ if (bidderRequest && bidderRequest.gdprConsent) {
+ if (bidderRequest.gdprConsent.apiVersion === 2) {
+ result = !!(utils.deepAccess(bidderRequest.gdprConsent, 'vendorData.purpose.consents.1') === true);
+ }
+ }
+ return result;
+}
+
+export const spec = {
+ code: BIDDER_CODE,
+
+ isBidRequestValid: function(bid) {
+ return !!bid.params.publisher && !!bid.params.adslot;
+ },
+
+ buildRequests: function(validBidRequests) {
+ return validBidRequests.map(bidRequest => {
+ let endPoint = 'https://adscience-nocookie.nl/prebid/display';
+ let consentString = '';
+ let gdpr = 0;
+ if (bidRequest.gdprConsent) {
+ gdpr = (typeof bidRequest.gdprConsent.gdprApplies === 'boolean') ? Number(bidRequest.gdprConsent.gdprApplies) : 0;
+ consentString = bidRequest.gdprConsent.consentString;
+ if (!gdpr || hasPurpose1Consent(bidRequest)) {
+ endPoint = 'https://prebid.adscience.nl/prebid/display';
+ }
+ }
+ return {
+ method: 'POST',
+ url: endPoint,
+ data: {
+ requestId: bidRequest.bidId,
+ publisher: bidRequest.params.publisher,
+ adSlot: bidRequest.params.adslot,
+ cur: getCurrency(),
+ url: getDomain(bidRequest),
+ ortb2: config.getConfig('ortb2'),
+ consent: consentString,
+ gdpr: gdpr
+
+ },
+ };
+ });
+ },
+
+ interpretResponse: function (serverResponse, bidRequest) {
+ return serverResponse.body;
+ },
+
+ getUserSyncs: function (syncOptions, responses, gdprConsent) {
+ if (gdprConsent) {
+ let gdpr = (typeof gdprConsent.gdprApplies === 'boolean') ? Number(gdprConsent.gdprApplies) : 0;
+ if (syncOptions.iframeEnabled && (!gdprConsent.gdprApplies || hasPurpose1Consent({gdprConsent}))) {
+ return [{
+ type: 'iframe',
+ url: 'https://umframe.adscience.nl/matching/iframe?gdpr=' + gdpr + '&gdpr_consent=' + gdprConsent.consentString
+ }];
+ }
+ }
+ },
+};
+registerBidder(spec);
diff --git a/modules/optoutBidAdapter.md b/modules/optoutBidAdapter.md
new file mode 100644
index 00000000000..de70f3e3569
--- /dev/null
+++ b/modules/optoutBidAdapter.md
@@ -0,0 +1,27 @@
+# Overview
+Module Name: Opt Out Advertising Bidder Adapter Module
+Type: Bidder Adapter
+Maintainer: rob@optoutadvertising.com
+
+# Description
+Opt Out Advertising Bidder Adapter for Prebid.js.
+
+# Test Parameters
+```
+var adUnits = [
+{
+ code: 'test-div',
+ sizes: [[300, 250]],
+ bids: [
+ {
+ bidder: 'optout',
+ params: {
+ publisher: '8',
+ adslot: 'prebid_demo',
+ }
+ }
+ ]
+}
+];
+```
+
diff --git a/modules/orbidderBidAdapter.js b/modules/orbidderBidAdapter.js
index 4a7d686a7bc..907efd3dba8 100644
--- a/modules/orbidderBidAdapter.js
+++ b/modules/orbidderBidAdapter.js
@@ -1,13 +1,52 @@
import {registerBidder} from '../src/adapters/bidderFactory.js';
import { getStorageManager } from '../src/storageManager.js';
+import { BANNER, NATIVE } from '../src/mediaTypes.js';
import * as utils from '../src/utils.js';
const storageManager = getStorageManager();
+/**
+ * Determines whether or not the given bid response is valid.
+ *
+ * @param {object} bidResponse The bid response to validate.
+ * @return boolean True if this is a valid bid response, and false if it is not valid.
+ */
+function isBidResponseValid(bidResponse) {
+ let requiredKeys = ['requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency'];
+
+ switch (bidResponse.mediaType) {
+ case BANNER:
+ requiredKeys = requiredKeys.concat(['width', 'height', 'ad']);
+ break;
+ case NATIVE:
+ if (!bidResponse.native.hasOwnProperty('impressionTrackers')) {
+ return false
+ }
+ break;
+ default:
+ return false
+ }
+
+ for (const key of requiredKeys) {
+ if (!bidResponse.hasOwnProperty(key)) {
+ return false
+ }
+ }
+
+ return true
+}
+
export const spec = {
code: 'orbidder',
hostname: 'https://orbidder.otto.de',
+ supportedMediaTypes: [BANNER, NATIVE],
+ /**
+ * Returns a customzied hostname if 'ov_orbidder_host' is set in the browser's local storage.
+ * This is only used for integration testing.
+ *
+ * @return The hostname bid requests should be sent to.
+ */
getHostname() {
let ret = this.hostname;
try {
@@ -17,14 +56,26 @@ export const spec = {
return ret;
},
+ /**
+ * Determines whether or not the given bid request is valid.
+ *
+ * @param {object} bid The bid to validate.
+ * @return boolean True if this is a valid bid, and false if it is not valid.
+ */
isBidRequestValid(bid) {
return !!(bid.sizes && bid.bidId && bid.params &&
(bid.params.accountId && (typeof bid.params.accountId === 'string')) &&
(bid.params.placementId && (typeof bid.params.placementId === 'string')) &&
- ((typeof bid.params.bidfloor === 'undefined') || (typeof bid.params.bidfloor === 'number')) &&
((typeof bid.params.profile === 'undefined') || (typeof bid.params.profile === 'object')));
},
+ /**
+ * Build a request from the list of valid BidRequests that will be sent by prebid to the orbidder /bid endpoint, i.e. the server.
+ *
+ * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the orbidder /bid endpoint,
+ * i.e. the server.
+ * @return The requests for the orbidder /bid endpoint, i.e. the server.
+ */
buildRequests(validBidRequests, bidderRequest) {
const hostname = this.getHostname();
return validBidRequests.map((bidRequest) => {
@@ -35,7 +86,7 @@ export const spec = {
bidRequest.params.bidfloor = getBidFloor(bidRequest);
- const ret = {
+ let httpReq = {
url: `${hostname}/bid`,
method: 'POST',
options: { withCredentials: true },
@@ -47,40 +98,41 @@ export const spec = {
transactionId: bidRequest.transactionId,
adUnitCode: bidRequest.adUnitCode,
bidRequestCount: bidRequest.bidRequestCount,
+ params: bidRequest.params,
sizes: bidRequest.sizes,
- params: bidRequest.params
+ mediaTypes: bidRequest.mediaTypes
}
};
+
if (bidderRequest && bidderRequest.gdprConsent) {
- ret.data.gdprConsent = {
+ httpReq.data.gdprConsent = {
consentString: bidderRequest.gdprConsent.consentString,
consentRequired: (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') && bidderRequest.gdprConsent.gdprApplies
};
}
- return ret;
+ return httpReq;
});
},
+ /**
+ * Unpack the response from the orbidder /bid endpoint into a list of bids.
+ *
+ * @param {*} serverResponse A successful response from the orbidder /bid endpoint, i.e. the server.
+ * @return {Bid[]} An array of bids from orbidder.
+ */
interpretResponse(serverResponse) {
const bidResponses = [];
serverResponse = serverResponse.body;
if (serverResponse && (serverResponse.length > 0)) {
- serverResponse.forEach((bid) => {
- const bidResponse = {};
- for (const requiredKey of ['requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId', 'netRevenue', 'currency']) {
- if (!bid.hasOwnProperty(requiredKey)) {
- return [];
+ serverResponse.forEach((bidResponse) => {
+ if (isBidResponseValid(bidResponse)) {
+ if (Array.isArray(bidResponse.advertiserDomains)) {
+ bidResponse.meta = {
+ advertiserDomains: bidResponse.advertiserDomains
+ }
}
- bidResponse[requiredKey] = bid[requiredKey];
+ bidResponses.push(bidResponse);
}
-
- if (Array.isArray(bid.advertiserDomains)) {
- bidResponse.meta = {
- advertiserDomains: bid.advertiserDomains
- }
- }
-
- bidResponses.push(bidResponse);
});
}
return bidResponses;
diff --git a/modules/orbidderBidAdapter.md b/modules/orbidderBidAdapter.md
index c7676e6774f..6b8fac5477a 100644
--- a/modules/orbidderBidAdapter.md
+++ b/modules/orbidderBidAdapter.md
@@ -12,19 +12,46 @@ Module that connects to orbidder demand sources
# Test Parameters
```
-var adUnits = [{
- code: '/105091519/bidder_test',
- mediaTypes: {
- banner: {
- sizes: [728, 90]
- }
+var adUnits = [
+ {
+ code: 'test_banner',
+ mediaTypes: {
+ banner: {
+ sizes: [728, 90]
+ }
+ },
+ bids: [{
+ bidder: 'orbidder',
+ params: {
+ accountId: "someAccount",
+ placementId: "somePlace"
+ }
+ }],
},
- bids: [{
- bidder: 'orbidder'
- params: {
- accountId: "someAccount",
- placementId: "somePlace"
- }
- }]
-}];
+ {
+ code: 'test_native',
+ mediaTypes: {
+ native: {
+ title: {
+ required: true,
+ len: 80
+ },
+ image: {
+ required: true,
+ sizes: [150, 50]
+ },
+ sponsoredBy: {
+ required: true
+ }
+ },
+ },
+ bids: [{
+ bidder: 'orbidder',
+ params: {
+ accountId: "someAccount",
+ placementId: "somePlace"
+ }
+ }],
+ }
+];
```
diff --git a/modules/otmBidAdapter.js b/modules/otmBidAdapter.js
deleted file mode 100644
index 23f6d434ae1..00000000000
--- a/modules/otmBidAdapter.js
+++ /dev/null
@@ -1,95 +0,0 @@
-import {BANNER} from '../src/mediaTypes.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-export const spec = {
- code: 'otm',
- supportedMediaTypes: [BANNER],
- isBidRequestValid: function (bid) {
- return !!bid.params.tid;
- },
- buildRequests: function (bidRequests) {
- const requests = bidRequests.map(function (bid) {
- const size = getMaxPrioritySize(bid.sizes);
- const params = {
- tz: getTz(),
- w: size[0],
- h: size[1],
- s: bid.params.tid,
- bidid: bid.bidId,
- transactionid: bid.transactionId,
- auctionid: bid.auctionId,
- bidfloor: bid.params.bidfloor
- };
-
- return {method: 'GET', url: 'https://ssp.otm-r.com/adjson', data: params}
- });
-
- return requests;
- },
- interpretResponse: function (serverResponse, bidRequest) {
- if (!serverResponse || !serverResponse.body) {
- return [];
- }
-
- const answer = [];
-
- serverResponse.body.forEach(bid => {
- if (bid.ad) {
- answer.push({
- requestId: bid.bidid,
- cpm: bid.cpm,
- width: bid.w,
- height: bid.h,
- creativeId: bid.creativeid,
- currency: bid.currency || 'RUB',
- netRevenue: true,
- ad: bid.ad,
- ttl: bid.ttl,
- transactionId: bid.transactionid
- });
- }
- });
-
- return answer;
- },
-};
-
-function getTz() {
- return new Date().getTimezoneOffset();
-}
-
-function getMaxPrioritySize(sizes) {
- var maxPrioritySize = null;
-
- const sizesByPriority = [
- [300, 250],
- [240, 400],
- [728, 90],
- [300, 600],
- [970, 250],
- [300, 50],
- [320, 100]
- ];
-
- const sizeToString = (size) => {
- return size[0] + 'x' + size[1];
- };
-
- const sizesAsString = sizes.map(sizeToString);
-
- sizesByPriority.forEach(size => {
- if (!maxPrioritySize) {
- if (sizesAsString.indexOf(sizeToString(size)) !== -1) {
- maxPrioritySize = size;
- }
- }
- });
-
- if (maxPrioritySize) {
- return maxPrioritySize;
- } else {
- return sizes[0];
- }
-}
-
-registerBidder(spec);
diff --git a/modules/outconBidAdapter.js b/modules/outconBidAdapter.js
deleted file mode 100644
index 0c3ac90172a..00000000000
--- a/modules/outconBidAdapter.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'outcon';
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: ['banner', 'video'],
- isBidRequestValid: function(bid) {
- return !!((bid.params.pod || (bid.params.internalId && bid.params.publisher)) && bid.params.env);
- },
- buildRequests: function(validBidRequests) {
- for (let i = 0; i < validBidRequests.length; i++) {
- let url = '';
- let par = '';
- if (validBidRequests[i].params.pod != undefined) par = 'get?pod=' + validBidRequests[i].params.pod + '&bidId=' + validBidRequests[i].bidId;
- else par = 'get?internalId=' + validBidRequests[i].params.internalId + '&publisher=' + validBidRequests[i].params.publisher + '&bidId=' + validBidRequests[i].bidId;
- par = par + '&vast=true';
- switch (validBidRequests[i].params.env) {
- case 'test':
- par = par + '&demo=true';
- url = 'https://test.outcondigital.com/ad/' + par;
- break;
- case 'api':
- url = 'https://api.outcondigital.com/ad/' + par;
- break;
- case 'stg':
- url = 'https://stg.outcondigital.com/ad/' + par;
- break;
- }
- return {
- method: 'GET',
- url: url,
- data: {}
- };
- }
- },
- interpretResponse: function(serverResponse, bidRequest) {
- const bidResponses = [];
- const bidResponse = {
- requestId: serverResponse.body.bidId,
- cpm: serverResponse.body.cpm,
- width: serverResponse.body.creatives[0].width,
- height: serverResponse.body.creatives[0].height,
- creativeId: serverResponse.body.creatives[0].id,
- currency: serverResponse.body.cur,
- netRevenue: true,
- ttl: 300,
- ad: wrapDisplayUrl(serverResponse.body.creatives[0].url, serverResponse.body.type),
- vastImpUrl: serverResponse.body.trackingURL,
- mediaType: serverResponse.body.type
- };
- if (serverResponse.body.type == 'video') {
- Object.assign(bidResponse, {
- vastUrl: serverResponse.body.vastURL,
- ttl: 3600
- });
- }
- bidResponses.push(bidResponse);
- return bidResponses;
- },
-}
-
-function wrapDisplayUrl(displayUrl, type) {
- if (type == 'video') return `
`;
- if (type == 'banner') return ` `;
- return null;
-}
-
-registerBidder(spec);
diff --git a/modules/ozoneBidAdapter.js b/modules/ozoneBidAdapter.js
index 8ada9d59ae2..974fe3a4304 100644
--- a/modules/ozoneBidAdapter.js
+++ b/modules/ozoneBidAdapter.js
@@ -11,16 +11,17 @@ const ORIGIN = 'https://elb.the-ozone-project.com' // applies only to auction &
const AUCTIONURI = '/openrtb2/auction';
const OZONECOOKIESYNC = '/static/load-cookie.html';
const OZONE_RENDERER_URL = 'https://prebid.the-ozone-project.com/ozone-renderer.js';
+const ORIGIN_DEV = 'https://test.ozpr.net';
-const OZONEVERSION = '2.5.0';
+const OZONEVERSION = '2.6.0';
export const spec = {
gvlid: 524,
- aliases: [{ code: 'lmc' }],
+ aliases: [{code: 'lmc', gvlid: 524}, {code: 'newspassid', gvlid: 524}],
version: OZONEVERSION,
code: BIDDER_CODE,
supportedMediaTypes: [VIDEO, BANNER],
- cookieSyncBag: {'publisherId': null, 'siteId': null, 'userIdObject': {}}, // variables we want to make available to cookie sync
- propertyBag: {'pageId': null, 'buildRequestsStart': 0, 'buildRequestsEnd': 0}, /* allow us to store vars in instance scope - needs to be an object to be mutable */
+ cookieSyncBag: {publisherId: null, siteId: null, userIdObject: {}}, // variables we want to make available to cookie sync
+ propertyBag: {pageId: null, buildRequestsStart: 0, buildRequestsEnd: 0, endpointOverride: null}, /* allow us to store vars in instance scope - needs to be an object to be mutable */
whitelabel_defaults: {
'logId': 'OZONE',
'bidder': 'ozone',
@@ -40,19 +41,45 @@ export const spec = {
this.propertyBag.whitelabel.logId = bidder.toUpperCase();
this.propertyBag.whitelabel.bidder = bidder;
let bidderConfig = config.getConfig(bidder) || {};
+ utils.logInfo('got bidderConfig: ', JSON.parse(JSON.stringify(bidderConfig)));
if (bidderConfig.kvpPrefix) {
this.propertyBag.whitelabel.keyPrefix = bidderConfig.kvpPrefix;
}
+ let arr = this.getGetParametersAsObject();
if (bidderConfig.endpointOverride) {
if (bidderConfig.endpointOverride.origin) {
+ this.propertyBag.endpointOverride = bidderConfig.endpointOverride.origin;
this.propertyBag.whitelabel.auctionUrl = bidderConfig.endpointOverride.origin + AUCTIONURI;
this.propertyBag.whitelabel.cookieSyncUrl = bidderConfig.endpointOverride.origin + OZONECOOKIESYNC;
}
- if (bidderConfig.endpointOverride.rendererUrl) {
+ if (arr.hasOwnProperty('renderer')) {
+ if (arr.renderer.match('%3A%2F%2F')) {
+ this.propertyBag.whitelabel.rendererUrl = decodeURIComponent(arr['renderer']);
+ } else {
+ this.propertyBag.whitelabel.rendererUrl = arr['renderer'];
+ }
+ } else if (bidderConfig.endpointOverride.rendererUrl) {
this.propertyBag.whitelabel.rendererUrl = bidderConfig.endpointOverride.rendererUrl;
}
+ if (bidderConfig.endpointOverride.cookieSyncUrl) {
+ this.propertyBag.whitelabel.cookieSyncUrl = bidderConfig.endpointOverride.cookieSyncUrl;
+ }
+ if (bidderConfig.endpointOverride.auctionUrl) {
+ this.propertyBag.endpointOverride = bidderConfig.endpointOverride.auctionUrl;
+ this.propertyBag.whitelabel.auctionUrl = bidderConfig.endpointOverride.auctionUrl;
+ }
}
- this.logInfo('set propertyBag.whitelabel to', this.propertyBag.whitelabel);
+ try {
+ if (arr.hasOwnProperty('auction') && arr.auction === 'dev') {
+ utils.logInfo('GET: auction=dev');
+ this.propertyBag.whitelabel.auctionUrl = ORIGIN_DEV + AUCTIONURI;
+ }
+ if (arr.hasOwnProperty('cookiesync') && arr.cookiesync === 'dev') {
+ utils.logInfo('GET: cookiesync=dev');
+ this.propertyBag.whitelabel.cookieSyncUrl = ORIGIN_DEV + OZONECOOKIESYNC;
+ }
+ } catch (e) {}
+ utils.logInfo('set propertyBag.whitelabel to', this.propertyBag.whitelabel);
},
getAuctionUrl() {
return this.propertyBag.whitelabel.auctionUrl;
@@ -63,27 +90,6 @@ export const spec = {
getRendererUrl() {
return this.propertyBag.whitelabel.rendererUrl;
},
- /**
- * wrappers for this.logInfo logWarn & logError, to add the proper prefix
- */
- logInfo() {
- if (!this.propertyBag.whitelabel) { return; }
- let args = arguments;
- args[0] = `${this.propertyBag.whitelabel.logId}: ${arguments[0]}`;
- utils.logInfo.apply(this, args);
- },
- logError() {
- if (!this.propertyBag.whitelabel) { return; }
- let args = arguments;
- args[0] = `${this.propertyBag.whitelabel.logId}: ${arguments[0]}`;
- utils.logError.apply(this, args);
- },
- logWarn() {
- if (!this.propertyBag.whitelabel) { return; }
- let args = arguments;
- args[0] = `${this.propertyBag.whitelabel.logId}: ${arguments[0]}`;
- utils.logWarn.apply(this, args);
- },
/**
* Basic check to see whether required parameters are in the request.
* @param bid
@@ -91,62 +97,62 @@ export const spec = {
*/
isBidRequestValid(bid) {
this.loadWhitelabelData(bid);
- this.logInfo('isBidRequestValid : ', config.getConfig(), bid);
+ utils.logInfo('isBidRequestValid : ', config.getConfig(), bid);
let adUnitCode = bid.adUnitCode; // adunit[n].code
if (!(bid.params.hasOwnProperty('placementId'))) {
- this.logError('BID ADAPTER VALIDATION FAILED : missing placementId : siteId, placementId and publisherId are REQUIRED', adUnitCode);
+ utils.logError('VALIDATION FAILED : missing placementId : siteId, placementId and publisherId are REQUIRED', adUnitCode);
return false;
}
if (!this.isValidPlacementId(bid.params.placementId)) {
- this.logError('BID ADAPTER VALIDATION FAILED : placementId must be exactly 10 numeric characters', adUnitCode);
+ utils.logError('VALIDATION FAILED : placementId must be exactly 10 numeric characters', adUnitCode);
return false;
}
if (!(bid.params.hasOwnProperty('publisherId'))) {
- this.logError('BID ADAPTER VALIDATION FAILED : missing publisherId : siteId, placementId and publisherId are REQUIRED', adUnitCode);
+ utils.logError('VALIDATION FAILED : missing publisherId : siteId, placementId and publisherId are REQUIRED', adUnitCode);
return false;
}
if (!(bid.params.publisherId).toString().match(/^[a-zA-Z0-9\-]{12}$/)) {
- this.logError('BID ADAPTER VALIDATION FAILED : publisherId must be exactly 12 alphanumieric characters including hyphens', adUnitCode);
+ utils.logError('VALIDATION FAILED : publisherId must be exactly 12 alphanumieric characters including hyphens', adUnitCode);
return false;
}
if (!(bid.params.hasOwnProperty('siteId'))) {
- this.logError('BID ADAPTER VALIDATION FAILED : missing siteId : siteId, placementId and publisherId are REQUIRED', adUnitCode);
+ utils.logError('VALIDATION FAILED : missing siteId : siteId, placementId and publisherId are REQUIRED', adUnitCode);
return false;
}
if (!(bid.params.siteId).toString().match(/^[0-9]{10}$/)) {
- this.logError('BID ADAPTER VALIDATION FAILED : siteId must be exactly 10 numeric characters', adUnitCode);
+ utils.logError('VALIDATION FAILED : siteId must be exactly 10 numeric characters', adUnitCode);
return false;
}
if (bid.params.hasOwnProperty('customParams')) {
- this.logError('BID ADAPTER VALIDATION FAILED : customParams should be renamed to customData', adUnitCode);
+ utils.logError('VALIDATION FAILED : customParams should be renamed to customData', adUnitCode);
return false;
}
if (bid.params.hasOwnProperty('customData')) {
if (!Array.isArray(bid.params.customData)) {
- this.logError('BID ADAPTER VALIDATION FAILED : customData is not an Array', adUnitCode);
+ utils.logError('VALIDATION FAILED : customData is not an Array', adUnitCode);
return false;
}
if (bid.params.customData.length < 1) {
- this.logError('BID ADAPTER VALIDATION FAILED : customData is an array but does not contain any elements', adUnitCode);
+ utils.logError('VALIDATION FAILED : customData is an array but does not contain any elements', adUnitCode);
return false;
}
if (!(bid.params.customData[0]).hasOwnProperty('targeting')) {
- this.logError('BID ADAPTER VALIDATION FAILED : customData[0] does not contain "targeting"', adUnitCode);
+ utils.logError('VALIDATION FAILED : customData[0] does not contain "targeting"', adUnitCode);
return false;
}
if (typeof bid.params.customData[0]['targeting'] != 'object') {
- this.logError('BID ADAPTER VALIDATION FAILED : customData[0] targeting is not an object', adUnitCode);
+ utils.logError('VALIDATION FAILED : customData[0] targeting is not an object', adUnitCode);
return false;
}
}
if (bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty(VIDEO)) {
if (!bid.mediaTypes[VIDEO].hasOwnProperty('context')) {
- this.logError('No video context key/value in bid. Rejecting bid: ', bid);
+ utils.logError('No video context key/value in bid. Rejecting bid: ', bid);
return false;
}
if (bid.mediaTypes[VIDEO].context !== 'instream' && bid.mediaTypes[VIDEO].context !== 'outstream') {
- this.logError('video.context is invalid. Only instream/outstream video is supported. Rejecting bid: ', bid);
+ utils.logError('video.context is invalid. Only instream/outstream video is supported. Rejecting bid: ', bid);
return false;
}
}
@@ -166,7 +172,7 @@ export const spec = {
this.propertyBag.buildRequestsStart = new Date().getTime();
let whitelabelBidder = this.propertyBag.whitelabel.bidder; // by default = ozone
let whitelabelPrefix = this.propertyBag.whitelabel.keyPrefix;
- this.logInfo(`buildRequests time: ${this.propertyBag.buildRequestsStart} v ${OZONEVERSION} validBidRequests`, JSON.parse(JSON.stringify(validBidRequests)), 'bidderRequest', JSON.parse(JSON.stringify(bidderRequest)));
+ utils.logInfo(`buildRequests time: ${this.propertyBag.buildRequestsStart} v ${OZONEVERSION} validBidRequests`, JSON.parse(JSON.stringify(validBidRequests)), 'bidderRequest', JSON.parse(JSON.stringify(bidderRequest)));
// First check - is there any config to block this request?
if (this.blockTheRequest()) {
return [];
@@ -178,26 +184,20 @@ export const spec = {
this.cookieSyncBag.publisherId = utils.deepAccess(validBidRequests[0], 'params.publisherId');
htmlParams = validBidRequests[0].params;
}
- this.logInfo('cookie sync bag', this.cookieSyncBag);
+ utils.logInfo('cookie sync bag', this.cookieSyncBag);
let singleRequest = this.getWhitelabelConfigItem('ozone.singleRequest');
singleRequest = singleRequest !== false; // undefined & true will be true
- this.logInfo(`config ${whitelabelBidder}.singleRequest : `, singleRequest);
+ utils.logInfo(`config ${whitelabelBidder}.singleRequest : `, singleRequest);
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 && bidderRequest.gdprConsent) {
- this.logInfo('ADDING GDPR info');
- let apiVersion = bidderRequest.gdprConsent.apiVersion || '1';
- ozoneRequest.regs = {ext: {gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0, apiVersion: apiVersion}};
- if (ozoneRequest.regs.ext.gdpr) {
- ozoneRequest.user = ozoneRequest.user || {};
- ozoneRequest.user.ext = {'consent': bidderRequest.gdprConsent.consentString};
- } else {
- this.logInfo('**** Strange CMP info: bidderRequest.gdprConsent exists BUT bidderRequest.gdprConsent.gdprApplies is false. See bidderRequest logged above. ****');
- }
- } else {
- this.logInfo('WILL NOT ADD GDPR info; no bidderRequest.gdprConsent object was present.');
+ // First party data module : look for ortb2 in setconfig & set the User object. NOTE THAT this should happen before we set the consentString
+ let fpd = config.getConfig('ortb2');
+ if (fpd && utils.deepAccess(fpd, 'user')) {
+ utils.logInfo('added FPD user object');
+ ozoneRequest.user = fpd.user;
}
+
const getParams = this.getGetParametersAsObject();
const wlOztestmodeKey = whitelabelPrefix + 'testmode';
const isTestMode = getParams[wlOztestmodeKey] || null; // this can be any string, it's used for testing ads
@@ -214,18 +214,18 @@ export const spec = {
let arrBannerSizes = [];
if (!ozoneBidRequest.hasOwnProperty('mediaTypes')) {
if (ozoneBidRequest.hasOwnProperty('sizes')) {
- this.logInfo('no mediaTypes detected - will use the sizes array in the config root');
+ utils.logInfo('no mediaTypes detected - will use the sizes array in the config root');
arrBannerSizes = ozoneBidRequest.sizes;
} else {
- this.logInfo('no mediaTypes detected, no sizes array in the config root either. Cannot set sizes for banner type');
+ utils.logInfo('no mediaTypes detected, no sizes array in the config root either. Cannot set sizes for banner type');
}
} else {
if (ozoneBidRequest.mediaTypes.hasOwnProperty(BANNER)) {
arrBannerSizes = ozoneBidRequest.mediaTypes[BANNER].sizes; /* Note - if there is a sizes element in the config root it will be pushed into here */
- this.logInfo('setting banner size from the mediaTypes.banner element for bidId ' + obj.id + ': ', arrBannerSizes);
+ utils.logInfo('setting banner size from the mediaTypes.banner element for bidId ' + obj.id + ': ', arrBannerSizes);
}
if (ozoneBidRequest.mediaTypes.hasOwnProperty(VIDEO)) {
- this.logInfo('openrtb 2.5 compliant video');
+ utils.logInfo('openrtb 2.5 compliant video');
// examine all the video attributes in the config, and either put them into obj.video if allowed by IAB2.5 or else in to obj.video.ext
if (typeof ozoneBidRequest.mediaTypes[VIDEO] == 'object') {
let childConfig = utils.deepAccess(ozoneBidRequest, 'params.video', {});
@@ -234,25 +234,33 @@ export const spec = {
}
// we need to duplicate some of the video values
let wh = getWidthAndHeightFromVideoObject(obj.video);
- this.logInfo('setting video object from the mediaTypes.video element: ' + obj.id + ':', obj.video, 'wh=', wh);
+ utils.logInfo('setting video object from the mediaTypes.video element: ' + obj.id + ':', obj.video, 'wh=', wh);
if (wh && typeof wh === 'object') {
obj.video.w = wh['w'];
obj.video.h = wh['h'];
if (playerSizeIsNestedArray(obj.video)) { // this should never happen; it was in the original spec for this change though.
- this.logInfo('setting obj.video.format to be an array of objects');
+ utils.logInfo('setting obj.video.format to be an array of objects');
obj.video.ext.format = [wh];
} else {
- this.logInfo('setting obj.video.format to be an object');
+ utils.logInfo('setting obj.video.format to be an object');
obj.video.ext.format = wh;
}
} else {
- this.logWarn('cannot set w, h & format values for video; the config is not right');
+ utils.logWarn('cannot set w, h & format values for video; the config is not right');
}
}
// Native integration is not complete yet
if (ozoneBidRequest.mediaTypes.hasOwnProperty(NATIVE)) {
obj.native = ozoneBidRequest.mediaTypes[NATIVE];
- this.logInfo('setting native object from the mediaTypes.native element: ' + obj.id + ':', obj.native);
+ utils.logInfo('setting native object from the mediaTypes.native element: ' + obj.id + ':', obj.native);
+ }
+ // is the publisher specifying floors, and is the floors module enabled?
+ if (ozoneBidRequest.hasOwnProperty('getFloor')) {
+ utils.logInfo('This bidRequest object has property: getFloor');
+ obj.floor = this.getFloorObjectForAuction(ozoneBidRequest);
+ utils.logInfo('obj.floor is : ', obj.floor);
+ } else {
+ utils.logInfo('This bidRequest object DOES NOT have property: getFloor');
}
}
if (arrBannerSizes.length > 0) {
@@ -268,17 +276,18 @@ export const spec = {
}
// these 3 MUST exist - we check them in the validation method
obj.placementId = placementId;
- // build the imp['ext'] object
- obj.ext = {'prebid': {'storedrequest': {'id': placementId}}};
+ // build the imp['ext'] object - NOTE - Dont obliterate anything that' already in obj.ext
+ utils.deepSetValue(obj, 'ext.prebid', {'storedrequest': {'id': placementId}});
+ // obj.ext = {'prebid': {'storedrequest': {'id': placementId}}};
obj.ext[whitelabelBidder] = {};
obj.ext[whitelabelBidder].adUnitCode = ozoneBidRequest.adUnitCode; // eg. 'mpu'
obj.ext[whitelabelBidder].transactionId = ozoneBidRequest.transactionId; // this is the transactionId PER adUnit, common across bidders for this unit
if (ozoneBidRequest.params.hasOwnProperty('customData')) {
obj.ext[whitelabelBidder].customData = ozoneBidRequest.params.customData;
}
- this.logInfo(`obj.ext.${whitelabelBidder} is `, obj.ext[whitelabelBidder]);
+ utils.logInfo(`obj.ext.${whitelabelBidder} is `, obj.ext[whitelabelBidder]);
if (isTestMode != null) {
- this.logInfo('setting isTestMode to ', isTestMode);
+ utils.logInfo('setting isTestMode to ', isTestMode);
if (obj.ext[whitelabelBidder].hasOwnProperty('customData')) {
for (let i = 0; i < obj.ext[whitelabelBidder].customData.length; i++) {
obj.ext[whitelabelBidder].customData[i]['targeting'][wlOztestmodeKey] = isTestMode;
@@ -288,6 +297,19 @@ export const spec = {
obj.ext[whitelabelBidder].customData[0].targeting[wlOztestmodeKey] = isTestMode;
}
}
+ if (fpd && utils.deepAccess(fpd, 'site')) {
+ // attach the site fpd into exactly : imp[n].ext.[whitelabel].customData.0.targeting
+ utils.logInfo('added FPD site object');
+ if (utils.deepAccess(obj, 'ext.' + whitelabelBidder + '.customData.0.targeting', false)) {
+ obj.ext[whitelabelBidder].customData[0].targeting = Object.assign(obj.ext[whitelabelBidder].customData[0].targeting, fpd.site);
+ // let keys = utils.getKeys(fpd.site);
+ // for (let i = 0; i < keys.length; i++) {
+ // obj.ext[whitelabelBidder].customData[0].targeting[keys[i]] = fpd.site[keys[i]];
+ // }
+ } else {
+ utils.deepSetValue(obj, 'ext.' + whitelabelBidder + '.customData.0.targeting', fpd.site);
+ }
+ }
return obj;
});
@@ -305,20 +327,27 @@ export const spec = {
}
extObj[whitelabelBidder].pv = this.getPageId(); // attach the page ID that will be common to all auciton calls for this page if refresh() is called
let ozOmpFloorDollars = this.getWhitelabelConfigItem('ozone.oz_omp_floor'); // valid only if a dollar value (typeof == 'number')
- this.logInfo(`${whitelabelPrefix}_omp_floor dollar value = `, ozOmpFloorDollars);
+ utils.logInfo(`${whitelabelPrefix}_omp_floor dollar value = `, ozOmpFloorDollars);
if (typeof ozOmpFloorDollars === 'number') {
extObj[whitelabelBidder][whitelabelPrefix + '_omp_floor'] = ozOmpFloorDollars;
} else if (typeof ozOmpFloorDollars !== 'undefined') {
- this.logError(`${whitelabelPrefix}_omp_floor is invalid - IF SET then this must be a number, representing dollar value eg. ${whitelabelPrefix}_omp_floor: 1.55. You have it set as a ` + (typeof ozOmpFloorDollars));
+ utils.logError(`${whitelabelPrefix}_omp_floor is invalid - IF SET then this must be a number, representing dollar value eg. ${whitelabelPrefix}_omp_floor: 1.55. You have it set as a ` + (typeof ozOmpFloorDollars));
}
let ozWhitelistAdserverKeys = this.getWhitelabelConfigItem('ozone.oz_whitelist_adserver_keys');
let useOzWhitelistAdserverKeys = utils.isArray(ozWhitelistAdserverKeys) && ozWhitelistAdserverKeys.length > 0;
extObj[whitelabelBidder][whitelabelPrefix + '_kvp_rw'] = useOzWhitelistAdserverKeys ? 1 : 0;
if (whitelabelBidder != 'ozone') {
- this.logInfo('setting aliases object');
+ utils.logInfo('setting aliases object');
extObj.prebid = {aliases: {'ozone': whitelabelBidder}};
}
+ // 20210413 - adding a set of GET params to pass to auction
+ if (getParams.hasOwnProperty('ozf')) { extObj[whitelabelBidder]['ozf'] = getParams.ozf == 'true' || getParams.ozf == 1 ? 1 : 0; }
+ if (getParams.hasOwnProperty('ozpf')) { extObj[whitelabelBidder]['ozpf'] = getParams.ozpf == 'true' || getParams.ozpf == 1 ? 1 : 0; }
+ if (getParams.hasOwnProperty('ozrp') && getParams.ozrp.match(/^[0-3]$/)) { extObj[whitelabelBidder]['ozrp'] = parseInt(getParams.ozrp); }
+ if (getParams.hasOwnProperty('ozip') && getParams.ozip.match(/^\d+$/)) { extObj[whitelabelBidder]['ozip'] = parseInt(getParams.ozip); }
+ if (this.propertyBag.endpointOverride != null) { extObj[whitelabelBidder]['origin'] = this.propertyBag.endpointOverride; }
+ // extObj.ortb2 = config.getConfig('ortb2'); // original test location
var userExtEids = this.generateEids(validBidRequests); // generate the UserIDs in the correct format for UserId module
ozoneRequest.site = {
@@ -328,6 +357,26 @@ export const spec = {
};
ozoneRequest.test = (getParams.hasOwnProperty('pbjs_debug') && getParams['pbjs_debug'] === 'true') ? 1 : 0;
+ // this should come as late as possible so it overrides any user.ext.consent value
+ if (bidderRequest && bidderRequest.gdprConsent) {
+ utils.logInfo('ADDING GDPR info');
+ let apiVersion = utils.deepAccess(bidderRequest, 'gdprConsent.apiVersion', 1);
+ ozoneRequest.regs = {ext: {gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0, apiVersion: apiVersion}};
+ if (utils.deepAccess(ozoneRequest, 'regs.ext.gdpr')) {
+ utils.deepSetValue(ozoneRequest, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
+ } else {
+ utils.logInfo('**** Strange CMP info: bidderRequest.gdprConsent exists BUT bidderRequest.gdprConsent.gdprApplies is false. See bidderRequest logged above. ****');
+ }
+ } else {
+ utils.logInfo('WILL NOT ADD GDPR info; no bidderRequest.gdprConsent object');
+ }
+ if (bidderRequest && bidderRequest.uspConsent) {
+ utils.logInfo('ADDING CCPA info');
+ utils.deepSetValue(ozoneRequest, 'user.ext.uspConsent', bidderRequest.uspConsent);
+ } else {
+ utils.logInfo('WILL NOT ADD CCPA info; no bidderRequest.uspConsent.');
+ }
+
// this is for 2.2.1
// coppa compliance
if (config.getConfig('coppa') === true) {
@@ -336,7 +385,7 @@ export const spec = {
// return the single request object OR the array:
if (singleRequest) {
- this.logInfo('buildRequests starting to generate response for a single request');
+ utils.logInfo('buildRequests starting to generate response for a single request');
ozoneRequest.id = bidderRequest.auctionId; // Unique ID of the bid request, provided by the exchange.
ozoneRequest.auctionId = bidderRequest.auctionId; // not sure if this should be here?
ozoneRequest.imp = tosendtags;
@@ -349,14 +398,14 @@ export const spec = {
data: JSON.stringify(ozoneRequest),
bidderRequest: bidderRequest
};
- this.logInfo('buildRequests request data for single = ', ozoneRequest);
+ utils.logInfo('buildRequests request data for single = ', JSON.parse(JSON.stringify(ozoneRequest)));
this.propertyBag.buildRequestsEnd = new Date().getTime();
- this.logInfo(`buildRequests going to return for single at time ${this.propertyBag.buildRequestsEnd} (took ${this.propertyBag.buildRequestsEnd - this.propertyBag.buildRequestsStart}ms): `, ret);
+ utils.logInfo(`buildRequests going to return for single at time ${this.propertyBag.buildRequestsEnd} (took ${this.propertyBag.buildRequestsEnd - this.propertyBag.buildRequestsStart}ms): `, ret);
return ret;
}
// not single request - pull apart the tosendtags array & return an array of objects each containing one element in the imp array.
let arrRet = tosendtags.map(imp => {
- this.logInfo('buildRequests starting to generate non-single response, working on imp : ', imp);
+ utils.logInfo('buildRequests starting to generate non-single response, working on imp : ', imp);
let ozoneRequestSingle = Object.assign({}, ozoneRequest);
imp.ext[whitelabelBidder].pageAuctionId = bidderRequest['auctionId']; // make a note in the ext object of what the original auctionId was, in the bidderRequest object
ozoneRequestSingle.id = imp.ext[whitelabelBidder].transactionId; // Unique ID of the bid request, provided by the exchange.
@@ -365,7 +414,7 @@ export const spec = {
ozoneRequestSingle.ext = extObj;
ozoneRequestSingle.source = {'tid': imp.ext[whitelabelBidder].transactionId};
utils.deepSetValue(ozoneRequestSingle, 'user.ext.eids', userExtEids);
- this.logInfo('buildRequests RequestSingle (for non-single) = ', ozoneRequestSingle);
+ utils.logInfo('buildRequests RequestSingle (for non-single) = ', ozoneRequestSingle);
return {
method: 'POST',
url: this.getAuctionUrl(),
@@ -374,9 +423,42 @@ export const spec = {
};
});
this.propertyBag.buildRequestsEnd = new Date().getTime();
- this.logInfo(`buildRequests going to return for non-single at time ${this.propertyBag.buildRequestsEnd} (took ${this.propertyBag.buildRequestsEnd - this.propertyBag.buildRequestsStart}ms): `, arrRet);
+ utils.logInfo(`buildRequests going to return for non-single at time ${this.propertyBag.buildRequestsEnd} (took ${this.propertyBag.buildRequestsEnd - this.propertyBag.buildRequestsStart}ms): `, arrRet);
return arrRet;
},
+ /**
+ * parse a bidRequestRef that contains getFloor(), get all the data from it for the sizes & media requested for this bid & return an object containing floor data you can send to auciton endpoint
+ * @param bidRequestRef object = a valid bid request object reference
+ * @return object
+ *
+ * call:
+ * bidObj.getFloor({
+ currency: 'USD', <- currency to return the value in
+ mediaType: ‘banner’,
+ size: ‘*’ <- or [300,250] or [[300,250],[640,480]]
+ * });
+ *
+ */
+ getFloorObjectForAuction(bidRequestRef) {
+ const mediaTypesSizes = {
+ banner: utils.deepAccess(bidRequestRef, 'mediaTypes.banner.sizes', null),
+ video: utils.deepAccess(bidRequestRef, 'mediaTypes.video.playerSize', null),
+ native: utils.deepAccess(bidRequestRef, 'mediaTypes.native.image.sizes', null)
+ }
+ utils.logInfo('getFloorObjectForAuction mediaTypesSizes : ', mediaTypesSizes);
+ let ret = {};
+ if (mediaTypesSizes.banner) {
+ ret.banner = bidRequestRef.getFloor({mediaType: 'banner', currency: 'USD', size: mediaTypesSizes.banner});
+ }
+ if (mediaTypesSizes.video) {
+ ret.video = bidRequestRef.getFloor({mediaType: 'video', currency: 'USD', size: mediaTypesSizes.video});
+ }
+ if (mediaTypesSizes.native) {
+ ret.native = bidRequestRef.getFloor({mediaType: 'native', currency: 'USD', size: mediaTypesSizes.native});
+ }
+ utils.logInfo('getFloorObjectForAuction returning : ', JSON.parse(JSON.stringify(ret)));
+ return ret;
+ },
/**
* Interpret the response if the array contains BIDDER elements, in the format: [ [bidder1 bid 1, bidder1 bid 2], [bidder2 bid 1, bidder2 bid 2] ]
* NOte that in singleRequest mode this will be called once, else it will be called for each adSlot's response
@@ -392,8 +474,8 @@ export const spec = {
let startTime = new Date().getTime();
let whitelabelBidder = this.propertyBag.whitelabel.bidder; // by default = ozone
let whitelabelPrefix = this.propertyBag.whitelabel.keyPrefix;
- this.logInfo(`interpretResponse time: ${startTime} . Time between buildRequests done and interpretResponse start was ${startTime - this.propertyBag.buildRequestsEnd}ms`);
- this.logInfo(`serverResponse, request`, JSON.parse(JSON.stringify(serverResponse)), JSON.parse(JSON.stringify(request)));
+ utils.logInfo(`interpretResponse time: ${startTime} . Time between buildRequests done and interpretResponse start was ${startTime - this.propertyBag.buildRequestsEnd}ms`);
+ utils.logInfo(`serverResponse, request`, JSON.parse(JSON.stringify(serverResponse)), JSON.parse(JSON.stringify(request)));
serverResponse = serverResponse.body || {};
// note that serverResponse.id value is the auction_id we might want to use for reporting reasons.
if (!serverResponse.hasOwnProperty('seatbid')) {
@@ -404,12 +486,15 @@ export const spec = {
}
let arrAllBids = [];
let enhancedAdserverTargeting = this.getWhitelabelConfigItem('ozone.enhancedAdserverTargeting');
- this.logInfo('enhancedAdserverTargeting', enhancedAdserverTargeting);
+ utils.logInfo('enhancedAdserverTargeting', enhancedAdserverTargeting);
if (typeof enhancedAdserverTargeting == 'undefined') {
enhancedAdserverTargeting = true;
}
- this.logInfo('enhancedAdserverTargeting', enhancedAdserverTargeting);
+ utils.logInfo('enhancedAdserverTargeting', enhancedAdserverTargeting);
+
+ // 2021-03-05 - comment this out for a build without adding adid to the response
serverResponse.seatbid = injectAdIdsIntoAllBidResponses(serverResponse.seatbid); // we now make sure that each bid in the bidresponse has a unique (within page) adId attribute.
+
serverResponse.seatbid = this.removeSingleBidderMultipleBids(serverResponse.seatbid);
let ozOmpFloorDollars = this.getWhitelabelConfigItem('ozone.oz_omp_floor'); // valid only if a dollar value (typeof == 'number')
let addOzOmpFloorDollars = typeof ozOmpFloorDollars === 'number';
@@ -420,30 +505,32 @@ export const spec = {
let sb = serverResponse.seatbid[i];
for (let j = 0; j < sb.bid.length; j++) {
let thisRequestBid = this.getBidRequestForBidId(sb.bid[j].impid, request.bidderRequest.bids);
- this.logInfo(`seatbid:${i}, bid:${j} Going to set default w h for seatbid/bidRequest`, sb.bid[j], thisRequestBid);
+ utils.logInfo(`seatbid:${i}, bid:${j} Going to set default w h for seatbid/bidRequest`, sb.bid[j], thisRequestBid);
const {defaultWidth, defaultHeight} = defaultSize(thisRequestBid);
let thisBid = ozoneAddStandardProperties(sb.bid[j], defaultWidth, defaultHeight);
+ // prebid 4.0 compliance
+ thisBid.meta = {advertiserDomains: thisBid.adomain || []};
let videoContext = null;
let isVideo = false;
let bidType = utils.deepAccess(thisBid, 'ext.prebid.type');
- this.logInfo(`this bid type is : ${bidType}`, j);
+ utils.logInfo(`this bid type is : ${bidType}`, j);
if (bidType === VIDEO) {
isVideo = true;
videoContext = this.getVideoContextForBidId(thisBid.bidId, request.bidderRequest.bids); // should be instream or outstream (or null if error)
if (videoContext === 'outstream') {
- this.logInfo('going to attach a renderer to OUTSTREAM video : ', j);
+ utils.logInfo('going to attach a renderer to OUTSTREAM video : ', j);
thisBid.renderer = newRenderer(thisBid.bidId);
} else {
- this.logInfo('bid is not an outstream video, will not attach a renderer: ', j);
+ utils.logInfo('bid is not an outstream video, will not attach a renderer: ', j);
}
}
let adserverTargeting = {};
if (enhancedAdserverTargeting) {
let allBidsForThisBidid = ozoneGetAllBidsForBidId(thisBid.bidId, serverResponse.seatbid);
// add all the winning & non-winning bids for this bidId:
- this.logInfo('Going to iterate allBidsForThisBidId', allBidsForThisBidid);
+ utils.logInfo('Going to iterate allBidsForThisBidId', allBidsForThisBidid);
Object.keys(allBidsForThisBidid).forEach((bidderName, index, ar2) => {
- this.logInfo(`adding adserverTargeting for ${bidderName} for bidId ${thisBid.bidId}`);
+ utils.logInfo(`adding adserverTargeting for ${bidderName} for bidId ${thisBid.bidId}`);
// let bidderName = bidderNameWH.split('_')[0];
adserverTargeting[whitelabelPrefix + '_' + bidderName] = bidderName;
adserverTargeting[whitelabelPrefix + '_' + bidderName + '_crid'] = String(allBidsForThisBidid[bidderName].crid);
@@ -473,21 +560,27 @@ export const spec = {
});
} else {
if (useOzWhitelistAdserverKeys) {
- this.logWarn(`You have set a whitelist of adserver keys but this will be ignored because ${whitelabelBidder}.enhancedAdserverTargeting is set to false. No per-bid keys will be sent to adserver.`);
+ utils.logWarn(`You have set a whitelist of adserver keys but this will be ignored because ${whitelabelBidder}.enhancedAdserverTargeting is set to false. No per-bid keys will be sent to adserver.`);
} else {
- this.logInfo(`${whitelabelBidder}.enhancedAdserverTargeting is set to false, so no per-bid keys will be sent to adserver.`);
+ utils.logInfo(`${whitelabelBidder}.enhancedAdserverTargeting is set to false, so no per-bid keys will be sent to adserver.`);
}
}
// also add in the winning bid, to be sent to dfp
let {seat: winningSeat, bid: winningBid} = ozoneGetWinnerForRequestBid(thisBid.bidId, serverResponse.seatbid);
adserverTargeting[whitelabelPrefix + '_auc_id'] = String(request.bidderRequest.auctionId);
adserverTargeting[whitelabelPrefix + '_winner'] = String(winningSeat);
+ adserverTargeting[whitelabelPrefix + '_bid'] = 'true';
+
if (enhancedAdserverTargeting) {
adserverTargeting[whitelabelPrefix + '_imp_id'] = String(winningBid.impid);
adserverTargeting[whitelabelPrefix + '_pb_v'] = OZONEVERSION;
+ adserverTargeting[whitelabelPrefix + '_pb'] = winningBid.price;
+ adserverTargeting[whitelabelPrefix + '_pb_r'] = getRoundedBid(winningBid.price, bidType);
+ adserverTargeting[whitelabelPrefix + '_adId'] = String(winningBid.adId);
+ adserverTargeting[whitelabelPrefix + '_size'] = `${winningBid.width}x${winningBid.height}`;
}
if (useOzWhitelistAdserverKeys) { // delete any un-whitelisted keys
- this.logInfo('Going to filter out adserver targeting keys not in the whitelist: ', ozWhitelistAdserverKeys);
+ utils.logInfo('Going to filter out adserver targeting keys not in the whitelist: ', ozWhitelistAdserverKeys);
Object.keys(adserverTargeting).forEach(function(key) { if (ozWhitelistAdserverKeys.indexOf(key) === -1) { delete adserverTargeting[key]; } });
}
thisBid.adserverTargeting = adserverTargeting;
@@ -495,7 +588,7 @@ export const spec = {
}
}
let endTime = new Date().getTime();
- this.logInfo(`interpretResponse going to return at time ${endTime} (took ${endTime - startTime}ms) Time from buildRequests Start -> interpretRequests End = ${endTime - this.propertyBag.buildRequestsStart}ms`, arrAllBids);
+ utils.logInfo(`interpretResponse going to return at time ${endTime} (took ${endTime - startTime}ms) Time from buildRequests Start -> interpretRequests End = ${endTime - this.propertyBag.buildRequestsStart}ms`, arrAllBids);
return arrAllBids;
},
/**
@@ -539,8 +632,9 @@ export const spec = {
return ret;
},
// see http://prebid.org/dev-docs/bidder-adaptor.html#registering-user-syncs
- getUserSyncs(optionsType, serverResponse, gdprConsent) {
- this.logInfo('getUserSyncs optionsType, serverResponse, gdprConsent, cookieSyncBag', optionsType, serverResponse, gdprConsent, this.cookieSyncBag);
+ // us privacy: https://docs.prebid.org/dev-docs/modules/consentManagementUsp.html
+ getUserSyncs(optionsType, serverResponse, gdprConsent, usPrivacy) {
+ utils.logInfo('getUserSyncs optionsType', optionsType, 'serverResponse', serverResponse, 'gdprConsent', gdprConsent, 'usPrivacy', usPrivacy, 'cookieSyncBag', this.cookieSyncBag);
if (!serverResponse || serverResponse.length === 0) {
return [];
}
@@ -551,9 +645,13 @@ export const spec = {
}
arrQueryString.push('gdpr=' + (utils.deepAccess(gdprConsent, 'gdprApplies', false) ? '1' : '0'));
arrQueryString.push('gdpr_consent=' + utils.deepAccess(gdprConsent, 'consentString', ''));
- var objKeys = Object.getOwnPropertyNames(this.cookieSyncBag.userIdObject);
- for (let idx in objKeys) {
- let keyname = objKeys[idx];
+ arrQueryString.push('usp_consent=' + (usPrivacy || ''));
+ // var objKeys = Object.getOwnPropertyNames(this.cookieSyncBag.userIdObject);
+ // for (let idx in objKeys) {
+ // let keyname = objKeys[idx];
+ // arrQueryString.push(keyname + '=' + this.cookieSyncBag.userIdObject[keyname]);
+ // }
+ for (let keyname in this.cookieSyncBag.userIdObject) {
arrQueryString.push(keyname + '=' + this.cookieSyncBag.userIdObject[keyname]);
}
arrQueryString.push('publisherId=' + this.cookieSyncBag.publisherId);
@@ -565,7 +663,7 @@ export const spec = {
if (strQueryString.length > 0) {
strQueryString = '?' + strQueryString;
}
- this.logInfo('getUserSyncs going to return cookie sync url : ' + this.getCookieSyncUrl() + strQueryString);
+ utils.logInfo('getUserSyncs going to return cookie sync url : ' + this.getCookieSyncUrl() + strQueryString);
return [{
type: 'iframe',
url: this.getCookieSyncUrl() + strQueryString
@@ -600,15 +698,16 @@ export const spec = {
return null;
},
/**
+ * This is used for cookie sync, not auction call
* Look for pubcid & all the other IDs according to http://prebid.org/dev-docs/modules/userId.html
- * NOTE that criteortus is deprecated & should be removed asap
* @return map
*/
findAllUserIds(bidRequest) {
var ret = {};
- // @todo - what is fabrick called & where to look for it? If it's a simple value then it will automatically be ok
- let searchKeysSingle = ['pubcid', 'tdid', 'id5id', 'parrableId', 'idl_env', 'criteoId', 'criteortus',
- 'sharedid', 'lotamePanoramaId', 'fabrickId'];
+ // @todo - what is Neustar fabrick called & where to look for it? If it's a simple value then it will automatically be ok
+ // it is not in the table 'Bidder Adapter Implementation' on https://docs.prebid.org/dev-docs/modules/userId.html#prebidjs-adapters
+ let searchKeysSingle = ['pubcid', 'tdid', 'idl_env', 'criteoId', 'lotamePanoramaId', 'fabrickId'];
+
if (bidRequest.hasOwnProperty('userId')) {
for (let arrayId in searchKeysSingle) {
let key = searchKeysSingle[arrayId];
@@ -616,19 +715,37 @@ export const spec = {
if (typeof (bidRequest.userId[key]) == 'string') {
ret[key] = bidRequest.userId[key];
} else if (typeof (bidRequest.userId[key]) == 'object') {
+ utils.logError(`WARNING: findAllUserIds had to use first key in user object to get value for bid.userId key: ${key}. Prebid adapter should be updated.`);
+ // fallback - get the value of the first key in the object; this is NOT desirable behaviour
ret[key] = bidRequest.userId[key][Object.keys(bidRequest.userId[key])[0]]; // cannot use Object.values
} else {
- this.logError(`failed to get string key value for userId : ${key}`);
+ utils.logError(`failed to get string key value for userId : ${key}`);
}
}
}
- var lipbid = utils.deepAccess(bidRequest.userId, 'lipb.lipbid');
+ let lipbid = utils.deepAccess(bidRequest.userId, 'lipb.lipbid');
if (lipbid) {
ret['lipb'] = {'lipbid': lipbid};
}
+ let id5id = utils.deepAccess(bidRequest.userId, 'id5id.uid');
+ if (id5id) {
+ ret['id5id'] = id5id;
+ }
+ let parrableId = utils.deepAccess(bidRequest.userId, 'parrableId.eid');
+ if (parrableId) {
+ ret['parrableId'] = parrableId;
+ }
+ let sharedid = utils.deepAccess(bidRequest.userId, 'sharedid.id');
+ if (sharedid) {
+ ret['sharedid'] = sharedid;
+ }
+ let sharedidthird = utils.deepAccess(bidRequest.userId, 'sharedid.third');
+ if (sharedidthird) {
+ ret['sharedidthird'] = sharedidthird;
+ }
}
if (!ret.hasOwnProperty('pubcid')) {
- var pubcid = utils.deepAccess(bidRequest, 'crumbs.pubcid');
+ let pubcid = utils.deepAccess(bidRequest, 'crumbs.pubcid');
if (pubcid) {
ret['pubcid'] = pubcid; // if built with old pubCommonId module
}
@@ -654,10 +771,10 @@ export const spec = {
let arr = this.getGetParametersAsObject();
if (arr.hasOwnProperty(whitelabelPrefix + 'storedrequest')) {
if (this.isValidPlacementId(arr[whitelabelPrefix + 'storedrequest'])) {
- this.logInfo(`using GET ${whitelabelPrefix}storedrequest ` + arr[whitelabelPrefix + 'storedrequest'] + ' to replace placementId');
+ utils.logInfo(`using GET ${whitelabelPrefix}storedrequest ` + arr[whitelabelPrefix + 'storedrequest'] + ' to replace placementId');
return arr[whitelabelPrefix + 'storedrequest'];
} else {
- this.logError(`GET ${whitelabelPrefix}storedrequest FAILED VALIDATION - will not use it`);
+ utils.logError(`GET ${whitelabelPrefix}storedrequest FAILED VALIDATION - will not use it`);
}
}
return null;
@@ -717,7 +834,7 @@ export const spec = {
// if there is an ozone.oz_request = false then quit now.
let ozRequest = this.getWhitelabelConfigItem('ozone.oz_request');
if (typeof ozRequest == 'boolean' && !ozRequest) {
- this.logWarn(`Will not allow auction : ${this.propertyBag.whitelabel.keyPrefix}one.${this.propertyBag.whitelabel.keyPrefix}_request is set to false`);
+ utils.logWarn(`Will not allow auction : ${this.propertyBag.whitelabel.keyPrefix}one.${this.propertyBag.whitelabel.keyPrefix}_request is set to false`);
return true;
}
return false;
@@ -815,13 +932,13 @@ export const spec = {
* @returns seatbid object
*/
export function injectAdIdsIntoAllBidResponses(seatbid) {
- spec.logInfo('injectAdIdsIntoAllBidResponses', seatbid);
+ utils.logInfo('injectAdIdsIntoAllBidResponses', seatbid);
for (let i = 0; i < seatbid.length; i++) {
let sb = seatbid[i];
for (let j = 0; j < sb.bid.length; j++) {
// modify the bidId per-bid, so each bid has a unique adId within this response, and dfp can select one.
// 2020-06 we now need a second level of ID because there might be multiple identical impid's within a seatbid!
- sb.bid[j]['adId'] = `${sb.bid[j]['impid']}-${i}-${j}`;
+ sb.bid[j]['adId'] = `${sb.bid[j]['impid']}-${i}-${spec.propertyBag.whitelabel.keyPrefix}-${j}`;
}
}
return seatbid;
@@ -841,7 +958,7 @@ export function checkDeepArray(Arr) {
export function defaultSize(thebidObj) {
if (!thebidObj) {
- spec.logInfo('defaultSize received empty bid obj! going to return fixed default size');
+ utils.logInfo('defaultSize received empty bid obj! going to return fixed default size');
return {
'defaultHeight': 250,
'defaultWidth': 300
@@ -919,14 +1036,14 @@ export function getRoundedBid(price, mediaType) {
let theConfigObject = getGranularityObject(mediaType, mediaTypeGranularity, strBuckets, objBuckets);
let theConfigKey = getGranularityKeyName(mediaType, mediaTypeGranularity, strBuckets);
- spec.logInfo('getRoundedBid. price:', price, 'mediaType:', mediaType, 'configkey:', theConfigKey, 'configObject:', theConfigObject, 'mediaTypeGranularity:', mediaTypeGranularity, 'strBuckets:', strBuckets);
+ utils.logInfo('getRoundedBid. price:', price, 'mediaType:', mediaType, 'configkey:', theConfigKey, 'configObject:', theConfigObject, 'mediaTypeGranularity:', mediaTypeGranularity, 'strBuckets:', strBuckets);
let priceStringsObj = getPriceBucketString(
price,
theConfigObject,
config.getConfig('currency.granularityMultiplier')
);
- spec.logInfo('priceStringsObj', priceStringsObj);
+ utils.logInfo('priceStringsObj', priceStringsObj);
// by default, without any custom granularity set, you get granularity name : 'medium'
let granularityNamePriceStringsKeyMapping = {
'medium': 'med',
@@ -937,7 +1054,7 @@ export function getRoundedBid(price, mediaType) {
};
if (granularityNamePriceStringsKeyMapping.hasOwnProperty(theConfigKey)) {
let priceStringsKey = granularityNamePriceStringsKeyMapping[theConfigKey];
- spec.logInfo('getRoundedBid: looking for priceStringsKey:', priceStringsKey);
+ utils.logInfo('getRoundedBid: looking for priceStringsKey:', priceStringsKey);
return priceStringsObj[priceStringsKey];
}
return priceStringsObj['auto'];
@@ -1006,15 +1123,15 @@ export function getWidthAndHeightFromVideoObject(objVideo) {
return null;
}
if (playerSize[0] && typeof playerSize[0] === 'object') {
- spec.logInfo('getWidthAndHeightFromVideoObject found nested array inside playerSize.', playerSize[0]);
+ utils.logInfo('getWidthAndHeightFromVideoObject found nested array inside playerSize.', playerSize[0]);
playerSize = playerSize[0];
if (typeof playerSize[0] !== 'number' && typeof playerSize[0] !== 'string') {
- spec.logInfo('getWidthAndHeightFromVideoObject found non-number/string type inside the INNER array in playerSize. This is totally wrong - cannot continue.', playerSize[0]);
+ utils.logInfo('getWidthAndHeightFromVideoObject found non-number/string type inside the INNER array in playerSize. This is totally wrong - cannot continue.', playerSize[0]);
return null;
}
}
if (playerSize.length !== 2) {
- spec.logInfo('getWidthAndHeightFromVideoObject found playerSize with length of ' + playerSize.length + '. This is totally wrong - cannot continue.');
+ utils.logInfo('getWidthAndHeightFromVideoObject found playerSize with length of ' + playerSize.length + '. This is totally wrong - cannot continue.');
return null;
}
return ({'w': playerSize[0], 'h': playerSize[1]});
@@ -1041,17 +1158,17 @@ export function playerSizeIsNestedArray(objVideo) {
* @returns {*}
*/
function getPlayerSizeFromObject(objVideo) {
- spec.logInfo('getPlayerSizeFromObject received object', objVideo);
+ utils.logInfo('getPlayerSizeFromObject received object', objVideo);
let playerSize = utils.deepAccess(objVideo, 'playerSize');
if (!playerSize) {
playerSize = utils.deepAccess(objVideo, 'ext.playerSize');
}
if (!playerSize) {
- spec.logError('getPlayerSizeFromObject FAILED: no playerSize in video object or ext', objVideo);
+ utils.logError('getPlayerSizeFromObject FAILED: no playerSize in video object or ext', objVideo);
return null;
}
if (typeof playerSize !== 'object') {
- spec.logError('getPlayerSizeFromObject FAILED: playerSize is not an object/array', objVideo);
+ utils.logError('getPlayerSizeFromObject FAILED: playerSize is not an object/array', objVideo);
return null;
}
return playerSize;
@@ -1062,7 +1179,7 @@ function getPlayerSizeFromObject(objVideo) {
*/
function newRenderer(adUnitCode, rendererOptions = {}) {
let isLoaded = window.ozoneVideo;
- spec.logInfo(`newRenderer going to set loaded to ${isLoaded ? 'true' : 'false'}`);
+ utils.logInfo(`newRenderer going to set loaded to ${isLoaded ? 'true' : 'false'}`);
const renderer = Renderer.install({
url: spec.getRendererUrl(),
config: rendererOptions,
@@ -1072,12 +1189,12 @@ function newRenderer(adUnitCode, rendererOptions = {}) {
try {
renderer.setRender(outstreamRender);
} catch (err) {
- spec.logError('Prebid Error when calling setRender on renderer', JSON.parse(JSON.stringify(renderer)), err);
+ utils.logError('Prebid Error when calling setRender on renderer', JSON.parse(JSON.stringify(renderer)), err);
}
return renderer;
}
function outstreamRender(bid) {
- spec.logInfo('outstreamRender called. Going to push the call to window.ozoneVideo.outstreamRender(bid) bid =', JSON.parse(JSON.stringify(bid)));
+ utils.logInfo('outstreamRender called. Going to push the call to window.ozoneVideo.outstreamRender(bid) bid =', JSON.parse(JSON.stringify(bid)));
// push to render queue because ozoneVideo may not be loaded yet
bid.renderer.push(() => {
window.ozoneVideo.outstreamRender(bid);
diff --git a/modules/papyrusBidAdapter.js b/modules/papyrusBidAdapter.js
deleted file mode 100644
index a27c5cf618a..00000000000
--- a/modules/papyrusBidAdapter.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const PAPYRUS_ENDPOINT = 'https://prebid.papyrus.global';
-const PAPYRUS_CODE = 'papyrus';
-
-export const spec = {
- code: PAPYRUS_CODE,
-
- /**
- * Determines whether or not the given bid request is valid. Valid bid request must have placementId and hbid
- *
- * @param {BidRequest} bid The bid params to validate.
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: bid => {
- return !!(bid && bid.params && bid.params.address && bid.params.placementId);
- },
-
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} validBidRequests - an array of bids
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: function(validBidRequests) {
- const bidParams = [];
- utils._each(validBidRequests, function(bid) {
- bidParams.push({
- address: bid.params.address,
- placementId: bid.params.placementId,
- bidId: bid.bidId,
- transactionId: bid.transactionId,
- sizes: utils.parseSizesInput(bid.sizes)
- });
- });
-
- return {
- method: 'POST',
- url: PAPYRUS_ENDPOINT,
- data: bidParams
- };
- },
-
- /**
- * 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 = [];
-
- if (serverResponse && serverResponse.body && serverResponse.body.bids) {
- serverResponse.body.bids.forEach(bid => {
- const bidResponse = {
- requestId: bid.id,
- creativeId: bid.id,
- adId: bid.id,
- transactionId: bid.transactionId,
- cpm: bid.cpm,
- width: bid.width,
- height: bid.height,
- currency: bid.currency,
- netRevenue: true,
- ttl: 300,
- ad: bid.ad
- }
- bidResponses.push(bidResponse);
- });
- }
-
- return bidResponses;
- }
-};
-
-registerBidder(spec);
diff --git a/modules/parrableIdSystem.js b/modules/parrableIdSystem.js
index 36ac7070ec1..1d74061e544 100644
--- a/modules/parrableIdSystem.js
+++ b/modules/parrableIdSystem.js
@@ -5,6 +5,8 @@
* @requires module:modules/userId
*/
+// ci trigger: 1
+
import * as utils from '../src/utils.js'
import find from 'core-js-pure/features/array/find.js';
import { ajax } from '../src/ajax.js';
@@ -34,7 +36,7 @@ function deserializeParrableId(parrableIdStr) {
values.forEach(function(value) {
const pair = value.split(':');
- if (+pair[1] === 1 || (pair[1] !== null && +pair[1] === 0)) { // unpack a value of 0 or 1 as boolean
+ if (pair[0] === 'ccpaOptout' || pair[0] === 'ibaOptout') { // unpack a value of 0 or 1 as boolean
parrableId[pair[0]] = Boolean(+pair[1]);
} else if (!isNaN(pair[1])) { // convert to number if is a number
parrableId[pair[0]] = +pair[1]
@@ -64,6 +66,10 @@ function serializeParrableId(parrableIdAndParams) {
components.push(tpcSupportComponent);
components.push(tpcUntil);
}
+ if (parrableIdAndParams.filteredUntil) {
+ components.push(`filteredUntil:${parrableIdAndParams.filteredUntil}`);
+ components.push(`filterHits:${parrableIdAndParams.filterHits}`);
+ }
return components.join(',');
}
@@ -96,12 +102,20 @@ function readCookie() {
const parrableIdStr = storage.getCookie(PARRABLE_COOKIE_NAME);
if (parrableIdStr) {
const parsedCookie = deserializeParrableId(decodeURIComponent(parrableIdStr));
- const { tpc, tpcUntil, ...parrableId } = parsedCookie;
+ const { tpc, tpcUntil, filteredUntil, filterHits, ...parrableId } = parsedCookie;
let { eid, ibaOptout, ccpaOptout, ...params } = parsedCookie;
if ((Date.now() / 1000) >= tpcUntil) {
params.tpc = undefined;
}
+
+ if ((Date.now() / 1000) < filteredUntil) {
+ params.shouldFilter = true;
+ params.filteredUntil = filteredUntil;
+ } else {
+ params.shouldFilter = false;
+ params.filterHits = filterHits;
+ }
return { parrableId, params };
}
return null;
@@ -197,6 +211,11 @@ function epochFromTtl(ttl) {
return Math.floor((Date.now() / 1000) + ttl);
}
+function incrementFilterHits(parrableId, params) {
+ params.filterHits += 1;
+ writeCookie({ ...parrableId, ...params })
+}
+
function fetchId(configParams, gdprConsentData) {
if (!isValidConfig(configParams)) return;
@@ -212,7 +231,8 @@ function fetchId(configParams, gdprConsentData) {
const eid = parrableId ? parrableId.eid : null;
const refererInfo = getRefererInfo();
- const tpcSupport = params ? params.tpc : null
+ const tpcSupport = params ? params.tpc : null;
+ const shouldFilter = params ? params.shouldFilter : null;
const uspString = uspDataHandler.getConsentData();
const gdprApplies = (gdprConsentData && typeof gdprConsentData.gdprApplies === 'boolean' && gdprConsentData.gdprApplies);
const gdprConsentString = (gdprConsentData && gdprApplies && gdprConsentData.consentString) || '';
@@ -230,6 +250,10 @@ function fetchId(configParams, gdprConsentData) {
tpcSupport
};
+ if (shouldFilter === false) {
+ data.filterHits = params.filterHits;
+ }
+
const searchParams = {
data: encodeBase64UrlSafe(btoa(JSON.stringify(data))),
gdpr: gdprApplies ? 1 : 0,
@@ -271,6 +295,10 @@ function fetchId(configParams, gdprConsentData) {
newParams.tpcSupport = responseObj.tpcSupport;
newParams.tpcUntil = epochFromTtl(responseObj.tpcSupportTtl);
}
+ if (responseObj.filterTtl) {
+ newParams.filteredUntil = epochFromTtl(responseObj.filterTtl);
+ newParams.filterHits = 0;
+ }
}
} catch (error) {
utils.logError(error);
@@ -288,7 +316,12 @@ function fetchId(configParams, gdprConsentData) {
cb();
}
};
- ajax(PARRABLE_URL, callbacks, searchParams, options);
+
+ if (shouldFilter) {
+ incrementFilterHits(parrableId, params);
+ } else {
+ ajax(PARRABLE_URL, callbacks, searchParams, options);
+ }
};
return {
diff --git a/modules/performaxBidAdapter.js b/modules/performaxBidAdapter.js
deleted file mode 100644
index 8e22a0b2da9..00000000000
--- a/modules/performaxBidAdapter.js
+++ /dev/null
@@ -1,56 +0,0 @@
-import {logWarn} from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const CLIENT = 'hellboy:v0.0.1'
-const BIDDER_CODE = 'performax';
-const BIDDER_SHORT_CODE = 'px';
-const ENDPOINT = 'https://dale.performax.cz/hb';
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: [BIDDER_SHORT_CODE],
-
- isBidRequestValid: function (bid) {
- return !!bid.params.slotId;
- },
-
- buildUrl: function (validBidRequests, bidderRequest) {
- const slotIds = validBidRequests.map(request => request.params.slotId);
- let url = [`${ENDPOINT}?slotId[]=${slotIds.join()}`];
- url.push('client=' + CLIENT);
- url.push('auctionId=' + bidderRequest.auctionId);
- return url.join('&');
- },
-
- buildRequests: function (validBidRequests, bidderRequest) {
- return {
- method: 'POST',
- url: this.buildUrl(validBidRequests, bidderRequest),
- data: {'validBidRequests': validBidRequests, 'bidderRequest': bidderRequest},
- options: {contentType: 'application/json'},
- }
- },
-
- buildHtml: function (ad) {
- const keys = Object.keys(ad.data || {});
- return ad.code.replace(
- new RegExp('\\$(' + keys.join('|') + ')\\$', 'g'),
- (matched, key) => ad.data[key] || matched
- );
- },
-
- interpretResponse: function (serverResponse, request) {
- let bidResponses = [];
- for (let i = 0; i < serverResponse.body.length; i++) {
- const ad = serverResponse.body[i].ad;
- if (ad.type === 'empty') {
- logWarn(`One of ads is empty (reason=${ad.reason})`);
- continue;
- }
- serverResponse.body[i].ad = this.buildHtml(ad);
- bidResponses.push(serverResponse.body[i]);
- }
- return bidResponses;
- }
-}
-registerBidder(spec);
diff --git a/modules/permutiveRtdProvider.js b/modules/permutiveRtdProvider.js
index 91e88d3e4e1..40282567506 100644
--- a/modules/permutiveRtdProvider.js
+++ b/modules/permutiveRtdProvider.js
@@ -9,35 +9,33 @@ import { getGlobal } from '../src/prebidGlobal.js'
import { submodule } from '../src/hook.js'
import { getStorageManager } from '../src/storageManager.js'
import { deepSetValue, deepAccess, isFn, mergeDeep, logError } from '../src/utils.js'
+import { config } from '../src/config.js'
import includes from 'core-js-pure/features/array/includes.js'
const MODULE_NAME = 'permutive'
export const storage = getStorageManager(null, MODULE_NAME)
-function init (config, userConsent) {
+function init (moduleConfig, userConsent) {
return true
}
/**
-* Set segment targeting from cache and then try to wait for Permutive
-* to initialise to get realtime segment targeting
-*/
-export function initSegments (reqBidsConfigObj, callback, customConfig) {
+ * Set segment targeting from cache and then try to wait for Permutive
+ * to initialise to get realtime segment targeting
+ * @param {Object} reqBidsConfigObj
+ * @param {function} callback - Called when submodule is done
+ * @param {customModuleConfig} reqBidsConfigObj - Publisher config for module
+ */
+export function initSegments (reqBidsConfigObj, callback, customModuleConfig) {
const permutiveOnPage = isPermutiveOnPage()
- const config = mergeDeep({
- waitForIt: false,
- params: {
- maxSegs: 500,
- acBidders: [],
- overwrites: {}
- }
- }, customConfig)
+ const moduleConfig = getModuleConfig(customModuleConfig)
+ const segmentData = getSegments(moduleConfig.params.maxSegs)
- setSegments(reqBidsConfigObj, config)
+ setSegments(reqBidsConfigObj, moduleConfig, segmentData)
- if (config.waitForIt && permutiveOnPage) {
+ if (moduleConfig.waitForIt && permutiveOnPage) {
window.permutive.ready(function () {
- setSegments(reqBidsConfigObj, config)
+ setSegments(reqBidsConfigObj, moduleConfig, segmentData)
callback()
}, 'realtime')
} else {
@@ -45,27 +43,107 @@ export function initSegments (reqBidsConfigObj, callback, customConfig) {
}
}
-function setSegments (reqBidsConfigObj, config) {
- const adUnits = reqBidsConfigObj.adUnits || getGlobal().adUnits
- const data = getSegments(config.params.maxSegs)
+/**
+ * Merges segments into existing bidder config
+ * @param {Object} customModuleConfig - Publisher config for module
+ * @return {Object} Merged defatul and custom config
+ */
+function getModuleConfig (customModuleConfig) {
+ return mergeDeep({
+ waitForIt: false,
+ params: {
+ maxSegs: 500,
+ acBidders: [],
+ overwrites: {}
+ }
+ }, customModuleConfig)
+}
+
+/**
+ * Sets ortb2 config for ac bidders
+ * @param {Object} auctionDetails
+ * @param {Object} customModuleConfig - Publisher config for module
+ */
+export function setBidderRtb (auctionDetails, customModuleConfig) {
+ const bidderConfig = config.getBidderConfig()
+ const moduleConfig = getModuleConfig(customModuleConfig)
+ const acBidders = deepAccess(moduleConfig, 'params.acBidders')
+ const maxSegs = deepAccess(moduleConfig, 'params.maxSegs')
+ const segmentData = getSegments(maxSegs)
+
+ acBidders.forEach(function (bidder) {
+ const currConfig = bidderConfig[bidder] || {}
+ const nextConfig = mergeOrtbConfig(currConfig, segmentData)
+
+ config.setBidderConfig({
+ bidders: [bidder],
+ config: nextConfig
+ })
+ })
+}
+
+/**
+ * Merges segments into existing bidder config
+ * @param {Object} currConfig - Current bidder config
+ * @param {Object} segmentData - Segment data
+ * @return {Object} Merged ortb2 object
+ */
+function mergeOrtbConfig (currConfig, segmentData) {
+ const segment = segmentData.ac.map(seg => {
+ return { id: seg }
+ })
+ const name = 'permutive.com'
+ const ortbConfig = mergeDeep({}, currConfig)
+ const currSegments = deepAccess(ortbConfig, 'ortb2.user.data') || []
+ const userSegment = currSegments
+ .filter(el => el.name !== name)
+ .concat({ name, segment })
+
+ deepSetValue(ortbConfig, 'ortb2.user.data', userSegment)
+
+ return ortbConfig
+}
+
+/**
+ * Set segments on bid request object
+ * @param {Object} reqBidsConfigObj - Bid request object
+ * @param {Object} moduleConfig - Module configuration
+ * @param {Object} segmentData - Segment object
+ */
+function setSegments (reqBidsConfigObj, moduleConfig, segmentData) {
+ const adUnits = (reqBidsConfigObj && reqBidsConfigObj.adUnits) || getGlobal().adUnits
const utils = { deepSetValue, deepAccess, isFn, mergeDeep }
+ const aliasMap = {
+ appnexusAst: 'appnexus'
+ }
+
+ if (!adUnits) {
+ return
+ }
adUnits.forEach(adUnit => {
adUnit.bids.forEach(bid => {
- const { bidder } = bid
- const acEnabled = isAcEnabled(config, bidder)
- const customFn = getCustomBidderFn(config, bidder)
+ let { bidder } = bid
+ if (typeof aliasMap[bidder] !== 'undefined') {
+ bidder = aliasMap[bidder]
+ }
+ const acEnabled = isAcEnabled(moduleConfig, bidder)
+ const customFn = getCustomBidderFn(moduleConfig, bidder)
const defaultFn = getDefaultBidderFn(bidder)
if (customFn) {
- customFn(bid, data, acEnabled, utils, defaultFn)
+ customFn(bid, segmentData, acEnabled, utils, defaultFn)
} else if (defaultFn) {
- defaultFn(bid, data, acEnabled)
+ defaultFn(bid, segmentData, acEnabled)
}
})
})
}
+/**
+ * Catch and log errors
+ * @param {function} fn - Function to safely evaluate
+ */
function makeSafe (fn) {
try {
fn()
@@ -74,8 +152,8 @@ function makeSafe (fn) {
}
}
-function getCustomBidderFn (config, bidder) {
- const overwriteFn = deepAccess(config, `params.overwrites.${bidder}`)
+function getCustomBidderFn (moduleConfig, bidder) {
+ const overwriteFn = deepAccess(moduleConfig, `params.overwrites.${bidder}`)
if (overwriteFn && isFn(overwriteFn)) {
return overwriteFn
@@ -85,13 +163,13 @@ function getCustomBidderFn (config, bidder) {
}
/**
-* Returns a function that receives a `bid` object, a `data` object and a `acEnabled` boolean
-* and which will set the right segment targeting keys for `bid` based on `data` and `acEnabled`
-* @param {string} bidder
-* @param {object} data
-*/
+ * Returns a function that receives a `bid` object, a `data` object and a `acEnabled` boolean
+ * and which will set the right segment targeting keys for `bid` based on `data` and `acEnabled`
+ * @param {string} bidder - Bidder name
+ * @return {Object} Bidder function
+ */
function getDefaultBidderFn (bidder) {
- const bidderMapper = {
+ const bidderMap = {
appnexus: function (bid, data, acEnabled) {
if (acEnabled && data.ac && data.ac.length) {
deepSetValue(bid, 'params.keywords.p_standard', data.ac)
@@ -117,32 +195,37 @@ function getDefaultBidderFn (bidder) {
deepSetValue(bid, 'params.customData.0.targeting.p_standard', data.ac)
}
- return bid
- },
- trustx: function (bid, data, acEnabled) {
- if (acEnabled && data.ac && data.ac.length) {
- deepSetValue(bid, 'params.keywords.p_standard', data.ac)
- }
-
return bid
}
}
- return bidderMapper[bidder]
+ return bidderMap[bidder]
}
-export function isAcEnabled (config, bidder) {
- const acBidders = deepAccess(config, 'params.acBidders') || []
+/**
+ * Check whether ac is enabled for bidder
+ * @param {Object} moduleConfig - Module configuration
+ * @param {string} bidder - Bidder name
+ * @return {boolean}
+ */
+export function isAcEnabled (moduleConfig, bidder) {
+ const acBidders = deepAccess(moduleConfig, 'params.acBidders') || []
return includes(acBidders, bidder)
}
+/**
+ * Check whether Permutive is on page
+ * @return {boolean}
+ */
export function isPermutiveOnPage () {
return typeof window.permutive !== 'undefined' && typeof window.permutive.ready === 'function'
}
/**
-* Returns all relevant segment IDs in an object
-*/
+ * Get all relevant segment IDs in an object
+ * @param {number} maxSegs - Maximum number of segments to be included
+ * @return {Object}
+ */
export function getSegments (maxSegs) {
const legacySegs = readSegments('_psegs').map(Number).filter(seg => seg >= 1000000).map(String)
const _ppam = readSegments('_ppam')
@@ -166,6 +249,7 @@ export function getSegments (maxSegs) {
* Gets an array of segment IDs from LocalStorage
* or returns an empty array
* @param {string} key
+ * @return {string[]|number[]}
*/
function readSegments (key) {
try {
@@ -178,9 +262,16 @@ function readSegments (key) {
/** @type {RtdSubmodule} */
export const permutiveSubmodule = {
name: MODULE_NAME,
- getBidRequestData: function (reqBidsConfigObj, callback, customConfig) {
+ getBidRequestData: function (reqBidsConfigObj, callback, customModuleConfig) {
+ makeSafe(function () {
+ // Legacy route with custom parameters
+ initSegments(reqBidsConfigObj, callback, customModuleConfig)
+ })
+ },
+ onAuctionInitEvent: function (auctionDetails, customModuleConfig) {
makeSafe(function () {
- initSegments(reqBidsConfigObj, callback, customConfig)
+ // Route for bidders supporting ORTB2
+ setBidderRtb(auctionDetails, customModuleConfig)
})
},
init: init
diff --git a/modules/permutiveRtdProvider.md b/modules/permutiveRtdProvider.md
index 39f9a2aaaa5..0acd42405d1 100644
--- a/modules/permutiveRtdProvider.md
+++ b/modules/permutiveRtdProvider.md
@@ -1,5 +1,5 @@
# Permutive Real-time Data Submodule
-This submodule reads segments from Permutive and attaches them as targeting keys to bid requests. Using this module will deliver best targeting results, leveraging Permutive's real-time segmentation and modelling capabilities.
+This submodule reads cohorts from Permutive and attaches them as targeting keys to bid requests. Using this module will deliver best targeting results, leveraging Permutive's real-time segmentation and modelling capabilities.
## Usage
Compile the Permutive RTD module into your Prebid build:
@@ -29,18 +29,18 @@ pbjs.setConfig({
```
## Supported Bidders
-The below bidders are currently support by the Permutive RTD module. Please reach out to your Permutive Account Manager to request support for any additional bidders.
+The Permutive RTD module sets Audience Connector cohorts as bidder-specific `ortb2.user.data` first-party data, following the Prebid `ortb2` convention, for any bidder included in `acBidders`. The module also supports bidder-specific data locations per ad unit (custom parameters) for the below bidders:
-| Bidder | ID | Custom First-Party Segments | Audience Connector ("acBidders") |
+| Bidder | ID | Custom Cohorts | Audience Connector |
| ----------- | ---------- | -------------------- | ------------------ |
| Xandr | `appnexus` | Yes | Yes |
-| Magnite | `rubicon` | Yes | No |
+| Magnite | `rubicon` | Yes | No |
| Ozone | `ozone` | No | Yes |
-| TrustX | `trustx` | No | Yes |
-* **First-party segments:** When enabling the respective Activation for a segment in Permutive, this module will automatically attach that segment to the bid request. There is no need to enable individual bidders in the module configuration, it will automatically reflect which SSP integrations you have enabled in Permutive. Permutive segments will be sent in the `permutive` key-value.
+Key-values details for custom parameters:
+* **Custom Cohorts:** When enabling the respective Activation for a cohort in Permutive, this module will automatically attach that cohort ID to the bid request. There is no need to enable individual bidders in the module configuration, it will automatically reflect which SSP integrations you have enabled in your Permutive dashboard. Permutive cohorts will be sent in the `permutive` key-value.
-* **Audience Connector:** You'll need to define which bidder should receive Audience Connector segments. You need to include the `ID` of any bidder in the `acBidders` array. Audience Connector segments will be sent in the `p_standard` key-value. The segments produced by Audience Connector are not supported for PMPs at this time.
+* **Audience Connector:** You'll need to define which bidders should receive Audience Connector cohorts. You need to include the `ID` of any bidder in the `acBidders` array. Audience Connector cohorts will be sent in the `p_standard` key-value.
## Parameters
@@ -49,55 +49,5 @@ The below bidders are currently support by the Permutive RTD module. Please reac
| name | String | This should always be `permutive` | - |
| waitForIt | Boolean | Should be `true` if there's an `auctionDelay` defined (optional) | `false` |
| params | Object | | - |
-| params.acBidders | String[] | An array of bidders which should receive AC segments. Pleasee see `Supported Bidders` for bidder support and possible values. | `[]` |
-| params.maxSegs | Integer | Maximum number of segments to be included in either the `permutive` or `p_standard` key-value. | `500` |
-| params.overwrites | Object | See `Custom Bidder Setup` for details on how to define custom bidder functions. | `{}` |
-
-
-## Custom Bidder Setup
-You can overwrite the default bidder function, for example to include a different set of segments or to support additional bidders. The below example modifies what first-party segments Magnite receives (segments from `gam` instead of `rubicon`). As best practise we recommend to first call `defaultFn` and then only overwrite specific key-values. The below example only overwrites `permutive` while `p_standard` are still set by `defaultFn` (if `rubicon` is an enabled `acBidder`).
-
-```javascript
-pbjs.setConfig({
- ...,
- realTimeData: {
- auctionDelay: 50,
- dataProviders: [{
- name: 'permutive',
- waitForIt: true,
- params: {
- acBidders: ['appnexus'],
- maxSegs: 450,
- overwrites: {
- rubicon: function (bid, data, acEnabled, utils, defaultFn) {
- if (defaultFn){
- bid = defaultFn(bid, data, acEnabled)
- }
- if (data.gam && data.gam.length) {
- utils.deepSetValue(bid, 'params.visitor.permutive', data.gam)
- }
- }
- }
- }
- }]
- },
- ...
-})
-```
-Any custom bidder function will receive the following parameters:
-
-| Name | Type | Description |
-| ------------- |-------------- | --------------------------------------- |
-| bid | Object | The bidder specific bidder object. You will mutate this object to set the appropriate targeting keys. |
-| data | Object | An object containing Permutive segments |
-| data.appnexus | string[] | Segments exposed by the Xandr SSP integration |
-| data.rubicon | string[] | Segments exposed by the Magnite SSP integration |
-| data.gam | string[] | Segments exposed by the Google Ad Manager integration |
-| data.ac | string[] | Segments exposed by the Audience Connector |
-| acEnabled | Boolean | `true` if the current bidder in included in `params.acBidders` |
-| utils | {} | An object containing references to various util functions used by `permutiveRtdProvider.js`. Please make sure not to overwrite any of these. |
-| defaultFn | Function | The default function for this bidder. Please note that this can be `undefined` if there is no default function for this bidder (see `Supported Bidders`). The function expect the following parameters: `bid`, `data`, `acEnabled` and will return `bid`. |
-
-**Warning**
-
-The custom bidder function will mutate the `bid` object. Please be aware that this could break your bid request if you accidentally overwrite any fields other than the `permutive` or `p_standard` key-values or if you change the structure of the `bid` object in any way.
+| params.acBidders | String[] | An array of bidders which should receive AC cohorts. | `[]` |
+| params.maxSegs | Integer | Maximum number of cohorts to be included in either the `permutive` or `p_standard` key-value. | `500` |
diff --git a/modules/pixfutureBidAdapter.js b/modules/pixfutureBidAdapter.js
new file mode 100644
index 00000000000..edf6a35e997
--- /dev/null
+++ b/modules/pixfutureBidAdapter.js
@@ -0,0 +1,323 @@
+import { registerBidder } from '../src/adapters/bidderFactory.js';
+import { getStorageManager } from '../src/storageManager.js';
+import { BANNER } from '../src/mediaTypes.js';
+import { config } from '../src/config.js';
+import includes from 'core-js-pure/features/array/includes.js';
+import * as utils from '../src/utils.js';
+import { auctionManager } from '../src/auctionManager.js';
+import find from 'core-js-pure/features/array/find.js';
+
+const SOURCE = 'pbjs';
+const storageManager = getStorageManager();
+const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language'];
+export const spec = {
+ code: 'pixfuture',
+ hostname: 'https://prebid-js.pixfuture.com',
+
+ getHostname() {
+ let ret = this.hostname;
+ try {
+ ret = storageManager.getDataFromLocalStorage('ov_pixbidder_host') || ret;
+ } catch (e) {
+ }
+ return ret;
+ },
+
+ isBidRequestValid(bid) {
+ return !!(bid.sizes && bid.bidId && bid.params &&
+ (bid.params.pix_id && (typeof bid.params.pix_id === 'string')));
+ },
+
+ buildRequests(validBidRequests, bidderRequest) {
+ const tags = validBidRequests.map(bidToTag);
+ const hostname = this.getHostname();
+ return validBidRequests.map((bidRequest) => {
+ let referer = '';
+ if (bidderRequest && bidderRequest.refererInfo) {
+ referer = bidderRequest.refererInfo.referer || '';
+ }
+
+ const userObjBid = find(validBidRequests, hasUserInfo);
+ let userObj = {};
+ if (config.getConfig('coppa') === true) {
+ userObj = {'coppa': true};
+ }
+
+ if (userObjBid) {
+ Object.keys(userObjBid.params.user)
+ .filter(param => includes(USER_PARAMS, param))
+ .forEach((param) => {
+ let uparam = utils.convertCamelToUnderscore(param);
+ if (param === 'segments' && utils.isArray(userObjBid.params.user[param])) {
+ let segs = [];
+ userObjBid.params.user[param].forEach(val => {
+ if (utils.isNumber(val)) {
+ segs.push({'id': val});
+ } else if (utils.isPlainObject(val)) {
+ segs.push(val);
+ }
+ });
+ userObj[uparam] = segs;
+ } else if (param !== 'segments') {
+ userObj[uparam] = userObjBid.params.user[param];
+ }
+ });
+ }
+
+ const schain = validBidRequests[0].schain;
+
+ const payload = {
+ tags: [...tags],
+ user: userObj,
+ sdk: {
+ source: SOURCE,
+ version: '$prebid.version$'
+ },
+ schain: schain
+ };
+
+ if (bidderRequest && bidderRequest.uspConsent) {
+ payload.us_privacy = bidderRequest.uspConsent
+ }
+
+ if (bidderRequest && bidderRequest.refererInfo) {
+ let refererinfo = {
+ rd_ref: encodeURIComponent(bidderRequest.refererInfo.referer),
+ rd_top: bidderRequest.refererInfo.reachedTop,
+ rd_ifs: bidderRequest.refererInfo.numIframes,
+ rd_stk: bidderRequest.refererInfo.stack.map((url) => encodeURIComponent(url)).join(',')
+ };
+ payload.referrer_detection = refererinfo;
+ }
+
+ if (validBidRequests[0].userId) {
+ let eids = [];
+
+ addUserId(eids, utils.deepAccess(validBidRequests[0], `userId.flocId.id`), 'chrome.com', null);
+ addUserId(eids, utils.deepAccess(validBidRequests[0], `userId.criteoId`), 'criteo.com', null);
+ addUserId(eids, utils.deepAccess(validBidRequests[0], `userId.unifiedId`), 'thetradedesk.com', null);
+ addUserId(eids, utils.deepAccess(validBidRequests[0], `userId.id5Id`), 'id5.io', null);
+ addUserId(eids, utils.deepAccess(validBidRequests[0], `userId.sharedId`), 'thetradedesk.com', null);
+ addUserId(eids, utils.deepAccess(validBidRequests[0], `userId.identityLink`), 'liveramp.com', null);
+ addUserId(eids, utils.deepAccess(validBidRequests[0], `userId.liveIntentId`), 'liveintent.com', null);
+ addUserId(eids, utils.deepAccess(validBidRequests[0], `userId.fabrickId`), 'home.neustar', null);
+
+ if (eids.length) {
+ payload.eids = eids;
+ }
+ }
+
+ if (tags[0].publisher_id) {
+ payload.publisher_id = tags[0].publisher_id;
+ }
+
+ const ret = {
+ url: `${hostname}/auc/auc.php`,
+ method: 'POST',
+ options: {withCredentials: false},
+ data: {
+ v: $$PREBID_GLOBAL$$.version,
+ pageUrl: referer,
+ bidId: bidRequest.bidId,
+ auctionId: bidRequest.auctionId,
+ transactionId: bidRequest.transactionId,
+ adUnitCode: bidRequest.adUnitCode,
+ bidRequestCount: bidRequest.bidRequestCount,
+ sizes: bidRequest.sizes,
+ params: bidRequest.params,
+ pubext: payload
+ }
+ };
+ if (bidderRequest && bidderRequest.gdprConsent) {
+ ret.data.gdprConsent = {
+ consentString: bidderRequest.gdprConsent.consentString,
+ consentRequired: (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') && bidderRequest.gdprConsent.gdprApplies
+ };
+ }
+ return ret;
+ });
+ },
+
+ interpretResponse: function (serverResponse, { bidderRequest }) {
+ serverResponse = serverResponse.body;
+ const bids = [];
+ if (serverResponse.creatives.bids && serverResponse.placements) {
+ serverResponse.placements.forEach(serverBid => {
+ serverBid.creatives.forEach(creative => {
+ const bid = newBid(serverBid, creative, serverBid.placement_id, serverBid.uuid);
+ bid.mediaType = BANNER;
+ bids.push(bid);
+ });
+ });
+ }
+
+ return bids;
+ },
+};
+
+function newBid(serverBid, rtbBid, placementId, uuid) {
+ const bid = {
+ requestId: uuid,
+ cpm: rtbBid.cpm,
+ creativeId: rtbBid.creative_id,
+ currency: 'USD',
+ netRevenue: true,
+ ttl: 300,
+ adUnitCode: placementId
+ };
+
+ if (rtbBid.adomain) {
+ bid.meta = Object.assign({}, bid.meta, { advertiserDomains: [rtbBid.adomain] });
+ };
+
+ Object.assign(bid, {
+ width: rtbBid.width,
+ height: rtbBid.height,
+ ad: rtbBid.code
+ });
+
+ return bid;
+}
+
+// Functions related optional parameters
+function bidToTag(bid) {
+ const tag = {};
+ tag.sizes = transformSizes(bid.sizes);
+ tag.primary_size = tag.sizes[0];
+ tag.ad_types = [];
+ tag.uuid = bid.bidId;
+ if (bid.params.placementId) {
+ tag.id = parseInt(bid.params.placementId, 10);
+ } else {
+ tag.code = bid.params.invCode;
+ }
+ tag.allow_smaller_sizes = bid.params.allowSmallerSizes || false;
+ tag.use_pmt_rule = bid.params.usePaymentRule || false
+ tag.prebid = true;
+ tag.disable_psa = true;
+ let bidFloor = getBidFloor(bid);
+ if (bidFloor) {
+ tag.reserve = bidFloor;
+ }
+ if (bid.params.position) {
+ tag.position = {'above': 1, 'below': 2}[bid.params.position] || 0;
+ }
+ if (bid.params.trafficSourceCode) {
+ tag.traffic_source_code = bid.params.trafficSourceCode;
+ }
+ if (bid.params.privateSizes) {
+ tag.private_sizes = transformSizes(bid.params.privateSizes);
+ }
+ if (bid.params.supplyType) {
+ tag.supply_type = bid.params.supplyType;
+ }
+ if (bid.params.pubClick) {
+ tag.pubclick = bid.params.pubClick;
+ }
+ if (bid.params.extInvCode) {
+ tag.ext_inv_code = bid.params.extInvCode;
+ }
+ if (bid.params.publisherId) {
+ tag.publisher_id = parseInt(bid.params.publisherId, 10);
+ }
+ if (bid.params.externalImpId) {
+ tag.external_imp_id = bid.params.externalImpId;
+ }
+ if (!utils.isEmpty(bid.params.keywords)) {
+ let keywords = utils.transformBidderParamKeywords(bid.params.keywords);
+
+ if (keywords.length > 0) {
+ keywords.forEach(deleteValues);
+ }
+ tag.keywords = keywords;
+ }
+
+ let gpid = utils.deepAccess(bid, 'ortb2Imp.ext.data.pbadslot');
+ if (gpid) {
+ tag.gpid = gpid;
+ }
+
+ if (bid.renderer) {
+ tag.video = Object.assign({}, tag.video, {custom_renderer_present: true});
+ }
+
+ if (bid.params.frameworks && utils.isArray(bid.params.frameworks)) {
+ tag['banner_frameworks'] = bid.params.frameworks;
+ }
+
+ let adUnit = find(auctionManager.getAdUnits(), au => bid.transactionId === au.transactionId);
+ if (adUnit && adUnit.mediaTypes && adUnit.mediaTypes.banner) {
+ tag.ad_types.push(BANNER);
+ }
+
+ if (tag.ad_types.length === 0) {
+ delete tag.ad_types;
+ }
+
+ return tag;
+}
+
+function addUserId(eids, id, source, rti) {
+ if (id) {
+ if (rti) {
+ eids.push({source, id, rti_partner: rti});
+ } else {
+ eids.push({source, id});
+ }
+ }
+ return eids;
+}
+
+function hasUserInfo(bid) {
+ return !!bid.params.user;
+}
+
+function transformSizes(requestSizes) {
+ let sizes = [];
+ let sizeObj = {};
+
+ if (utils.isArray(requestSizes) && requestSizes.length === 2 &&
+ !utils.isArray(requestSizes[0])) {
+ sizeObj.width = parseInt(requestSizes[0], 10);
+ sizeObj.height = parseInt(requestSizes[1], 10);
+ sizes.push(sizeObj);
+ } else if (typeof requestSizes === 'object') {
+ for (let i = 0; i < requestSizes.length; i++) {
+ let size = requestSizes[i];
+ sizeObj = {};
+ sizeObj.width = parseInt(size[0], 10);
+ sizeObj.height = parseInt(size[1], 10);
+ sizes.push(sizeObj);
+ }
+ }
+
+ return sizes;
+}
+
+function getBidFloor(bid) {
+ if (!utils.isFn(bid.getFloor)) {
+ return (bid.params.reserve) ? bid.params.reserve : null;
+ }
+
+ let floor = bid.getFloor({
+ currency: 'USD',
+ mediaType: '*',
+ size: '*'
+ });
+ if (utils.isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'USD') {
+ return floor.floor;
+ }
+ return null;
+}
+
+function deleteValues(keyPairObj) {
+ if (isPopulatedArray(keyPairObj.value) && keyPairObj.value[0] === '') {
+ delete keyPairObj.value;
+ }
+}
+
+function isPopulatedArray(arr) {
+ return !!(utils.isArray(arr) && arr.length > 0);
+}
+
+registerBidder(spec);
diff --git a/modules/pixfutureBidAdapter.md b/modules/pixfutureBidAdapter.md
new file mode 100644
index 00000000000..e5728ededc6
--- /dev/null
+++ b/modules/pixfutureBidAdapter.md
@@ -0,0 +1,27 @@
+# Overview
+
+```
+Module Name: PixFuture Bid Adapter
+Module Type: Bidder Adapter
+Maintainer: admin@pixfuture.net
+```
+# Description
+
+Module that connects to PixFuture demand sources
+
+# Test Parameters
+```
+var adUnits = [{
+ "bidderCode": "pixfuture",
+ "auctionId": "634c9d0e-306f-4a5c-974e-21697dfd4fcd",
+ "bidderRequestId": "5f85993da0f6be",
+ "bids": [
+ {
+ "labelAny": [
+ "display"
+ ],
+ "bidder": "pixfuture",
+ "params": {
+ "pix_id": "Abc123"
+ }];
+```
diff --git a/modules/piximediaBidAdapter.js b/modules/piximediaBidAdapter.js
deleted file mode 100644
index 2617cc8fe42..00000000000
--- a/modules/piximediaBidAdapter.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'piximedia';
-const ENDPOINT = 'https://ad.piximedia.com/prebid';
-
-export const spec = {
- code: BIDDER_CODE,
- isBidRequestValid: function(bid) {
- return !!(bid.params && bid.params.siteId && bid.params.placementId);
- },
- buildRequests: function(validBidRequests) {
- return validBidRequests.map(bidRequest => {
- let parseSized = utils.parseSizesInput(bidRequest.sizes);
- let arrSize = parseSized[0].split('x');
- return {
- method: 'GET',
- url: ENDPOINT,
- data: {
- timestamp: utils.timestamp(),
- pver: '1.0',
- pbparams: JSON.stringify(bidRequest.params),
- pbsizes: JSON.stringify(parseSized),
- pbwidth: arrSize[0],
- pbheight: arrSize[1],
- pbbidid: bidRequest.bidId,
- },
- };
- });
- },
- interpretResponse: function(serverResponse, request) {
- const res = serverResponse.body;
- const bidResponse = {
- requestId: res.bidId,
- cpm: parseFloat(res.cpm),
- width: res.width,
- height: res.height,
- creativeId: res.creative_id,
- currency: res.currency,
- netRevenue: true,
- ttl: 300,
- ad: res.adm
- };
- return [bidResponse];
- }
-}
-registerBidder(spec);
diff --git a/modules/platformioBidAdapter.js b/modules/platformioBidAdapter.js
deleted file mode 100644
index 314f738ef81..00000000000
--- a/modules/platformioBidAdapter.js
+++ /dev/null
@@ -1,307 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import includes from 'core-js-pure/features/array/includes.js';
-
-const NATIVE_DEFAULTS = {
- TITLE_LEN: 100,
- DESCR_LEN: 200,
- SPONSORED_BY_LEN: 50,
- IMG_MIN: 150,
- ICON_MIN: 50,
-};
-const DEFAULT_MIMES = ['video/mp4', 'video/webm', 'application/x-shockwave-flash', 'application/javascript'];
-const VIDEO_TARGETING = ['mimes', 'skippable', 'playback_method', 'protocols', 'api'];
-const DEFAULT_PROTOCOLS = [2, 3, 5, 6];
-const DEFAULT_APIS = [1, 2];
-
-export const spec = {
-
- code: 'platformio',
- supportedMediaTypes: ['banner', 'native', 'video'],
-
- isBidRequestValid: bid => (
- !!(bid && bid.params && bid.params.pubId && bid.params.placementId)
- ),
- buildRequests: (bidRequests, bidderRequest) => {
- const request = {
- id: bidRequests[0].bidderRequestId,
- at: 2,
- imp: bidRequests.map(slot => impression(slot)),
- site: site(bidRequests),
- app: app(bidRequests),
- device: device(bidRequests),
- };
- applyGdpr(bidderRequest, request);
- return {
- method: 'POST',
- url: 'https://piohbdisp.hb.adx1.com/',
- data: JSON.stringify(request),
- };
- },
- interpretResponse: (response, request) => (
- bidResponseAvailable(request, response.body)
- ),
-};
-
-function bidResponseAvailable(bidRequest, bidResponse) {
- const idToImpMap = {};
- const idToBidMap = {};
- const ortbRequest = parse(bidRequest.data);
- ortbRequest.imp.forEach(imp => {
- idToImpMap[imp.id] = imp;
- });
- if (bidResponse) {
- bidResponse.seatbid.forEach(seatBid => seatBid.bid.forEach(bid => {
- idToBidMap[bid.impid] = bid;
- }));
- }
- const bids = [];
- Object.keys(idToImpMap).forEach(id => {
- if (idToBidMap[id]) {
- const bid = {};
- bid.requestId = id;
- bid.adId = id;
- bid.creativeId = id;
- bid.cpm = idToBidMap[id].price;
- bid.currency = bidResponse.cur;
- bid.ttl = 360;
- bid.netRevenue = true;
- if (idToImpMap[id]['native']) {
- bid['native'] = nativeResponse(idToImpMap[id], idToBidMap[id]);
- let nurl = idToBidMap[id].nurl;
- nurl = nurl.replace(/\$(%7B|\{)AUCTION_IMP_ID(%7D|\})/gi, idToBidMap[id].impid);
- nurl = nurl.replace(/\$(%7B|\{)AUCTION_PRICE(%7D|\})/gi, idToBidMap[id].price);
- nurl = nurl.replace(/\$(%7B|\{)AUCTION_CURRENCY(%7D|\})/gi, bidResponse.cur);
- nurl = nurl.replace(/\$(%7B|\{)AUCTION_BID_ID(%7D|\})/gi, bidResponse.bidid);
- bid['native']['impressionTrackers'] = [nurl];
- bid.mediaType = 'native';
- } else if (idToImpMap[id]['video']) {
- bid.vastUrl = idToBidMap[id].adm;
- bid.vastUrl = bid.vastUrl.replace(/\$(%7B|\{)AUCTION_PRICE(%7D|\})/gi, idToBidMap[id].price);
- bid.crid = idToBidMap[id].crid;
- bid.width = idToImpMap[id].video.w;
- bid.height = idToImpMap[id].video.h;
- bid.mediaType = 'video';
- } else if (idToImpMap[id]['banner']) {
- bid.ad = idToBidMap[id].adm;
- bid.ad = bid.ad.replace(/\$(%7B|\{)AUCTION_IMP_ID(%7D|\})/gi, idToBidMap[id].impid);
- bid.ad = bid.ad.replace(/\$(%7B|\{)AUCTION_AD_ID(%7D|\})/gi, idToBidMap[id].adid);
- bid.ad = bid.ad.replace(/\$(%7B|\{)AUCTION_PRICE(%7D|\})/gi, idToBidMap[id].price);
- bid.ad = bid.ad.replace(/\$(%7B|\{)AUCTION_CURRENCY(%7D|\})/gi, bidResponse.cur);
- bid.ad = bid.ad.replace(/\$(%7B|\{)AUCTION_BID_ID(%7D|\})/gi, bidResponse.bidid);
- bid.width = idToBidMap[id].w;
- bid.height = idToBidMap[id].h;
- bid.mediaType = 'banner';
- }
- bids.push(bid);
- }
- });
- return bids;
-}
-function impression(slot) {
- return {
- id: slot.bidId,
- secure: window.location.protocol === 'https:' ? 1 : 0,
- 'banner': banner(slot),
- 'native': nativeImpression(slot),
- 'video': videoImpression(slot),
- bidfloor: slot.params.bidFloor || '0.000001',
- tagid: slot.params.placementId.toString(),
- };
-}
-
-function banner(slot) {
- if (slot.mediaType === 'banner' || utils.deepAccess(slot, 'mediaTypes.banner')) {
- const sizes = utils.deepAccess(slot, 'mediaTypes.banner.sizes');
- if (sizes.length > 1) {
- let format = [];
- for (let f = 0; f < sizes.length; f++) {
- format.push({'w': sizes[f][0], 'h': sizes[f][1]});
- }
- return {'format': format};
- } else {
- return {
- w: sizes[0][0],
- h: sizes[0][1]
- }
- }
- }
- return null;
-}
-
-function videoImpression(slot) {
- if (slot.mediaType === 'video' || utils.deepAccess(slot, 'mediaTypes.video')) {
- const sizes = utils.deepAccess(slot, 'mediaTypes.video.playerSize');
- const video = {
- w: sizes[0][0],
- h: sizes[0][1],
- mimes: DEFAULT_MIMES,
- protocols: DEFAULT_PROTOCOLS,
- api: DEFAULT_APIS,
- };
- if (slot.params.video) {
- Object.keys(slot.params.video).filter(param => includes(VIDEO_TARGETING, param)).forEach(param => video[param] = slot.params.video[param]);
- }
- return video;
- }
- return null;
-}
-
-function nativeImpression(slot) {
- if (slot.mediaType === 'native' || utils.deepAccess(slot, 'mediaTypes.native')) {
- const assets = [];
- addAsset(assets, titleAsset(1, slot.nativeParams.title, NATIVE_DEFAULTS.TITLE_LEN));
- addAsset(assets, dataAsset(2, slot.nativeParams.body, 2, NATIVE_DEFAULTS.DESCR_LEN));
- addAsset(assets, dataAsset(3, slot.nativeParams.sponsoredBy, 1, NATIVE_DEFAULTS.SPONSORED_BY_LEN));
- addAsset(assets, imageAsset(4, slot.nativeParams.icon, 1, NATIVE_DEFAULTS.ICON_MIN, NATIVE_DEFAULTS.ICON_MIN));
- addAsset(assets, imageAsset(5, slot.nativeParams.image, 3, NATIVE_DEFAULTS.IMG_MIN, NATIVE_DEFAULTS.IMG_MIN));
- return {
- request: JSON.stringify({ assets }),
- ver: '1.1',
- };
- }
- return null;
-}
-
-function addAsset(assets, asset) {
- if (asset) {
- assets.push(asset);
- }
-}
-
-function titleAsset(id, params, defaultLen) {
- if (params) {
- return {
- id,
- required: params.required ? 1 : 0,
- title: {
- len: params.len || defaultLen,
- },
- };
- }
- return null;
-}
-
-function imageAsset(id, params, type, defaultMinWidth, defaultMinHeight) {
- return params ? {
- id,
- required: params.required ? 1 : 0,
- img: {
- type,
- wmin: params.wmin || defaultMinWidth,
- hmin: params.hmin || defaultMinHeight,
- }
- } : null;
-}
-
-function dataAsset(id, params, type, defaultLen) {
- return params ? {
- id,
- required: params.required ? 1 : 0,
- data: {
- type,
- len: params.len || defaultLen,
- }
- } : null;
-}
-
-function site(bidderRequest) {
- const pubId = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.pubId : '0';
- const siteId = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.siteId : '0';
- const appParams = bidderRequest[0].params.app;
- if (!appParams) {
- return {
- publisher: {
- id: pubId.toString(),
- domain: window.location.hostname,
- },
- id: siteId.toString(),
- ref: window.top.document.referrer,
- page: window.location.href,
- }
- }
- return null;
-}
-
-function app(bidderRequest) {
- const pubId = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.pubId : '0';
- const appParams = bidderRequest[0].params.app;
- if (appParams) {
- return {
- publisher: {
- id: pubId.toString(),
- },
- id: appParams.id,
- name: appParams.name,
- bundle: appParams.bundle,
- storeurl: appParams.storeUrl,
- domain: appParams.domain,
- }
- }
- return null;
-}
-
-function device(bidderRequest) {
- const lat = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.latitude : '';
- const lon = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.longitude : '';
- const ifa = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.ifa : '';
- return {
- dnt: utils.getDNT() ? 1 : 0,
- ua: navigator.userAgent,
- language: (navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage),
- w: (window.screen.width || window.innerWidth),
- h: (window.screen.height || window.innerHeigh),
- geo: {
- lat: lat,
- lon: lon,
- },
- ifa: ifa,
- };
-}
-
-function parse(rawResponse) {
- try {
- if (rawResponse) {
- return JSON.parse(rawResponse);
- }
- } catch (ex) {
- utils.logError('platformio.parse', 'ERROR', ex);
- }
- return null;
-}
-
-function applyGdpr(bidderRequest, ortbRequest) {
- if (bidderRequest && bidderRequest.gdprConsent) {
- ortbRequest.regs = { ext: { gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0 } };
- ortbRequest.user = { ext: { consent: bidderRequest.gdprConsent.consentString } };
- }
-}
-
-function nativeResponse(imp, bid) {
- if (imp['native']) {
- const nativeAd = parse(bid.adm);
- const keys = {};
- keys.image = {};
- keys.icon = {};
- if (nativeAd && nativeAd['native'] && nativeAd['native'].assets) {
- nativeAd['native'].assets.forEach(asset => {
- keys.title = asset.title ? asset.title.text : keys.title;
- keys.body = asset.data && asset.id === 2 ? asset.data.value : keys.body;
- keys.sponsoredBy = asset.data && asset.id === 3 ? asset.data.value : keys.sponsoredBy;
- keys.icon.url = asset.img && asset.id === 4 ? asset.img.url : keys.icon.url;
- keys.icon.width = asset.img && asset.id === 4 ? asset.img.w : keys.icon.width;
- keys.icon.height = asset.img && asset.id === 4 ? asset.img.h : keys.icon.height;
- keys.image.url = asset.img && asset.id === 5 ? asset.img.url : keys.image.url;
- keys.image.width = asset.img && asset.id === 5 ? asset.img.w : keys.image.width;
- keys.image.height = asset.img && asset.id === 5 ? asset.img.h : keys.image.height;
- });
- if (nativeAd['native'].link) {
- keys.clickUrl = encodeURIComponent(nativeAd['native'].link.url);
- }
- return keys;
- }
- }
- return null;
-}
-
-registerBidder(spec);
diff --git a/modules/prebidServerBidAdapter/index.js b/modules/prebidServerBidAdapter/index.js
index ec5d05f0fe0..246127e443d 100644
--- a/modules/prebidServerBidAdapter/index.js
+++ b/modules/prebidServerBidAdapter/index.js
@@ -133,6 +133,13 @@ function formatUrlParams(option) {
let temp = option[prop];
option[prop] = { p1Consent: temp, noP1Consent: temp };
}
+ if (utils.isPlainObject(option[prop]) && (!option[prop].p1Consent || !option[prop].noP1Consent)) {
+ ['p1Consent', 'noP1Consent'].forEach((conUrl) => {
+ if (!option[prop][conUrl]) {
+ utils.logWarn(`s2sConfig.${prop}.${conUrl} not defined. PBS request will be skipped in some P1 scenarios.`);
+ }
+ });
+ }
});
}
@@ -492,12 +499,24 @@ const OPEN_RTB_PROTOCOL = {
const firstBidRequest = bidRequests[0];
// transform ad unit into array of OpenRTB impression objects
+ let impIds = new Set();
adUnits.forEach(adUnit => {
+ // in case there is a duplicate imp.id, add '-2' suffix to the second imp.id.
+ // e.g. if there are 2 adUnits (case of twin adUnit codes) with code 'test',
+ // first imp will have id 'test' and second imp will have id 'test-2'
+ let impressionId = adUnit.code;
+ let i = 1;
+ while (impIds.has(impressionId)) {
+ i++;
+ impressionId = `${adUnit.code}-${i}`;
+ }
+ impIds.add(impressionId);
+
const nativeParams = processNativeAdUnitParams(utils.deepAccess(adUnit, 'mediaTypes.native'));
let nativeAssets;
if (nativeParams) {
try {
- nativeAssets = nativeAssetCache[adUnit.code] = Object.keys(nativeParams).reduce((assets, type) => {
+ nativeAssets = nativeAssetCache[impressionId] = Object.keys(nativeParams).reduce((assets, type) => {
let params = nativeParams[type];
function newAsset(obj) {
@@ -563,10 +582,9 @@ const OPEN_RTB_PROTOCOL = {
const bannerParams = utils.deepAccess(adUnit, 'mediaTypes.banner');
adUnit.bids.forEach(bid => {
- // OpenRTB response contains the adunit code and bidder name. These are
+ // OpenRTB response contains imp.id and bidder name. These are
// combined to create a unique key for each bid since an id isn't returned
- bidIdMap[`${adUnit.code}${bid.bidder}`] = bid.bid_id;
-
+ bidIdMap[`${impressionId}${bid.bidder}`] = bid.bid_id;
// check for and store valid aliases to add to the request
if (adapterManager.aliasRegistry[bid.bidder]) {
const bidder = adapterManager.bidderRegistry[bid.bidder];
@@ -591,10 +609,12 @@ const OPEN_RTB_PROTOCOL = {
});
mediaTypes['banner'] = {format};
+
+ if (bannerParams.pos) mediaTypes['banner'].pos = bannerParams.pos;
}
if (!utils.isEmpty(videoParams)) {
- if (videoParams.context === 'outstream' && !adUnit.renderer) {
+ if (videoParams.context === 'outstream' && !videoParams.renderer && !adUnit.renderer) {
// Don't push oustream w/o renderer to request object.
utils.logError('Outstream bid without renderer cannot be sent to Prebid Server.');
} else {
@@ -641,13 +661,13 @@ const OPEN_RTB_PROTOCOL = {
const ext = adUnit.bids.reduce((acc, bid) => {
const adapter = adapterManager.bidderRegistry[bid.bidder];
if (adapter && adapter.getSpec().transformBidParams) {
- bid.params = adapter.getSpec().transformBidParams(bid.params, true);
+ bid.params = adapter.getSpec().transformBidParams(bid.params, true, adUnit, bidRequests);
}
acc[bid.bidder] = (s2sConfig.adapterOptions && s2sConfig.adapterOptions[bid.bidder]) ? Object.assign({}, bid.params, s2sConfig.adapterOptions[bid.bidder]) : bid.params;
return acc;
}, {...utils.deepAccess(adUnit, 'ortb2Imp.ext')});
- const imp = { id: adUnit.code, ext, secure: s2sConfig.secure };
+ const imp = { id: impressionId, ext, secure: s2sConfig.secure };
const ortb2 = {...utils.deepAccess(adUnit, 'ortb2Imp.ext.data')};
Object.keys(ortb2).forEach(prop => {
@@ -717,7 +737,8 @@ const OPEN_RTB_PROTOCOL = {
source: {tid: s2sBidRequest.tid},
tmax: s2sConfig.timeout,
imp: imps,
- test: getConfig('debug') ? 1 : 0,
+ // to do: add setconfig option to pass test = 1
+ test: 0,
ext: {
prebid: {
// set ext.prebid.auctiontimestamp with the auction timestamp. Data type is long integer.
@@ -735,6 +756,11 @@ const OPEN_RTB_PROTOCOL = {
// Sets pbjs version, can be overwritten below if channel exists in s2sConfig.extPrebid
request.ext.prebid = Object.assign(request.ext.prebid, {channel: {name: 'pbjs', version: $$PREBID_GLOBAL$$.version}})
+ // set debug flag if in debug mode
+ if (getConfig('debug')) {
+ request.ext.prebid = Object.assign(request.ext.prebid, {debug: true})
+ }
+
// s2sConfig video.ext.prebid is passed through openrtb to PBS
if (s2sConfig.extPrebid && typeof s2sConfig.extPrebid === 'object') {
request.ext.prebid = Object.assign(request.ext.prebid, s2sConfig.extPrebid);
@@ -941,7 +967,7 @@ const OPEN_RTB_PROTOCOL = {
}
if (utils.isPlainObject(adm) && Array.isArray(adm.assets)) {
- let origAssets = nativeAssetCache[bidRequest.adUnitCode];
+ let origAssets = nativeAssetCache[bid.impid];
bidObject.native = utils.cleanObj(adm.assets.reduce((native, asset) => {
let origAsset = origAssets[asset.id];
if (utils.isPlainObject(asset.img)) {
@@ -987,8 +1013,9 @@ const OPEN_RTB_PROTOCOL = {
bidObject.creativeId = bid.crid;
if (bid.burl) { bidObject.burl = bid.burl; }
bidObject.currency = (response.cur) ? response.cur : DEFAULT_S2S_CURRENCY;
- bidObject.meta = bidObject.meta || {};
- if (bid.ext && bid.ext.dchain) { bidObject.meta.dchain = utils.deepClone(bid.ext.dchain); }
+ bidObject.meta = {};
+ let extPrebidMeta = utils.deepAccess(bid, 'ext.prebid.meta');
+ if (extPrebidMeta && utils.isPlainObject(extPrebidMeta)) { bidObject.meta = utils.deepClone(extPrebidMeta); }
if (bid.adomain) { bidObject.meta.advertiserDomains = bid.adomain; }
// the OpenRTB location for "TTL" as understood by Prebid.js is "exp" (expiration).
@@ -996,7 +1023,7 @@ const OPEN_RTB_PROTOCOL = {
bidObject.ttl = (bid.exp) ? bid.exp : configTtl;
bidObject.netRevenue = (bid.netRevenue) ? bid.netRevenue : DEFAULT_S2S_NETREVENUE;
- bids.push({ adUnit: bid.impid, bid: bidObject });
+ bids.push({ adUnit: bidRequest.adUnitCode, bid: bidObject });
});
});
}
@@ -1077,9 +1104,10 @@ export function PrebidServer() {
const request = OPEN_RTB_PROTOCOL.buildRequest(s2sBidRequest, bidRequests, validAdUnits, s2sBidRequest.s2sConfig, requestedBidders);
const requestJson = request && JSON.stringify(request);
utils.logInfo('BidRequest: ' + requestJson);
- if (request && requestJson) {
+ const endpointUrl = getMatchingConsentUrl(s2sBidRequest.s2sConfig.endpoint, gdprConsent);
+ if (request && requestJson && endpointUrl) {
ajax(
- getMatchingConsentUrl(s2sBidRequest.s2sConfig.endpoint, gdprConsent),
+ endpointUrl,
{
success: response => handleResponse(response, requestedBidders, bidRequests, addBidResponse, done, s2sBidRequest.s2sConfig),
error: done
@@ -1087,6 +1115,8 @@ export function PrebidServer() {
requestJson,
{ contentType: 'text/plain', withCredentials: true }
);
+ } else {
+ utils.logError('PBS request not made. Check endpoints.');
}
}
};
diff --git a/modules/projectLimeLightBidAdapter.md b/modules/projectLimeLightBidAdapter.md
deleted file mode 100644
index 15aa170cd2e..00000000000
--- a/modules/projectLimeLightBidAdapter.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# Overview
-
-```
-Module Name: Project LimeLight SSP Adapter
-Module Type: Bidder Adapter
-Maintainer: engineering@project-limelight.com
-```
-
-# Description
-
-Module that connects to Project Limelight SSP demand sources
-
-# Test Parameters for banner
-```
- var adUnits = [{
- code: 'placementCode',
- sizes: [[300, 250]],
- bids: [{
- bidder: 'project-limelight',
- params: {
- host: 'ads.project-limelight.com',
- adUnitId: 0,
- adUnitType: 'banner'
- }
- }]
- }
- ];
-```
-
-# Test Parameters for video
-```
-var videoAdUnit = [{
- code: 'video1',
- sizes: [[300, 250]],
- bids: [{
- bidder: 'project-limelight',
- params: {
- host: 'ads.project-limelight.com',
- adUnitId: 0,
- adUnitType: 'video'
- }
- }]
- }];
-```
-
-# Configuration
-
-The Project Limelight Bid Adapter expects Prebid Cache(for video) to be enabled so that we can store and retrieve a single vastXml.
-
-```
-pbjs.setConfig({
- usePrebidCache: true,
- cache: {
- url: 'https://prebid.adnxs.com/pbc/v1/cache'
- }
-});
-```
diff --git a/modules/proxistoreBidAdapter.js b/modules/proxistoreBidAdapter.js
index ff07ee9ede9..2e4c7eb22cb 100644
--- a/modules/proxistoreBidAdapter.js
+++ b/modules/proxistoreBidAdapter.js
@@ -1,4 +1,6 @@
import { registerBidder } from '../src/adapters/bidderFactory.js';
+import * as utils from '../src/utils.js';
+
const BIDDER_CODE = 'proxistore';
const PROXISTORE_VENDOR_ID = 418;
@@ -26,39 +28,69 @@ function _createServerRequest(bidRequests, bidderRequest) {
language: bidRequests[0].params.language,
gdpr: {
applies: false,
- consentGiven: false
+ consentGiven: false,
},
};
if (bidderRequest && bidderRequest.gdprConsent) {
- const { gdprConsent } = bidderRequest;
- if (typeof gdprConsent.gdprApplies === 'boolean' && gdprConsent.gdprApplies) {
+ var gdprConsent = bidderRequest.gdprConsent;
+
+ if (
+ typeof gdprConsent.gdprApplies === 'boolean' &&
+ gdprConsent.gdprApplies
+ ) {
payload.gdpr.applies = true;
}
- if (typeof gdprConsent.consentString === 'string' && gdprConsent.consentString) {
+ if (
+ typeof gdprConsent.consentString === 'string' &&
+ gdprConsent.consentString
+ ) {
payload.gdpr.consentString = bidderRequest.gdprConsent.consentString;
}
+
if (gdprConsent.vendorData) {
- const {vendorData} = gdprConsent;
- const {apiVersion} = gdprConsent;
- if (apiVersion === 2 && vendorData.vendor && vendorData.vendor.consents && typeof vendorData.vendor.consents[PROXISTORE_VENDOR_ID.toString(10)] !== 'undefined') {
- payload.gdpr.consentGiven = !!vendorData.vendor.consents[PROXISTORE_VENDOR_ID.toString(10)];
- } else if (apiVersion === 1 && vendorData.vendorConsents && typeof vendorData.vendorConsents[PROXISTORE_VENDOR_ID.toString(10)] !== 'undefined') {
- payload.gdpr.consentGiven = !!vendorData.vendorConsents[PROXISTORE_VENDOR_ID.toString(10)];
+ var vendorData = gdprConsent.vendorData;
+ var apiVersion = gdprConsent.apiVersion;
+
+ if (
+ apiVersion === 2 &&
+ vendorData.vendor &&
+ vendorData.vendor.consents &&
+ typeof vendorData.vendor.consents[PROXISTORE_VENDOR_ID.toString(10)] !==
+ 'undefined'
+ ) {
+ payload.gdpr.consentGiven =
+ !!vendorData.vendor.consents[PROXISTORE_VENDOR_ID.toString(10)];
+ } else if (
+ apiVersion === 1 &&
+ vendorData.vendorConsents &&
+ typeof vendorData.vendorConsents[PROXISTORE_VENDOR_ID.toString(10)] !==
+ 'undefined'
+ ) {
+ payload.gdpr.consentGiven =
+ !!vendorData.vendorConsents[PROXISTORE_VENDOR_ID.toString(10)];
}
}
}
- const options = {
+ var options = {
contentType: 'application/json',
withCredentials: payload.gdpr.consentGiven,
+ customHeaders: {
+ version: '1.0.4',
+ },
};
-
- const endPointUri = payload.gdpr.consentGiven || !payload.gdpr.applies
- ? `https://abs.proxistore.com/${payload.language}/v3/rtb/prebid/multi`
- : `https://abs.cookieless-proxistore.com/${payload.language}/v3/rtb/prebid/multi`;
-
+ var endPointUri =
+ payload.gdpr.consentGiven || !payload.gdpr.applies
+ ? 'https://abs.proxistore.com/'.concat(
+ payload.language,
+ '/v3/rtb/prebid/multi'
+ )
+ : 'https://abs.cookieless-proxistore.com/'.concat(
+ payload.language,
+ '/v3/rtb/prebid/multi'
+ );
return {
method: 'POST',
url: endPointUri,
@@ -68,10 +100,24 @@ function _createServerRequest(bidRequests, bidderRequest) {
}
function _assignSegments(bid) {
- if (bid.ortb2 && bid.ortb2.user && bid.ortb2.user.ext && bid.ortb2.user.ext.data) {
- return bid.ortb2.user.ext.data || {segments: [], contextual_categories: {}};
+ if (
+ bid.ortb2 &&
+ bid.ortb2.user &&
+ bid.ortb2.user.ext &&
+ bid.ortb2.user.ext.data
+ ) {
+ return (
+ bid.ortb2.user.ext.data || {
+ segments: [],
+ contextual_categories: {},
+ }
+ );
}
- return {segments: [], contextual_categories: {}};
+
+ return {
+ segments: [],
+ contextual_categories: {},
+ };
}
function _createBidResponse(response) {
@@ -88,6 +134,7 @@ function _createBidResponse(response) {
vastUrl: response.vastUrl,
vastXml: response.vastXml,
dealId: response.dealId,
+ meta: response.meta,
};
}
/**
@@ -110,6 +157,7 @@ function isBidRequestValid(bid) {
function buildRequests(bidRequests, bidderRequest) {
var request = _createServerRequest(bidRequests, bidderRequest);
+
return request;
}
/**
@@ -125,18 +173,24 @@ function interpretResponse(serverResponse, bidRequest) {
}
function _assignFloor(bid) {
- if (typeof bid.getFloor === 'function') {
- var floorInfo = bid.getFloor({
- currency: 'EUR',
- mediaType: 'banner',
- size: '*',
- });
-
- if (floorInfo.currency === 'EUR') {
- return floorInfo.floor;
- }
+ if (!utils.isFn(bid.getFloor)) {
+ // eslint-disable-next-line no-console
+ console.log(bid.params.bidFloor);
+ return bid.params.bidFloor ? bid.params.bidFloor : null;
}
+ const floor = bid.getFloor({
+ currency: 'EUR',
+ mediaType: 'banner',
+ size: '*',
+ });
+ if (
+ utils.isPlainObject(floor) &&
+ !isNaN(floor.floor) &&
+ floor.currency === 'EUR'
+ ) {
+ return floor.floor;
+ }
return null;
}
@@ -145,7 +199,6 @@ export const spec = {
isBidRequestValid: isBidRequestValid,
buildRequests: buildRequests,
interpretResponse: interpretResponse,
-
};
registerBidder(spec);
diff --git a/modules/pubCommonIdSystem.js b/modules/pubCommonIdSystem.js
deleted file mode 100644
index 95e539a4d6a..00000000000
--- a/modules/pubCommonIdSystem.js
+++ /dev/null
@@ -1,345 +0,0 @@
-/**
- * This module adds PubCommonId to the User ID module
- * The {@link module:modules/userId} module is required
- * @module modules/pubCommonIdSystem
- * @requires module:modules/userId
- */
-
-import * as utils from '../src/utils.js';
-import {submodule} from '../src/hook.js';
-import {getStorageManager} from '../src/storageManager.js';
-import {ajax} from '../src/ajax.js';
-import { uspDataHandler, coppaDataHandler } from '../src/adapterManager.js';
-
-const PUB_COMMON_ID = 'PublisherCommonId';
-const MODULE_NAME = 'pubCommonId';
-
-const COOKIE = 'cookie';
-const LOCAL_STORAGE = 'html5';
-const SHAREDID_OPT_OUT_VALUE = '00000000000000000000000000';
-const SHAREDID_URL = 'https://id.sharedid.org/id';
-const SHAREDID_SUFFIX = '_sharedid';
-const EXPIRED_COOKIE_DATE = 'Thu, 01 Jan 1970 00:00:01 GMT';
-const SHAREDID_DEFAULT_STATE = false;
-const GVLID = 887;
-
-const storage = getStorageManager(GVLID, 'pubCommonId');
-
-/**
- * Store sharedid in either cookie or local storage
- * @param {Object} config Need config.storage object to derive key, expiry time, and storage type.
- * @param {string} value Shareid value to store
- */
-
-function storeData(config, value) {
- try {
- if (value) {
- const key = config.storage.name + SHAREDID_SUFFIX;
- const expiresStr = (new Date(Date.now() + (storage.expires * (60 * 60 * 24 * 1000)))).toUTCString();
-
- if (config.storage.type === COOKIE) {
- if (storage.cookiesAreEnabled()) {
- storage.setCookie(key, value, expiresStr, 'LAX', pubCommonIdSubmodule.domainOverride());
- }
- } else if (config.storage.type === LOCAL_STORAGE) {
- if (storage.hasLocalStorage()) {
- storage.setDataInLocalStorage(`${key}_exp`, expiresStr);
- storage.setDataInLocalStorage(key, value);
- }
- }
- }
- } catch (error) {
- utils.logError(error);
- }
-}
-
-/**
- * Read sharedid from cookie or local storage
- * @param config Need config.storage to derive key and storage type
- * @return {string}
- */
-function readData(config) {
- try {
- const key = config.storage.name + SHAREDID_SUFFIX;
- if (config.storage.type === COOKIE) {
- if (storage.cookiesAreEnabled()) {
- return storage.getCookie(key);
- }
- } else if (config.storage.type === LOCAL_STORAGE) {
- if (storage.hasLocalStorage()) {
- const expValue = storage.getDataFromLocalStorage(`${key}_exp`);
- if (!expValue) {
- return storage.getDataFromLocalStorage(key);
- } else if ((new Date(expValue)).getTime() - Date.now() > 0) {
- return storage.getDataFromLocalStorage(key)
- }
- }
- }
- } catch (error) {
- utils.logError(error);
- }
-}
-
-/**
- * Delete sharedid from cookie or local storage
- * @param config Need config.storage to derive key and storage type
- */
-function delData(config) {
- try {
- const key = config.storage.name + SHAREDID_SUFFIX;
- if (config.storage.type === COOKIE) {
- if (storage.cookiesAreEnabled()) {
- storage.setCookie(key, '', EXPIRED_COOKIE_DATE);
- }
- } else if (config.storage.type === LOCAL_STORAGE) {
- storage.removeDataFromLocalStorage(`${key}_exp`);
- storage.removeDataFromLocalStorage(key);
- }
- } catch (error) {
- utils.logError(error);
- }
-}
-
-/**
- * setup success and error handler for sharedid callback thru ajax
- * @param {string} pubcid Current pubcommon id
- * @param {function} callback userId module callback.
- * @param {Object} config Need config.storage to derive sharedid storage params
- * @return {{success: success, error: error}}
- */
-
-function handleResponse(pubcid, callback, config) {
- return {
- success: function (responseBody) {
- if (responseBody) {
- try {
- let responseObj = JSON.parse(responseBody);
- utils.logInfo('PubCommonId: Generated SharedId: ' + responseObj.sharedId);
- if (responseObj.sharedId) {
- if (responseObj.sharedId !== SHAREDID_OPT_OUT_VALUE) {
- // Store sharedId locally
- storeData(config, responseObj.sharedId);
- } else {
- // Delete local copy if the user has opted out
- delData(config);
- }
- }
- // Pass pubcid even though there is no change in order to trigger decode
- callback(pubcid);
- } catch (error) {
- utils.logError(error);
- }
- }
- },
- error: function (statusText, responseBody) {
- utils.logInfo('PubCommonId: failed to get sharedid');
- }
- }
-}
-
-/**
- * Builds and returns the shared Id URL with attached consent data if applicable
- * @param {Object} consentData
- * @return {string}
- */
-function sharedIdUrl(consentData) {
- const usPrivacyString = uspDataHandler.getConsentData();
- let sharedIdUrl = SHAREDID_URL;
- if (usPrivacyString && typeof usPrivacyString === 'string') {
- sharedIdUrl = `${SHAREDID_URL}?us_privacy=${usPrivacyString}`;
- }
- if (!consentData || typeof consentData.gdprApplies !== 'boolean' || !consentData.gdprApplies) return sharedIdUrl;
- if (usPrivacyString) {
- sharedIdUrl = `${sharedIdUrl}&gdpr=1&gdpr_consent=${consentData.consentString}`
- return sharedIdUrl;
- }
- sharedIdUrl = `${SHAREDID_URL}?gdpr=1&gdpr_consent=${consentData.consentString}`;
- return sharedIdUrl
-}
-
-/**
- * Wraps pixelCallback in order to call sharedid sync
- * @param {string} pubcid Pubcommon id value
- * @param {function|undefined} pixelCallback fires a pixel to first party server
- * @param {Object} config Need config.storage to derive sharedid storage params.
- * @return {function(...[*]=)}
- */
-
-function getIdCallback(pubcid, pixelCallback, config, consentData) {
- return function (callback) {
- if (typeof pixelCallback === 'function') {
- pixelCallback();
- }
- ajax(sharedIdUrl(consentData), handleResponse(pubcid, callback, config), undefined, {method: 'GET', withCredentials: true});
- }
-}
-
-/** @type {Submodule} */
-export const pubCommonIdSubmodule = {
- /**
- * used to link submodule with config
- * @type {string}
- */
- name: MODULE_NAME,
- /**
- * Vendor id of prebid
- * @type {Number}
- */
- gvlid: GVLID,
- /**
- * Return a callback function that calls the pixelUrl with id as a query parameter
- * @param pixelUrl
- * @param id
- * @returns {function}
- */
- makeCallback: function (pixelUrl, id = '') {
- if (!pixelUrl) {
- return;
- }
-
- // Use pubcid as a cache buster
- const urlInfo = utils.parseUrl(pixelUrl);
- urlInfo.search.id = encodeURIComponent('pubcid:' + id);
- const targetUrl = utils.buildUrl(urlInfo);
-
- return function () {
- utils.triggerPixel(targetUrl);
- };
- },
- /**
- * decode the stored id value for passing to bid requests
- * @function
- * @param {string} value
- * @param {SubmoduleConfig} config
- * @returns {{pubcid:string}}
- */
- decode(value, config) {
- const idObj = {'pubcid': value};
- const {params: {enableSharedId = SHAREDID_DEFAULT_STATE} = {}} = config;
-
- if (enableSharedId) {
- const sharedId = readData(config);
- if (sharedId) idObj['sharedid'] = {id: sharedId};
- }
-
- return idObj;
- },
- /**
- * performs action to obtain id
- * @function
- * @param {SubmoduleConfig} [config] Config object with params and storage properties
- * @param {Object} consentData
- * @param {string} storedId Existing pubcommon id
- * @returns {IdResponse}
- */
- getId: function (config = {}, consentData, storedId) {
- const coppa = coppaDataHandler.getCoppa();
- if (coppa) {
- utils.logInfo('PubCommonId: IDs not provided for coppa requests, exiting PubCommonId');
- return;
- }
- const {params: {create = true, pixelUrl, enableSharedId = SHAREDID_DEFAULT_STATE} = {}} = config;
- let newId = storedId;
- if (!newId) {
- try {
- if (typeof window[PUB_COMMON_ID] === 'object') {
- // If the page includes its own pubcid module, then save a copy of id.
- newId = window[PUB_COMMON_ID].getId();
- }
- } catch (e) {
- }
-
- if (!newId) newId = (create && utils.hasDeviceAccess()) ? utils.generateUUID() : undefined;
- }
-
- const pixelCallback = this.makeCallback(pixelUrl, newId);
- const combinedCallback = enableSharedId ? getIdCallback(newId, pixelCallback, config, consentData) : pixelCallback;
-
- return {id: newId, callback: combinedCallback};
- },
- /**
- * performs action to extend an id. There are generally two ways to extend the expiration time
- * of stored id: using pixelUrl or return the id and let main user id module write it again with
- * the new expiration time.
- *
- * PixelUrl, if defined, should point back to a first party domain endpoint. On the server
- * side, there is either a plugin, or customized logic to read and write back the pubcid cookie.
- * The extendId function itself should return only the callback, and not the id itself to avoid
- * having the script-side overwriting server-side. This applies to both pubcid and sharedid.
- *
- * On the other hand, if there is no pixelUrl, then the extendId should return storedId so that
- * its expiration time is updated. Sharedid, however, will have to be updated by this submodule
- * separately.
- *
- * @function
- * @param {SubmoduleParams} [config]
- * @param {ConsentData|undefined} consentData
- * @param {Object} storedId existing id
- * @returns {IdResponse|undefined}
- */
- extendId: function(config = {}, consentData, storedId) {
- const coppa = coppaDataHandler.getCoppa();
- if (coppa) {
- utils.logInfo('PubCommonId: IDs not provided for coppa requests, exiting PubCommonId');
- return;
- }
- const {params: {extend = false, pixelUrl, enableSharedId = SHAREDID_DEFAULT_STATE} = {}} = config;
-
- if (extend) {
- try {
- if (typeof window[PUB_COMMON_ID] === 'object') {
- if (enableSharedId) {
- // If the page includes its own pubcid module, then there is nothing to do
- // except to update sharedid's expiration time
- storeData(config, readData(config));
- }
- return;
- }
- } catch (e) {
- }
-
- if (pixelUrl) {
- const callback = this.makeCallback(pixelUrl, storedId);
- return {callback: callback};
- } else {
- if (enableSharedId) {
- // Update with the same value to extend expiration time
- storeData(config, readData(config));
- }
- return {id: storedId};
- }
- }
- },
-
- /**
- * @param {string} domain
- * @param {HTMLDocument} document
- * @return {(string|undefined)}
- */
- domainOverride: function () {
- const domainElements = document.domain.split('.');
- const cookieName = `_gd${Date.now()}`;
- for (let i = 0, topDomain, testCookie; i < domainElements.length; i++) {
- const nextDomain = domainElements.slice(i).join('.');
-
- // write test cookie
- storage.setCookie(cookieName, '1', undefined, undefined, nextDomain);
-
- // read test cookie to verify domain was valid
- testCookie = storage.getCookie(cookieName);
-
- // delete test cookie
- storage.setCookie(cookieName, '', 'Thu, 01 Jan 1970 00:00:01 GMT', undefined, nextDomain);
-
- if (testCookie === '1') {
- // cookie was written successfully using test domain so the topDomain is updated
- topDomain = nextDomain;
- } else {
- // cookie failed to write using test domain so exit by returning the topDomain
- return topDomain;
- }
- }
- }
-};
-
-submodule('userId', pubCommonIdSubmodule);
diff --git a/modules/pubmaticAnalyticsAdapter.js b/modules/pubmaticAnalyticsAdapter.js
index c7eeaf87fdc..9aa40a2282d 100755
--- a/modules/pubmaticAnalyticsAdapter.js
+++ b/modules/pubmaticAnalyticsAdapter.js
@@ -82,7 +82,7 @@ function setMediaTypes(types, bid) {
function copyRequiredBidDetails(bid) {
return utils.pick(bid, [
- 'bidder', bidder => bidder.toLowerCase(),
+ 'bidder',
'bidId',
'status', () => NO_BID, // default a bid to NO_BID until response is recieved or bid is timed out
'finalSource as source',
@@ -196,12 +196,17 @@ function getValueForKgpv(bid, adUnitId) {
}
}
+function getAdapterNameForAlias(aliasName) {
+ return adapterManager.aliasRegistry[aliasName] || aliasName;
+}
+
function gatherPartnerBidsForAdUnitForLogger(adUnit, adUnitId, highestBid) {
highestBid = (highestBid && highestBid.length > 0) ? highestBid[0] : null;
return Object.keys(adUnit.bids).reduce(function(partnerBids, bidId) {
let bid = adUnit.bids[bidId];
partnerBids.push({
- 'pn': bid.bidder,
+ 'pn': getAdapterNameForAlias(bid.bidder),
+ 'bc': bid.bidder,
'bidid': bid.bidId,
'db': bid.bidResponse ? 0 : 1,
'kgpv': getValueForKgpv(bid, adUnitId),
@@ -287,6 +292,7 @@ function executeBidsLoggerCall(e, highestCpmBids) {
function executeBidWonLoggerCall(auctionId, adUnitId) {
const winningBidId = cache.auctions[auctionId].adUnitCodes[adUnitId].bidWon;
const winningBid = cache.auctions[auctionId].adUnitCodes[adUnitId].bids[winningBidId];
+ const adapterName = getAdapterNameForAlias(winningBid.bidder);
let pixelURL = END_POINT_WIN_BID_LOGGER;
pixelURL += 'pubid=' + publisherId;
pixelURL += '&purl=' + enc(config.getConfig('pageUrl') || cache.auctions[auctionId].referer || '');
@@ -296,7 +302,8 @@ function executeBidWonLoggerCall(auctionId, adUnitId) {
pixelURL += '&pid=' + enc(profileId);
pixelURL += '&pdvid=' + enc(profileVersionId);
pixelURL += '&slot=' + enc(adUnitId);
- pixelURL += '&pn=' + enc(winningBid.bidder);
+ pixelURL += '&pn=' + enc(adapterName);
+ pixelURL += '&bc=' + enc(winningBid.bidder);
pixelURL += '&en=' + enc(winningBid.bidResponse.bidPriceUSD);
pixelURL += '&eg=' + enc(winningBid.bidResponse.bidGrossCpmUSD);
pixelURL += '&kgpv=' + enc(getValueForKgpv(winningBid, adUnitId));
diff --git a/modules/pubmaticBidAdapter.js b/modules/pubmaticBidAdapter.js
index 79356415ddf..df22f8713cd 100644
--- a/modules/pubmaticBidAdapter.js
+++ b/modules/pubmaticBidAdapter.js
@@ -7,7 +7,7 @@ import { Renderer } from '../src/Renderer.js';
const BIDDER_CODE = 'pubmatic';
const LOG_WARN_PREFIX = 'PubMatic: ';
const ENDPOINT = 'https://hbopenbid.pubmatic.com/translator?source=prebid-client';
-const USER_SYNC_URL_IFRAME = 'https://ads.pubmatic.com/AdServer/js/showad.js#PIX&kdntuid=1&p=';
+const USER_SYNC_URL_IFRAME = 'https://ads.pubmatic.com/AdServer/js/user_sync.html?kdntuid=1&p=';
const USER_SYNC_URL_IMAGE = 'https://image8.pubmatic.com/AdServer/ImgSync?p=';
const DEFAULT_CURRENCY = 'USD';
const AUCTION_TYPE = 1;
@@ -929,7 +929,16 @@ function _assignRenderer(newBid, request) {
newBid.renderer = BB_RENDERER.newRenderer(newBid.rendererCode, adUnitCode);
}
}
-};
+}
+
+function isNonEmptyArray(test) {
+ if (utils.isArray(test) === true) {
+ if (test.length > 0) {
+ return true;
+ }
+ }
+ return false;
+}
export const spec = {
code: BIDDER_CODE,
@@ -949,15 +958,23 @@ export const spec = {
}
// video ad validation
if (bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty(VIDEO)) {
- if (!bid.mediaTypes.video.mimes || (bid.params.video && (!bid.params.video.hasOwnProperty('mimes') || !utils.isArray(bid.params.video.mimes) || bid.params.video.mimes.length === 0))) {
- utils.logWarn(LOG_WARN_PREFIX + 'Error: For video ads, mimes is mandatory and must specify atlease 1 mime value. Call to OpenBid will not be sent for ad unit:' + JSON.stringify(bid));
+ // bid.mediaTypes.video.mimes OR bid.params.video.mimes should be present and must be a non-empty array
+ let mediaTypesVideoMimes = utils.deepAccess(bid.mediaTypes, 'video.mimes');
+ let paramsVideoMimes = utils.deepAccess(bid, 'params.video.mimes');
+ if (isNonEmptyArray(mediaTypesVideoMimes) === false && isNonEmptyArray(paramsVideoMimes) === false) {
+ utils.logWarn(LOG_WARN_PREFIX + 'Error: For video ads, bid.mediaTypes.video.mimes OR bid.params.video.mimes should be present and must be a non-empty array. Call to OpenBid will not be sent for ad unit:' + JSON.stringify(bid));
return false;
}
+
if (!bid.mediaTypes[VIDEO].hasOwnProperty('context')) {
utils.logError(`${LOG_WARN_PREFIX}: no context specified in bid. Rejecting bid: `, bid);
return false;
}
- if (bid.mediaTypes[VIDEO].context === 'outstream' && !utils.isStr(bid.params.outstreamAU) && !bid.hasOwnProperty('renderer') && !bid.mediaTypes[VIDEO].hasOwnProperty('renderer')) {
+
+ if (bid.mediaTypes[VIDEO].context === 'outstream' &&
+ !utils.isStr(bid.params.outstreamAU) &&
+ !bid.hasOwnProperty('renderer') &&
+ !bid.mediaTypes[VIDEO].hasOwnProperty('renderer')) {
utils.logError(`${LOG_WARN_PREFIX}: for "outstream" bids either outstreamAU parameter must be provided or ad unit supplied renderer is required. Rejecting bid: `, bid);
return false;
}
diff --git a/modules/pubxBidAdapter.js b/modules/pubxBidAdapter.js
index 35d75e96f95..c7b63d3f7f7 100644
--- a/modules/pubxBidAdapter.js
+++ b/modules/pubxBidAdapter.js
@@ -1,4 +1,6 @@
import { registerBidder } from '../src/adapters/bidderFactory.js';
+import * as utils from '../src/utils.js';
+
const BIDDER_CODE = 'pubx';
const BID_ENDPOINT = 'https://api.primecaster.net/adlogue/api/slot/bid';
const USER_SYNC_URL = 'https://api.primecaster.net/primecaster_dmppv.html'
@@ -40,6 +42,9 @@ export const spec = {
ttl: body.TTL,
ad: body.adm
};
+ if (body.adomains) {
+ utils.deepSetValue(bidResponse, 'meta.advertiserDomains', Array.isArray(body.adomains) ? body.adomains : [body.adomains]);
+ }
bidResponses.push(bidResponse);
} else {};
return bidResponses;
diff --git a/modules/pxyzBidAdapter.js b/modules/pxyzBidAdapter.js
index bd2189ccc39..9baff4d1533 100644
--- a/modules/pxyzBidAdapter.js
+++ b/modules/pxyzBidAdapter.js
@@ -133,6 +133,7 @@ export const spec = {
}
function newBid(bid, currency) {
+ const { adomain } = bid;
return {
requestId: bid.impid,
mediaType: BANNER,
@@ -144,6 +145,9 @@ function newBid(bid, currency) {
ttl: 300,
netRevenue: true,
currency: currency,
+ meta: {
+ ...(adomain && adomain.length > 0 ? { advertiserDomains: adomain } : {})
+ }
};
}
diff --git a/modules/quantcastBidAdapter.js b/modules/quantcastBidAdapter.js
index e9541edb534..ecb5ad3176e 100644
--- a/modules/quantcastBidAdapter.js
+++ b/modules/quantcastBidAdapter.js
@@ -24,33 +24,33 @@ export const QUANTCAST_FPA = '__qca';
export const storage = getStorageManager(QUANTCAST_VENDOR_ID, BIDDER_CODE);
function makeVideoImp(bid) {
- const video = {};
- if (bid.params.video) {
- video['mimes'] = bid.params.video.mimes;
- video['minduration'] = bid.params.video.minduration;
- video['maxduration'] = bid.params.video.maxduration;
- video['protocols'] = bid.params.video.protocols;
- video['startdelay'] = bid.params.video.startdelay;
- video['linearity'] = bid.params.video.linearity;
- video['battr'] = bid.params.video.battr;
- video['maxbitrate'] = bid.params.video.maxbitrate;
- video['playbackmethod'] = bid.params.video.playbackmethod;
- video['delivery'] = bid.params.video.delivery;
- video['placement'] = bid.params.video.placement;
- video['api'] = bid.params.video.api;
- }
- if (bid.mediaTypes.video.mimes) {
- video['mimes'] = bid.mediaTypes.video.mimes;
+ const videoInMediaType = utils.deepAccess(bid, 'mediaTypes.video') || {};
+ const videoInParams = utils.deepAccess(bid, 'params.video') || {};
+ const video = Object.assign({}, videoInParams, videoInMediaType);
+
+ if (video.playerSize) {
+ video.w = video.playerSize[0];
+ video.h = video.playerSize[1];
}
- if (utils.isArray(bid.mediaTypes.video.playerSize[0])) {
- video['w'] = bid.mediaTypes.video.playerSize[0][0];
- video['h'] = bid.mediaTypes.video.playerSize[0][1];
- } else {
- video['w'] = bid.mediaTypes.video.playerSize[0];
- video['h'] = bid.mediaTypes.video.playerSize[1];
+ const videoCopy = {
+ mimes: video.mimes,
+ minduration: video.minduration,
+ maxduration: video.maxduration,
+ protocols: video.protocols,
+ startdelay: video.startdelay,
+ linearity: video.linearity,
+ battr: video.battr,
+ maxbitrate: video.maxbitrate,
+ playbackmethod: video.playbackmethod,
+ delivery: video.delivery,
+ placement: video.placement,
+ api: video.api,
+ w: video.w,
+ h: video.h
}
+
return {
- video: video,
+ video: videoCopy,
placementCode: bid.placementCode,
bidFloor: bid.params.bidFloor || DEFAULT_BID_FLOOR
};
@@ -248,7 +248,7 @@ export const spec = {
}
const bidResponsesList = response.bids.map(bid => {
- const { ad, cpm, width, height, creativeId, currency, videoUrl, dealId } = bid;
+ const { ad, cpm, width, height, creativeId, currency, videoUrl, dealId, meta } = bid;
const result = {
requestId: response.requestId,
@@ -271,6 +271,11 @@ export const spec = {
result['dealId'] = dealId;
}
+ if (meta !== undefined && meta.advertiserDomains && utils.isArray(meta.advertiserDomains)) {
+ result.meta = {};
+ result.meta.advertiserDomains = meta.advertiserDomains;
+ }
+
return result;
});
diff --git a/modules/quantcastIdSystem.js b/modules/quantcastIdSystem.js
index e86c130dc5b..7d82be884da 100644
--- a/modules/quantcastIdSystem.js
+++ b/modules/quantcastIdSystem.js
@@ -7,11 +7,159 @@
import {submodule} from '../src/hook.js'
import { getStorageManager } from '../src/storageManager.js';
+import { triggerPixel, logInfo } from '../src/utils.js';
+import { uspDataHandler, coppaDataHandler, gdprDataHandler } from '../src/adapterManager.js';
const QUANTCAST_FPA = '__qca';
+const DEFAULT_COOKIE_EXP_DAYS = 392; // (13 months - 2 days)
+const DAY_MS = 86400000;
+const PREBID_PCODE = 'p-KceJUEvXN48CE';
+const QSERVE_URL = 'https://pixel.quantserve.com/pixel';
+const QUANTCAST_VENDOR_ID = '11';
+const PURPOSE_DATA_COLLECT = '1';
+const PURPOSE_PRODUCT_IMPROVEMENT = '10';
+const QC_TCF_REQUIRED_PURPOSES = [PURPOSE_DATA_COLLECT, PURPOSE_PRODUCT_IMPROVEMENT];
+const QC_TCF_CONSENT_FIRST_PURPOSES = [PURPOSE_DATA_COLLECT];
+const QC_TCF_CONSENT_ONLY_PUPROSES = [PURPOSE_DATA_COLLECT];
+const GDPR_PRIVACY_STRING = gdprDataHandler.getConsentData();
+const US_PRIVACY_STRING = uspDataHandler.getConsentData();
export const storage = getStorageManager();
+export function firePixel(clientId, cookieExpDays = DEFAULT_COOKIE_EXP_DAYS) {
+ // check for presence of Quantcast Measure tag _qevent obj and publisher provided clientID
+ if (!window._qevents && clientId && clientId != '') {
+ var fpa = storage.getCookie(QUANTCAST_FPA);
+ var fpan = '0';
+ var domain = quantcastIdSubmodule.findRootDomain();
+ var now = new Date();
+ var usPrivacyParamString = '';
+ var firstPartyParamStrings;
+ var gdprParamStrings;
+
+ if (!fpa) {
+ var et = now.getTime();
+ var expires = new Date(et + (cookieExpDays * DAY_MS)).toGMTString();
+ var rand = Math.round(Math.random() * 2147483647);
+ fpa = `B0-${rand}-${et}`;
+ fpan = '1';
+ storage.setCookie(QUANTCAST_FPA, fpa, expires, '/', domain, null);
+ }
+
+ firstPartyParamStrings = `&fpan=${fpan}&fpa=${fpa}`;
+ gdprParamStrings = '&gdpr=0';
+ if (GDPR_PRIVACY_STRING && typeof GDPR_PRIVACY_STRING.gdprApplies === 'boolean' && GDPR_PRIVACY_STRING.gdprApplies) {
+ gdprParamStrings = `gdpr=1&gdpr_consent=${GDPR_PRIVACY_STRING.consentString}`;
+ }
+ if (US_PRIVACY_STRING && typeof US_PRIVACY_STRING === 'string') {
+ usPrivacyParamString = `&us_privacy=${US_PRIVACY_STRING}`;
+ }
+
+ let url = QSERVE_URL +
+ '?d=' + domain +
+ '&client_id=' + clientId +
+ '&a=' + PREBID_PCODE +
+ usPrivacyParamString +
+ gdprParamStrings +
+ firstPartyParamStrings;
+
+ triggerPixel(url);
+ }
+};
+
+export function hasGDPRConsent(gdprConsent) {
+ // Check for GDPR consent for purpose 1 and 10, and drop request if consent has not been given
+ // Remaining consent checks are performed server-side.
+ if (gdprConsent && typeof gdprConsent.gdprApplies === 'boolean' && gdprConsent.gdprApplies) {
+ if (!gdprConsent.vendorData) {
+ return false;
+ }
+ if (gdprConsent.apiVersion === 1) {
+ // We are not supporting TCF v1
+ return false;
+ }
+ if (gdprConsent.apiVersion === 2) {
+ return checkTCFv2(gdprConsent.vendorData);
+ }
+ }
+ return true;
+}
+
+export function checkTCFv2(vendorData, requiredPurposes = QC_TCF_REQUIRED_PURPOSES) {
+ var gdprApplies = vendorData.gdprApplies;
+ var purposes = vendorData.purpose;
+ var vendors = vendorData.vendor;
+ var qcConsent = vendors && vendors.consents && vendors.consents[QUANTCAST_VENDOR_ID];
+ var qcInterest = vendors && vendors.legitimateInterests && vendors.legitimateInterests[QUANTCAST_VENDOR_ID];
+ var restrictions = vendorData.publisher ? vendorData.publisher.restrictions : {};
+
+ if (!gdprApplies) {
+ return true;
+ }
+
+ return requiredPurposes.map(function(purpose) {
+ var purposeConsent = purposes.consents ? purposes.consents[purpose] : false;
+ var purposeInterest = purposes.legitimateInterests ? purposes.legitimateInterests[purpose] : false;
+
+ var qcRestriction = restrictions && restrictions[purpose]
+ ? restrictions[purpose][QUANTCAST_VENDOR_ID]
+ : null;
+
+ if (qcRestriction === 0) {
+ return false;
+ }
+
+ // Seek consent or legitimate interest based on our default legal
+ // basis for the purpose, falling back to the other if possible.
+ if (
+ // we have positive vendor consent
+ qcConsent &&
+ // there is positive purpose consent
+ purposeConsent &&
+ // publisher does not require legitimate interest
+ qcRestriction !== 2 &&
+ // purpose is a consent-first purpose or publisher has explicitly restricted to consent
+ (QC_TCF_CONSENT_FIRST_PURPOSES.indexOf(purpose) != -1 || qcRestriction === 1)
+ ) {
+ return true;
+ } else if (
+ // publisher does not require consent
+ qcRestriction !== 1 &&
+ // we have legitimate interest for vendor
+ qcInterest &&
+ // there is legitimate interest for purpose
+ purposeInterest &&
+ // purpose's legal basis does not require consent
+ QC_TCF_CONSENT_ONLY_PUPROSES.indexOf(purpose) == -1 &&
+ // purpose is a legitimate-interest-first purpose or publisher has explicitly restricted to legitimate interest
+ (QC_TCF_CONSENT_FIRST_PURPOSES.indexOf(purpose) == -1 || qcRestriction === 2)
+ ) {
+ return true;
+ }
+
+ return false;
+ }).reduce(function(a, b) {
+ return a && b;
+ }, true);
+}
+
+/**
+ * tests if us_privacy consent string is present, us_privacy applies, and notice_given / do-not-sell is set to yes
+ * @returns {boolean}
+ */
+export function hasCCPAConsent(usPrivacyConsent) {
+ if (
+ usPrivacyConsent &&
+ typeof usPrivacyConsent === 'string' &&
+ usPrivacyConsent.length == 4 &&
+ usPrivacyConsent.charAt(1) == 'Y' &&
+ usPrivacyConsent.charAt(2) == 'Y'
+ ) {
+ return false
+ }
+ return true;
+}
+
/** @type {Submodule} */
export const quantcastIdSubmodule = {
/**
@@ -20,6 +168,12 @@ export const quantcastIdSubmodule = {
*/
name: 'quantcastId',
+ /**
+ * Vendor id of Quantcast
+ * @type {Number}
+ */
+ gvlid: QUANTCAST_VENDOR_ID,
+
/**
* decode the stored id value for passing to bid requests
* @function
@@ -34,9 +188,35 @@ export const quantcastIdSubmodule = {
* @function
* @returns {{id: {quantcastId: string} | undefined}}}
*/
- getId() {
+ getId(config) {
// Consent signals are currently checked on the server side.
let fpa = storage.getCookie(QUANTCAST_FPA);
+
+ const coppa = coppaDataHandler.getCoppa();
+
+ if (coppa || !hasCCPAConsent(US_PRIVACY_STRING) || !hasGDPRConsent(GDPR_PRIVACY_STRING)) {
+ var expired = new Date(0).toUTCString();
+ var domain = quantcastIdSubmodule.findRootDomain();
+ logInfo('QuantcastId: Necessary consent not present for Id, exiting QuantcastId');
+ storage.setCookie(QUANTCAST_FPA, '', expired, '/', domain, null);
+ return undefined;
+ }
+
+ const configParams = (config && config.params) || {};
+ const storageParams = (config && config.storage) || {};
+
+ var clientId = configParams.clientId || '';
+ var cookieExpDays = storageParams.expires || DEFAULT_COOKIE_EXP_DAYS;
+
+ // Callbacks on Event Listeners won't trigger if the event is already complete so this check is required
+ if (document.readyState === 'complete') {
+ firePixel(clientId, cookieExpDays);
+ } else {
+ window.addEventListener('load', function () {
+ firePixel(clientId, cookieExpDays);
+ });
+ }
+
return { id: fpa ? { quantcastId: fpa } : undefined }
}
};
diff --git a/modules/quantcastIdSystem.md b/modules/quantcastIdSystem.md
new file mode 100644
index 00000000000..cf76099e4a5
--- /dev/null
+++ b/modules/quantcastIdSystem.md
@@ -0,0 +1,46 @@
+#### Overview
+
+```
+Module Name: Quantcast Id System
+Module Type: Id System
+Maintainer: asig@quantcast.com
+```
+
+#### Description
+
+ The Prebid Quantcast ID module stores a Quantcast ID in a first party cookie. The ID is then made available in the bid request. The ID from the cookie added in the bidstream allows Quantcast to more accurately bid on publisher inventories without third party cookies, which can result in better monetization across publisher sites from Quantcast. And, it’s free to use! For easier integration, you can work with one of our SSP partners, like PubMatic, who can facilitate the legal process as well as the software integration for you.
+
+ Add it to your Prebid.js package with:
+
+ `gulp build --modules=userId,quantcastIdSystem`
+
+ Quantcast’s privacy policies for the services rendered can be found at
+ https://www.quantcast.com/privacy/
+
+ Publishers deploying the module are responsible for ensuring legally required notices and choices for users.
+
+ The Quantcast ID module will only perform any action and return an ID in situations where:
+ 1. the publisher has not set a ‘coppa' flag on the prebid configuration on their site (see [pbjs.setConfig.coppa](https://docs.prebid.org/dev-docs/publisher-api-reference/setConfig.html#setConfig-coppa))
+ 2. there is not a IAB us-privacy string indicating the digital property has provided user notice and the user has made a choice to opt out of sale
+ 3. if GDPR applies, an IAB TCF v2 string exists indicating that Quantcast does not have consent for purpose 1 (cookies, device identifiers, or other information can be stored or accessed on your device for the purposes presented to you), or an established legal basis (by default legitimate interest) for purpose 10 (your data can be used to improve existing systems and software, and to develop new products).
+
+ #### Quantcast ID Configuration
+
+ | Param under userSync.userIds[] | Scope | Type | Description | Example |
+ | --- | --- | --- | --- | --- |
+ | name | Required | String | `"quantcastId"` | `"quantcastId"` |
+ | params | Optional | Object | Details for Quantcast initialization. | |
+ | params.ClientID | Optional | String | Optional parameter for Quantcast prebid managed service partners. The parameter is not required for websites with Quantcast Measure tag. Reach out to Quantcast for ClientID if you are not an existing Quantcast prebid managed service partner: quantcast-idsupport@quantcast.com. | |
+
+
+ #### Quantcast ID Example
+
+```js
+ pbjs.setConfig({
+ userSync: {
+ userIds: [{
+ name: "quantcastId"
+ }]
+ }
+ });
+```
diff --git a/modules/radsBidAdapter.js b/modules/radsBidAdapter.js
index 8f3cbe02f23..5cc88440629 100644
--- a/modules/radsBidAdapter.js
+++ b/modules/radsBidAdapter.js
@@ -7,10 +7,12 @@ const BIDDER_CODE = 'rads';
const ENDPOINT_URL = 'https://rads.recognified.net/md.request.php';
const ENDPOINT_URL_DEV = 'https://dcradn1.online-solution.biz/md.request.php';
const DEFAULT_VAST_FORMAT = 'vast2';
+const GVLID = 602;
export const spec = {
code: BIDDER_CODE,
- aliases: ['rads'],
+ gvlid: GVLID,
+ aliases: [],
supportedMediaTypes: [BANNER, VIDEO],
isBidRequestValid: function(bid) {
return !!(bid.params.placement);
@@ -18,9 +20,6 @@ export const spec = {
buildRequests: function(validBidRequests, bidderRequest) {
return validBidRequests.map(bidRequest => {
const params = bidRequest.params;
- const videoData = utils.deepAccess(bidRequest, 'mediaTypes.video') || {};
- const sizes = utils.parseSizesInput(videoData.playerSize || bidRequest.sizes)[0];
- const [width, height] = sizes.split('x');
const placementId = params.placement;
const rnd = Math.floor(Math.random() * 99999999999);
@@ -30,34 +29,37 @@ export const spec = {
let endpoint = isDev ? ENDPOINT_URL_DEV : ENDPOINT_URL;
- let payload = {};
- if (isVideoRequest(bidRequest)) {
- let vastFormat = params.vastFormat || DEFAULT_VAST_FORMAT;
- payload = {
- rt: vastFormat,
- _f: 'prebid_js',
- _ps: placementId,
- srw: width,
- srh: height,
- idt: 100,
- rnd: rnd,
- p: referrer,
- bid_id: bidId,
- };
+ let payload = {
+ _f: 'prebid_js',
+ _ps: placementId,
+ idt: 100,
+ rnd: rnd,
+ p: referrer,
+ bid_id: bidId,
+ };
+
+ let sizes;
+ if (isBannerRequest(bidRequest)) {
+ sizes = getBannerSizes(bidRequest);
+ payload.rt = 'bid-response';
+ payload.srw = sizes[0].width;
+ payload.srh = sizes[0].height;
} else {
- payload = {
- rt: 'bid-response',
- _f: 'prebid_js',
- _ps: placementId,
- srw: width,
- srh: height,
- idt: 100,
- rnd: rnd,
- p: referrer,
- bid_id: bidId,
- };
+ let vastFormat = params.vastFormat || DEFAULT_VAST_FORMAT;
+ sizes = getVideoSizes(bidRequest);
+ payload.rt = vastFormat;
+ payload.srw = sizes[0].width;
+ payload.srh = sizes[0].height;
}
- prepareExtraParams(params, payload, bidderRequest);
+
+ if (sizes.length > 1) {
+ payload.alt_ad_sizes = [];
+ for (let i = 1; i < sizes.length; i++) {
+ payload.alt_ad_sizes.push(sizes[i].width + 'x' + sizes[i].height);
+ }
+ }
+
+ prepareExtraParams(params, payload, bidderRequest, bidRequest);
return {
method: 'GET',
@@ -84,7 +86,10 @@ export const spec = {
dealId: dealId,
currency: currency,
netRevenue: netRevenue,
- ttl: config.getConfig('_bidderTimeout')
+ ttl: config.getConfig('_bidderTimeout'),
+ meta: {
+ advertiserDomains: response.adomain || []
+ }
};
if (response.vastXml) {
@@ -114,17 +119,19 @@ export const spec = {
}
}
- if (syncOptions.iframeEnabled) {
- serverResponses[0].body.userSync.iframeUrl.forEach((url) => syncs.push({
- type: 'iframe',
- url: appendToUrl(url, gdprParams)
- }));
- }
- if (syncOptions.pixelEnabled && serverResponses.length > 0) {
- serverResponses[0].body.userSync.imageUrl.forEach((url) => syncs.push({
- type: 'image',
- url: appendToUrl(url, gdprParams)
- }));
+ if (serverResponses.length > 0 && serverResponses[0].body.userSync) {
+ if (syncOptions.iframeEnabled) {
+ serverResponses[0].body.userSync.iframeUrl.forEach((url) => syncs.push({
+ type: 'iframe',
+ url: appendToUrl(url, gdprParams)
+ }));
+ }
+ if (syncOptions.pixelEnabled) {
+ serverResponses[0].body.userSync.imageUrl.forEach((url) => syncs.push({
+ type: 'image',
+ url: appendToUrl(url, gdprParams)
+ }));
+ }
}
return syncs;
}
@@ -151,18 +158,15 @@ function objectToQueryString(obj, prefix) {
}
return str.join('&');
}
-
/**
- * Check if it's a video bid request
+ * Add extra params to server request
*
- * @param {BidRequest} bid - Bid request generated from ad slots
- * @returns {boolean} True if it's a video bid
+ * @param params
+ * @param payload
+ * @param bidderRequest
+ * @param {BidRequest} bidRequest - Bid request generated from ad slots
*/
-function isVideoRequest(bid) {
- return bid.mediaType === 'video' || !!utils.deepAccess(bid, 'mediaTypes.video');
-}
-
-function prepareExtraParams(params, payload, bidderRequest) {
+function prepareExtraParams(params, payload, bidderRequest, bidRequest) {
if (params.pfilter !== undefined) {
payload.pfilter = params.pfilter;
}
@@ -196,6 +200,77 @@ function prepareExtraParams(params, payload, bidderRequest) {
if (params.ip !== undefined) {
payload.i = params.ip;
}
+
+ if (bidRequest.userId && bidRequest.userId.netId) {
+ payload.did_netid = bidRequest.userId.netId;
+ }
+ if (bidRequest.userId && bidRequest.userId.uid2) {
+ payload.did_uid2 = bidRequest.userId.uid2;
+ }
+}
+
+/**
+ * Check if it's a banner bid request
+ *
+ * @param {BidRequest} bid - Bid request generated from ad slots
+ * @returns {boolean} True if it's a banner bid
+ */
+function isBannerRequest(bid) {
+ return bid.mediaType === 'banner' || !!utils.deepAccess(bid, 'mediaTypes.banner') || !isVideoRequest(bid);
+}
+
+/**
+ * Check if it's a video bid request
+ *
+ * @param {BidRequest} bid - Bid request generated from ad slots
+ * @returns {boolean} True if it's a video bid
+ */
+function isVideoRequest(bid) {
+ return bid.mediaType === 'video' || !!utils.deepAccess(bid, 'mediaTypes.video');
+}
+
+/**
+ * Get video sizes
+ *
+ * @param {BidRequest} bid - Bid request generated from ad slots
+ * @returns {object} True if it's a video bid
+ */
+function getVideoSizes(bid) {
+ return parseSizes(utils.deepAccess(bid, 'mediaTypes.video.playerSize') || bid.sizes);
+}
+
+/**
+ * Get banner sizes
+ *
+ * @param {BidRequest} bid - Bid request generated from ad slots
+ * @returns {object} True if it's a video bid
+ */
+function getBannerSizes(bid) {
+ return parseSizes(utils.deepAccess(bid, 'mediaTypes.banner.sizes') || bid.sizes);
+}
+
+/**
+ * Parse size
+ * @param sizes
+ * @returns {width: number, h: height}
+ */
+function parseSize(size) {
+ let sizeObj = {}
+ sizeObj.width = parseInt(size[0], 10);
+ sizeObj.height = parseInt(size[1], 10);
+ return sizeObj;
+}
+
+/**
+ * Parse sizes
+ * @param sizes
+ * @returns {{width: number , height: number }[]}
+ */
+function parseSizes(sizes) {
+ if (Array.isArray(sizes[0])) { // is there several sizes ? (ie. [[728,90],[200,300]])
+ return sizes.map(size => parseSize(size));
+ }
+ return [parseSize(sizes)]; // or a single one ? (ie. [728,90])
}
registerBidder(spec);
diff --git a/modules/radsBidAdapter.md b/modules/radsBidAdapter.md
index 6e970093154..a00b82e20cb 100644
--- a/modules/radsBidAdapter.md
+++ b/modules/radsBidAdapter.md
@@ -25,6 +25,7 @@ RADS Bidder Adapter for Prebid.js 1.x
bidder: "rads",
params: {
placement: 3, // placement ID
+ vastFormat: "vast2", // vast2(default) or vast4
devMode: true // if true: library uses dev server for tests
}
}
diff --git a/modules/realvuAnalyticsAdapter.js b/modules/realvuAnalyticsAdapter.js
index 95e62397c2c..5540d136dea 100644
--- a/modules/realvuAnalyticsAdapter.js
+++ b/modules/realvuAnalyticsAdapter.js
@@ -42,7 +42,7 @@ export let lib = {
init: function () {
let z = this;
let u = navigator.userAgent;
- z.device = u.match(/iPad|Tablet/gi) ? 'tablet' : u.match(/iPhone|iPod|Android|Opera Mini|IEMobile/gi) ? 'mobile' : 'desktop';
+ z.device = u.match(/iPhone|iPod|Android|Opera Mini|IEMobile/gi) ? 'mobile' : 'desktop';
if (typeof (z.len) == 'undefined') z.len = 0;
z.ie = navigator.appVersion.match(/MSIE/);
z.saf = (u.match(/Safari/) && !u.match(/Chrome/));
@@ -306,28 +306,46 @@ export let lib = {
if (!restored) {
a.target = z.questA(a.div);
let target = (a.target !== null) ? a.target : a.div;
- a.box.w = Math.max(target.offsetWidth, a.w);
- a.box.h = Math.max(target.offsetHeight, a.h);
- let q = z.findPosG(target);
- let pad = {};
- pad.t = z.padd(target, 'Top');
- pad.l = z.padd(target, 'Left');
- pad.r = z.padd(target, 'Right');
- pad.b = z.padd(target, 'Bottom');
- let ax = q.x + pad.l;
- let ay = q.y + pad.t;
- a.box.x = ax;
- a.box.y = ay;
- if (a.box.w > a.w && a.box.w > 1) {
- ax += (a.box.w - a.w - pad.l - pad.r) / 2;
- }
- if (a.box.h > a.h && a.box.h > 1) {
- ay += (a.box.h - a.h - pad.t - pad.b) / 2;
- }
- if ((ax > 0 && ay > 0) && (a.x != ax || a.y != ay)) {
- a.x = ax;
- a.y = ay;
- z.writePos(a);
+ if (window.getComputedStyle(target).display == 'none') {
+ let targSibl = target.previousElementSibling; // for 'none' containers on mobile define y as previous sibling y+h
+ if (targSibl) {
+ let q = z.findPosG(targSibl);
+ a.x = q.x;
+ a.y = q.y + targSibl.offsetHeight;
+ } else {
+ target = target.parentNode;
+ let q = z.findPosG(target);
+ a.x = q.x;
+ a.y = q.y;
+ }
+ a.box.x = a.x;
+ a.box.y = a.y;
+ a.box.w = a.w;
+ a.box.h = a.h;
+ } else {
+ a.box.w = Math.max(target.offsetWidth, a.w);
+ a.box.h = Math.max(target.offsetHeight, a.h);
+ let q = z.findPosG(target);
+ let pad = {};
+ pad.t = z.padd(target, 'Top');
+ pad.l = z.padd(target, 'Left');
+ pad.r = z.padd(target, 'Right');
+ pad.b = z.padd(target, 'Bottom');
+ let ax = q.x + pad.l;
+ let ay = q.y + pad.t;
+ a.box.x = ax;
+ a.box.y = ay;
+ if (a.box.w > a.w && a.box.w > 1) {
+ ax += (a.box.w - a.w - pad.l - pad.r) / 2;
+ }
+ if (a.box.h > a.h && a.box.h > 1) {
+ ay += (a.box.h - a.h - pad.t - pad.b) / 2;
+ }
+ if ((ax > 0 && ay > 0) && (a.x != ax || a.y != ay)) {
+ a.x = ax;
+ a.y = ay;
+ z.writePos(a);
+ }
}
}
let vtr = ((a.box.w * a.box.h) < 242500) ? 49 : 29; // treashfold more then 49% and more then 29% for "oversized"
@@ -670,7 +688,7 @@ export let lib = {
};
}
let a = window.top1.realvu_aa.check(p1);
- return a.r;
+ return a.riff;
},
checkBidIn: function(partnerId, args, b) { // process a bid from hb
diff --git a/modules/reklamstoreBidAdapter.js b/modules/reklamstoreBidAdapter.js
deleted file mode 100644
index 3d78cf95978..00000000000
--- a/modules/reklamstoreBidAdapter.js
+++ /dev/null
@@ -1,148 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'reklamstore';
-const ENDPOINT_URL = 'https://ads.rekmob.com/m/prebid';
-const CURRENCY = 'USD';
-const TIME_TO_LIVE = 360;
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [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) {
- return !!(bid.params.regionId);
- },
- /**
- * 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 url = bidderRequest.refererInfo.referer;
- let requests = [];
- utils._each(validBidRequests, function(bid) {
- requests.push({
- method: 'GET',
- url: ENDPOINT_URL,
- data: {
- regionId: bid.params.regionId,
- dt: getDeviceType(),
- os: getOS(),
- ref: extractDomain(url),
- _: (new Date().getTime()),
- mobile_web: 1
- },
- bidId: bid.bidId
- });
- });
- return requests;
- },
-
- /**
- * 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, bidRequest) {
- try {
- const bidResponse = serverResponse.body;
- const bidResponses = [];
- if (bidResponse) {
- bidResponses.push({
- requestId: bidRequest.bidId,
- cpm: parseFloat(bidResponse.cpm),
- width: bidResponse.w,
- height: bidResponse.h,
- creativeId: bidResponse.adId || 1,
- currency: CURRENCY,
- netRevenue: true,
- ttl: TIME_TO_LIVE,
- ad: bidResponse.ad
- });
- }
- return bidResponses;
- } catch (err) {
- utils.logError(err);
- 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: function(syncOptions, serverResponses) {
- const syncs = [];
- utils._each(serverResponses, function(bidResponse) {
- utils._each(bidResponse.body.syncs, function(sync) {
- if (syncOptions.pixelEnabled && sync.type == 'image') {
- syncs.push({
- type: sync.type,
- url: sync.url
- });
- } else if (syncOptions.iframeEnabled && sync.type == 'iframe') {
- syncs.push({
- type: sync.type,
- url: sync.url
- });
- }
- });
- });
- return syncs;
- }
-}
-registerBidder(spec);
-
-function getDeviceType() {
- let PHONE = 0;
- let TABLET = 2;
- let DESKTOP = 3;
- if (isPhone()) {
- return PHONE;
- } else if (isTablet()) {
- return TABLET;
- } else {
- return DESKTOP;
- }
-}
-function isPhone() {
- var check = false;
- (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true })(navigator.userAgent || navigator.vendor || window.opera);
- return check;
-}
-function isTablet() {
- var check = false;
- (function(a) { if (/ipad|android|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(a)) { check = true; } })(navigator.userAgent || navigator.vendor || window.opera);
- return check;
-}
-function getOS() {
- var ua = navigator.userAgent;
- if (ua.match(/(iPhone|iPod|iPad)/)) {
- return '1';
- } else if (ua.match(/Android/)) {
- return '0';
- } else {
- return '3';
- }
-}
-function extractDomain(url) {
- var domain;
- if (url.indexOf('://') > -1) {
- domain = url.split('/')[2];
- } else {
- domain = url.split('/')[0];
- }
- domain = domain.split(':')[0];
- return domain;
-}
diff --git a/modules/relaidoBidAdapter.js b/modules/relaidoBidAdapter.js
index 92709b7c047..14effa263a3 100644
--- a/modules/relaidoBidAdapter.js
+++ b/modules/relaidoBidAdapter.js
@@ -6,7 +6,7 @@ import { getStorageManager } from '../src/storageManager.js';
const BIDDER_CODE = 'relaido';
const BIDDER_DOMAIN = 'api.relaido.jp';
-const ADAPTER_VERSION = '1.0.3';
+const ADAPTER_VERSION = '1.0.5';
const DEFAULT_TTL = 300;
const UUID_KEY = 'relaido_uuid';
@@ -112,6 +112,10 @@ function interpretResponse(serverResponse, bidRequest) {
ttl: body.ttl || DEFAULT_TTL,
netRevenue: true,
mediaType: mediaType,
+ meta: {
+ advertiserDomains: body.adomain || [],
+ mediaType: VIDEO
+ }
};
if (mediaType === VIDEO) {
bidResponse.vastXml = body.vast;
@@ -136,7 +140,7 @@ function getUserSyncs(syncOptions, serverResponses) {
}
return [{
type: 'iframe',
- url: syncUrl
+ url: `${syncUrl}?uu=${getUuid()}`
}];
}
diff --git a/modules/reloadBidAdapter.js b/modules/reloadBidAdapter.js
deleted file mode 100644
index 94ea4be281f..00000000000
--- a/modules/reloadBidAdapter.js
+++ /dev/null
@@ -1,419 +0,0 @@
-import {
- registerBidder
-}
- from '../src/adapters/bidderFactory.js';
-import * as utils from '../src/utils.js';
-import { getStorageManager } from '../src/storageManager.js';
-
-const storage = getStorageManager();
-
-const BIDDER_CODE = 'reload';
-const VERSION_ADAPTER = '1.10';
-export const spec = {
- code: BIDDER_CODE,
- png: {},
- /**
- * 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 && bid.params.plcmID && bid.params.partID && 'opdomID' in bid.params &&
- 'bsrvID' in bid.params && bid.params.bsrvID >= 0 && bid.params.bsrvID <= 99);
- },
- /**
- * 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) {
- let vRequests = [];
- let bidReq = {
- id: Math.random().toString(10).substring(2),
- imp: []
- };
- let vgdprConsent = null;
- if (utils.deepAccess(bidderRequest, 'gdprConsent')) {
- vgdprConsent = bidderRequest.gdprConsent;
- }
- let vPrxClientTool = null;
- let vSrvUrl = null;
- for (let vIdx = 0; vIdx < validBidRequests.length; vIdx++) {
- let bidRequest = validBidRequests[vIdx];
- vPrxClientTool = new ReloadClientTool({
- prxVer: VERSION_ADAPTER,
- prxType: 'bd',
- plcmID: bidRequest.params.plcmID,
- partID: bidRequest.params.partID,
- opdomID: bidRequest.params.opdomID,
- bsrvID: bidRequest.params.bsrvID,
- gdprObj: vgdprConsent,
- mediaObj: bidRequest.mediaTypes,
- wnd: utils.getWindowTop(),
- rtop: utils.deepAccess(bidderRequest, 'refererInfo.reachedTop') || false
- });
- if (vSrvUrl === null) vSrvUrl = vPrxClientTool.getSrvUrl();
- let vImpression = {
- id: bidRequest.bidId,
- bidId: bidRequest.bidId,
- adUnitCode: bidRequest.adUnitCode,
- transactionId: bidRequest.transactionId,
- bidderRequestId: bidRequest.bidderRequestId,
- auctionId: bidRequest.auctionId,
- banner: {
- ext: {
- type: bidRequest.params.type || 'pcm',
- pcmdata: vPrxClientTool.getPCMObj()
- }
- }
- };
- bidReq.imp.push(vImpression);
- }
- if (bidReq.imp.length > 0) {
- const payloadString = JSON.stringify(bidReq);
- vRequests.push({
- method: 'POST',
- url: vSrvUrl,
- data: payloadString
- });
- }
- return vRequests;
- },
- /**
- * 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, bidRequest) {
- const serverBody = serverResponse.body;
- const bidResponses = [];
- for (let vIdx = 0; vIdx < serverBody.seatbid.length; vIdx++) {
- let vSeatBid = serverBody.seatbid[vIdx];
- for (let vIdxBid = 0; vIdxBid < vSeatBid.bid.length; vIdxBid++) {
- let vBid = vSeatBid.bid[vIdxBid];
- let vPrxClientTool = new ReloadClientTool({
- plcmID: vBid.ext.plcmID,
- partID: vBid.ext.partID,
- opdomID: vBid.ext.opdomID,
- bsrvID: vBid.ext.bsrvID
- });
- vPrxClientTool.setPCMObj(vBid.ext.pcmdata);
- if (vPrxClientTool.getBP() > 0) {
- let bidResponse = {
- requestId: vBid.impid,
- ad: vPrxClientTool.getAM(),
- cpm: vPrxClientTool.getBP() / 100,
- width: vPrxClientTool.getW(),
- height: vPrxClientTool.getH(),
- creativeId: vBid.id,
- currency: vPrxClientTool.getBC(),
- ttl: 300,
- netRevenue: true
- };
- bidResponses.push(bidResponse);
- this.png[vBid.ext.adUnitCode] = vPrxClientTool.getPingUrl('bidwon');
- }
- }
- }
- return bidResponses;
- },
- /**
- * Register bidder specific code, which will execute if a bid from this bidder won the auction
- * @param {Bid} The bid that won the auction
- */
- onBidWon: function (bid) {
- if (typeof this.png[bid.adUnitCode] !== 'string' || this.png[bid.adUnitCode] === '') return;
- (new Image()).src = this.png[bid.adUnitCode];
- }
-};
-
-function ReloadClientTool(args) {
- var that = this;
- var _pcmClientVersion = '120';
- var _pcmFilePref = 'prx_root_';
- var _resFilePref = 'prx_pnws_';
- var _pcmInputObjVers = '120';
- var _instObj = null;
- var _status = 'NA';
- var _message = '';
- var _log = '';
- var _memFile = _getMemFile();
-
- if (_memFile.status !== 'ok') {
- _log += 'WARNING: clnt-int mem file initialized\n';
- }
-
- that.getPCMObj = function () {
- return {
- thisVer: _pcmInputObjVers,
- statStr: _memFile.statStr,
- plcmData: _getPlcmData(),
- clntData: _getClientData(args.wnd, args.rtop),
- resultData: _getRD(),
- gdprObj: _getGdpr(),
- mediaObj: _getMediaObj(),
- proxetString: null,
- dboData: null,
- plcmSett: null,
- };
- };
-
- that.setPCMObj = function (obj) {
- if (obj.thisVer !== '100') {
- _status = 'error';
- _message = 'incomp_output_obj_version';
- _log += ' ERROR incomp_output_obj_version';
- return;
- }
-
- _status = obj.status;
- _message = obj.message;
- _log += ' ' + obj.log;
-
- if (obj.status !== 'ok') return;
-
- _saveMemFile(obj.statStr, obj.srvUrl);
- _instObj = obj.instr;
- };
-
- that.getSrvUrl = function () {
- var effSrvUrl = getBidServerUrl(0);
-
- if (isNaN(parseInt(args.bsrvID)) !== true) effSrvUrl = getBidServerUrl(parseInt(args.bsrvID));
-
- if (typeof _memFile.srvUrl === 'string' && _memFile.srvUrl !== '') effSrvUrl = _memFile.srvUrl;
-
- return 'https://' + effSrvUrl + '/bid';
-
- function getBidServerUrl (idx) {
- return 'bidsrv' + getTwoDigitString(idx) + '.reload.net';
-
- function getTwoDigitString (idx) {
- if (idx >= 10) return '' + idx;
- else return '0' + idx;
- }
- }
- };
-
- that.getMT = function () {
- return _checkInstProp('mtype', 'dsp');
- };
-
- that.getW = function () {
- return _checkInstProp('width', 0);
- };
-
- that.getH = function () {
- return _checkInstProp('height', 0);
- };
-
- that.getBP = function () {
- return _checkInstProp('prc', 0);
- };
-
- that.getBC = function () {
- return _checkInstProp('cur', 'USD');
- };
-
- that.getAM = function () {
- return _checkInstProp('am', null);
- };
-
- that.getPingUrl = function (pingName) {
- var pingData = _checkInstProp('pingdata', {});
- if (pingData[pingName] !== 'undefined') return pingData[pingName];
- return '';
- };
-
- that.setRD = function (data) {
- return _setRD(data);
- };
-
- that.getStat = function () {
- return _status;
- };
-
- that.getMsg = function () {
- return _message;
- };
-
- that.getLog = function () {
- return _log;
- };
-
- function _checkInstProp (key, def) {
- if (_instObj === null) return def;
- if (typeof _instObj === 'undefined') return def;
- if (_instObj.go !== true) return def;
- if (typeof _instObj[key] === 'undefined') return def;
- return _instObj[key];
- }
-
- function _getPlcmData () {
- return {
- prxVer: args.prxVer,
- prxType: args.prxType,
- plcmID: args.plcmID,
- partID: args.partID,
- opdomID: args.opdomID,
- bsrvID: args.bsrvID,
- dmod: args.dmod,
- lmod: args.lmod,
- lplcmID: args.lplcmID,
- };
- }
-
- function _getClientData (wnd, rtop) {
- return {
- version: 200,
- locTime: Date.now(),
- winInfo: _winInf(wnd),
- envInfo: getEnvInfo(),
- topw: rtop === true,
- prot: wnd.document.location.protocol,
- host: wnd.document.location.host,
- title: wnd.document.title,
- };
-
- function _winInf (wnd) {
- return {
- phs: {
- w: wnd.screen.width,
- h: wnd.screen.height
- },
- avl: {
- w: wnd.screen.availWidth,
- h: wnd.screen.availHeight
- },
- inr: {
- w: wnd.innerWidth,
- h: wnd.innerHeight
- },
- bdy: {
- w: wnd.document.body.clientWidth,
- h: wnd.document.body.clientHeight
- }
- };
- }
-
- function getEnvInfo() {
- return {
- userAgent: navigator.userAgent,
- appName: navigator.appName,
- appVersion: navigator.appVersion
- };
- }
- }
-
- function _getMemFile () {
- try {
- var memFileObj = _getItem(_getMemFileName());
-
- if (memFileObj === null) throw { s: 'init' };
-
- if (typeof memFileObj.statStr !== 'string') throw { s: 'error' };
- if (typeof memFileObj.srvUrl !== 'string') throw { s: 'error' };
-
- memFileObj.status = 'ok';
-
- return memFileObj;
- } catch (err) {
- var retObj = {
- statStr: null,
- srvUrl: null
- };
- retObj.status = err.s;
-
- return retObj;
- }
- }
-
- function _saveMemFile (statStr, srvUrl) {
- try {
- var fileData = {
- statStr: statStr,
- srvUrl: srvUrl,
- };
- _setItem(_getMemFileName(), fileData);
- return true;
- } catch (err) {
- return false;
- }
- }
-
- function _getMemFileName () {
- return _pcmFilePref + args.plcmID + '_' + args.partID;
- }
-
- function _getRD () {
- try {
- return _getItem(_getResltStatusFileName());
- } catch (err) {
- return null;
- }
- }
-
- function _setRD (fileData) {
- try {
- _setItem(_getResltStatusFileName(), fileData);
- return true;
- } catch (err) {
- return false;
- }
- }
-
- function _getGdpr() {
- return args.gdprObj;
- }
-
- function _getMediaObj() {
- return args.mediaObj;
- }
-
- function _getResltStatusFileName () {
- if (args.lmod === true) return _resFilePref + args.lplcmID + '_' + args.partID;
- else return _resFilePref + args.plcmID + '_' + args.partID;
- }
-
- function _setItem (name, data) {
- var stgFileObj = {
- ver: _pcmClientVersion,
- ts: Date.now(),
- };
-
- if (typeof data === 'string') {
- stgFileObj.objtype = false;
- stgFileObj.memdata = data;
- } else {
- stgFileObj.objtype = true;
- stgFileObj.memdata = JSON.stringify(data);
- }
-
- var stgFileStr = JSON.stringify(stgFileObj);
-
- storage.setDataInLocalStorage(name, stgFileStr);
-
- return true;
- }
-
- function _getItem (name) {
- try {
- var obStgFileStr = storage.getDataFromLocalStorage(name);
- if (obStgFileStr === null) return null;
-
- var stgFileObj = JSON.parse(obStgFileStr);
-
- if (stgFileObj.ver !== _pcmClientVersion) throw { message: 'version_error' };
-
- if (stgFileObj.objtype === true) return JSON.parse(stgFileObj.memdata);
- else return '' + stgFileObj.memdata;
- } catch (err) {
- return null;
- }
- }
-};
-
-registerBidder(spec);
diff --git a/modules/smartrtbBidAdapter.js b/modules/resetdigitalBidAdapter.js
similarity index 76%
rename from modules/smartrtbBidAdapter.js
rename to modules/resetdigitalBidAdapter.js
index de303f9e4b2..adfd8a9a9af 100644
--- a/modules/smartrtbBidAdapter.js
+++ b/modules/resetdigitalBidAdapter.js
@@ -2,28 +2,18 @@
import * as utils from '../src/utils.js';
import { config } from '../src/config.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
-const BIDDER_CODE = 'smartrtb';
-
-function getDomain () {
- if (!utils.inIframe()) {
- return window.location.hostname
- }
- let origins = window.document.location.ancestorOrigins
- if (origins && origins.length > 0) {
- return origins[origins.length - 1]
- }
-}
+import {getOrigin} from '../src/utils.js';
+const BIDDER_CODE = 'resetdigital';
export const spec = {
code: BIDDER_CODE,
supportedMediaTypes: [ 'banner', 'video' ],
- aliases: ['rdigital'],
isBidRequestValid: function(bid) {
- return (bid.params.pubId !== null || bid.params.zoneId !== null);
+ return (!!(bid.params.pubId || bid.params.zoneId));
},
buildRequests: function(validBidRequests, bidderRequest) {
let stack = (bidderRequest.refererInfo &&
- bidderRequest.refererInfo.stack ? bidderRequest.refererInfo
+ bidderRequest.refererInfo.stack ? bidderRequest.refererInfo.stack
: [])
let spb = (config.getConfig('userSync') && config.getConfig('userSync').syncsPerBidder)
@@ -33,7 +23,7 @@ export const spec = {
start_time: utils.timestamp(),
language: window.navigator.userLanguage || window.navigator.language,
site: {
- domain: getDomain(),
+ domain: getOrigin(),
iframe: !bidderRequest.refererInfo.reachedTop,
url: stack && stack.length > 0 ? [stack.length - 1] : null,
https: (window.location.protocol === 'https:'),
@@ -55,18 +45,18 @@ export const spec = {
let req = validBidRequests[x]
payload.imps.push({
+ pub_id: req.params.pubId,
zone_id: req.params.zoneId,
bid_id: req.bidId,
imp_id: req.transactionId,
sizes: req.sizes,
force_bid: req.params.forceBid,
- media_types: utils.deepAccess(req, 'mediaTypes'),
- has_renderer: (req.renderer !== undefined)
+ media_types: utils.deepAccess(req, 'mediaTypes')
});
}
let params = validBidRequests[0].params
- let url = params.endpoint ? params.endpoint : 'https://market-global.smrtb.com/json/publisher/prebid'
+ let url = params.endpoint ? params.endpoint : '//hb.vhsrv.com'
return {
method: 'POST',
url: url,
@@ -100,13 +90,16 @@ export const spec = {
creativeId: bid.crid,
dealId: bid.deal_id,
netRevenue: true,
- currency: 'USD'
+ currency: 'USD',
+ meta: {
+ advertiserDomains: bid.adomain
+ }
})
}
return bidResponses;
},
- getUserSyncs: function(syncOptions, serverResponses) {
+ getUserSyncs: function(syncOptions, serverResponses, gdprConsent) {
const syncs = []
if (!serverResponses.length || !serverResponses[0].body) {
@@ -118,11 +111,23 @@ export const spec = {
return syncs
}
+ let gdprParams = null
+ if (gdprConsent) {
+ if (typeof gdprConsent.gdprApplies === 'boolean') {
+ gdprParams = `gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`
+ } else {
+ gdprParams = `gdpr_consent=${gdprConsent.consentString}`
+ }
+ }
+
for (let x = 0; x < pixels.length; x++) {
let pixel = pixels[x]
if ((pixel.type === 'iframe' && syncOptions.iframeEnabled) ||
(pixel.type === 'image' && syncOptions.pixelEnabled)) {
+ if (gdprParams && gdprParams.length) {
+ pixel = (pixel.indexOf('?') === -1 ? '?' : '&') + gdprParams
+ }
syncs.push(pixel)
}
}
diff --git a/modules/resetdigitalBidAdapter.md b/modules/resetdigitalBidAdapter.md
new file mode 100644
index 00000000000..2f9f69b5e84
--- /dev/null
+++ b/modules/resetdigitalBidAdapter.md
@@ -0,0 +1,37 @@
+# Overview
+
+```
+Module Name: ResetDigital Bidder Adapter
+Module Type: Bidder Adapter
+Maintainer: bruce@resetdigital.co
+```
+
+# Description
+
+Prebid adapter for Reset Digital. Requires approval and account setup.
+Video is supported but requires a publisher supplied renderer at this time.
+
+# Test Parameters
+
+## Web
+```
+ var adUnits = [
+ {
+ code: 'your-div',
+ mediaTypes: {
+ banner: {
+ sizes: [[300,250]]
+ }
+ },
+ bids: [
+ {
+ bidder: "resetdigital",
+ params: {
+ pubId: "your-pub-id",
+ forceBid: true
+ }
+ }
+ ]
+ }
+ ];
+```
diff --git a/modules/resultsmediaBidAdapter.js b/modules/resultsmediaBidAdapter.js
deleted file mode 100644
index beb9991e1e2..00000000000
--- a/modules/resultsmediaBidAdapter.js
+++ /dev/null
@@ -1,269 +0,0 @@
-'use strict';
-
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-
-function ResultsmediaAdapter() {
- this.code = 'resultsmedia';
- this.aliases = ['resultsmedia'];
- this.supportedMediaTypes = [VIDEO, BANNER];
-
- let SUPPORTED_VIDEO_PROTOCOLS = [2, 3, 5, 6];
- let SUPPORTED_VIDEO_MIMES = ['video/mp4'];
- let SUPPORTED_VIDEO_PLAYBACK_METHODS = [1, 2, 3, 4];
- let SUPPORTED_VIDEO_DELIVERY = [1];
- let SUPPORTED_VIDEO_API = [1, 2, 5];
- let slotsToBids = {};
- let that = this;
- let version = '2.1';
-
- this.isBidRequestValid = function (bid) {
- return !!(bid.params && bid.params.zoneId);
- };
-
- this.getUserSyncs = function (syncOptions, responses, gdprConsent) {
- return [];
- };
-
- function frameImp(BRs, bidderRequest) {
- var impList = [];
- var isSecure = 0;
- if (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.stack.length) {
- // clever trick to get the protocol
- var el = document.createElement('a');
- el.href = bidderRequest.refererInfo.stack[0];
- isSecure = (el.protocol == 'https:') ? 1 : 0;
- }
- for (var i = 0; i < BRs.length; i++) {
- slotsToBids[BRs[i].adUnitCode] = BRs[i];
- var impObj = {};
- impObj.id = BRs[i].adUnitCode;
- impObj.secure = isSecure;
-
- if (utils.deepAccess(BRs[i], 'mediaTypes.banner') || utils.deepAccess(BRs[i], 'mediaType') === 'banner') {
- let banner = frameBanner(BRs[i]);
- if (banner) {
- impObj.banner = banner;
- }
- }
- if (utils.deepAccess(BRs[i], 'mediaTypes.video') || utils.deepAccess(BRs[i], 'mediaType') === 'video') {
- impObj.video = frameVideo(BRs[i]);
- }
- if (!(impObj.banner || impObj.video)) {
- continue;
- }
- impObj.ext = frameExt(BRs[i]);
- impList.push(impObj);
- }
- return impList;
- }
-
- function frameSite(bidderRequest) {
- var site = {
- domain: '',
- page: '',
- ref: ''
- }
- if (bidderRequest && bidderRequest.refererInfo) {
- var ri = bidderRequest.refererInfo;
- site.ref = ri.referer;
-
- if (ri.stack.length) {
- site.page = ri.stack[ri.stack.length - 1];
-
- // clever trick to get the domain
- var el = document.createElement('a');
- el.href = ri.stack[0];
- site.domain = el.hostname;
- }
- }
- return site;
- }
-
- function frameDevice() {
- return {
- ua: navigator.userAgent,
- ip: '', // Empty Ip string is required, server gets the ip from HTTP header
- dnt: utils.getDNT() ? 1 : 0,
- }
- }
-
- function getValidSizeSet(dimensionList) {
- let w = parseInt(dimensionList[0]);
- let h = parseInt(dimensionList[1]);
- // clever check for NaN
- if (! (w !== w || h !== h)) { // eslint-disable-line
- return [w, h];
- }
- return false;
- }
-
- function frameBanner(adUnit) {
- // adUnit.sizes is scheduled to be deprecated, continue its support but prefer adUnit.mediaTypes.banner
- var sizeList = adUnit.sizes;
- if (adUnit.mediaTypes && adUnit.mediaTypes.banner) {
- sizeList = adUnit.mediaTypes.banner.sizes;
- }
- var sizeStringList = utils.parseSizesInput(sizeList);
- var format = [];
- sizeStringList.forEach(function(size) {
- if (size) {
- var dimensionList = getValidSizeSet(size.split('x'));
- if (dimensionList) {
- format.push({
- 'w': dimensionList[0],
- 'h': dimensionList[1],
- });
- }
- }
- });
- if (format.length) {
- return {
- 'format': format
- };
- }
-
- return false;
- }
-
- function frameVideo(bid) {
- var size = [];
- if (utils.deepAccess(bid, 'mediaTypes.video.playerSize')) {
- var dimensionSet = bid.mediaTypes.video.playerSize;
- if (utils.isArray(bid.mediaTypes.video.playerSize[0])) {
- dimensionSet = bid.mediaTypes.video.playerSize[0];
- }
- var validSize = getValidSizeSet(dimensionSet)
- if (validSize) {
- size = validSize;
- }
- }
- return {
- mimes: utils.deepAccess(bid, 'mediaTypes.video.mimes') || SUPPORTED_VIDEO_MIMES,
- protocols: utils.deepAccess(bid, 'mediaTypes.video.protocols') || SUPPORTED_VIDEO_PROTOCOLS,
- w: size[0],
- h: size[1],
- startdelay: utils.deepAccess(bid, 'mediaTypes.video.startdelay') || 0,
- skip: utils.deepAccess(bid, 'mediaTypes.video.skip') || 0,
- playbackmethod: utils.deepAccess(bid, 'mediaTypes.video.playbackmethod') || SUPPORTED_VIDEO_PLAYBACK_METHODS,
- delivery: utils.deepAccess(bid, 'mediaTypes.video.delivery') || SUPPORTED_VIDEO_DELIVERY,
- api: utils.deepAccess(bid, 'mediaTypes.video.api') || SUPPORTED_VIDEO_API,
- }
- }
-
- function frameExt(bid) {
- return {
- bidder: {
- zoneId: bid.params['zoneId']
- }
- }
- }
-
- function frameBid(BRs, bidderRequest) {
- let bid = {
- id: BRs[0].bidderRequestId,
- imp: frameImp(BRs, bidderRequest),
- site: frameSite(bidderRequest),
- device: frameDevice(),
- user: {
- ext: {
- consent: utils.deepAccess(bidderRequest, 'gdprConsent.gdprApplies') ? bidderRequest.gdprConsent.consentString : ''
- }
- },
- at: 1,
- tmax: 1000,
- regs: {
- ext: {
- gdpr: utils.deepAccess(bidderRequest, 'gdprConsent.gdprApplies') ? Boolean(bidderRequest.gdprConsent.gdprApplies & 1) : false
- }
- }
- };
- if (BRs[0].schain) {
- bid.source = {
- 'ext': {
- 'schain': BRs[0].schain
- }
- }
- }
- return bid;
- }
-
- function getFirstParam(key, validBidRequests) {
- for (let i = 0; i < validBidRequests.length; i++) {
- if (validBidRequests[i].params && validBidRequests[i].params[key]) {
- return validBidRequests[i].params[key];
- }
- }
- }
-
- this.buildRequests = function (BRs, bidderRequest) {
- let fallbackZoneId = getFirstParam('zoneId', BRs);
- if (fallbackZoneId === undefined || BRs.length < 1) {
- return [];
- }
-
- var uri = 'https://bid306.rtbsrv.com/bidder/?bid=3mhdom&zoneId=' + fallbackZoneId;
-
- var fat = /(^v|(\.0)+$)/gi;
- var prebidVersion = '$prebid.version$';
- uri += '&hbv=' + prebidVersion.replace(fat, '') + ',' + version.replace(fat, '');
-
- var bidRequest = frameBid(BRs, bidderRequest);
- if (!bidRequest.imp.length) {
- return {};
- }
-
- return {
- method: 'POST',
- url: uri,
- data: JSON.stringify(bidRequest)
- };
- };
-
- this.interpretResponse = function (serverResponse) {
- let responses = serverResponse.body || [];
- let bids = [];
- let i = 0;
-
- if (responses.seatbid) {
- let temp = [];
- for (i = 0; i < responses.seatbid.length; i++) {
- for (let j = 0; j < responses.seatbid[i].bid.length; j++) {
- temp.push(responses.seatbid[i].bid[j]);
- }
- }
- responses = temp;
- }
-
- for (i = 0; i < responses.length; i++) {
- let bid = responses[i];
- let bidRequest = slotsToBids[bid.impid];
- let bidResponse = {
- requestId: bidRequest.id,
- bidderCode: that.code,
- cpm: parseFloat(bid.price),
- width: bid.w,
- height: bid.h,
- creativeId: bid.crid,
- currency: 'USD',
- netRevenue: true,
- ttl: 350
- };
-
- if (bidRequest.mediaTypes && bidRequest.mediaTypes.video) {
- bidResponse.vastUrl = bid.adm;
- bidResponse.mediaType = 'video';
- bidResponse.ttl = 600;
- } else {
- bidResponse.ad = bid.adm;
- }
- bids.push(bidResponse);
- }
-
- return bids;
- };
-}
-
-export const spec = new ResultsmediaAdapter();
-registerBidder(spec);
diff --git a/modules/revcontentBidAdapter.js b/modules/revcontentBidAdapter.js
index b429f94eae0..777060a5eb6 100644
--- a/modules/revcontentBidAdapter.js
+++ b/modules/revcontentBidAdapter.js
@@ -2,6 +2,7 @@
'use strict';
import {registerBidder} from '../src/adapters/bidderFactory.js';
+import { BANNER, NATIVE } from '../src/mediaTypes.js';
import * as utils from '../src/utils.js';
const BIDDER_CODE = 'revcontent';
@@ -21,12 +22,13 @@ const NATIVE_PARAMS = {
type: 1
}
};
+const STYLE_EXTRA = '';
export const spec = {
code: BIDDER_CODE,
- supportedMediaTypes: ['native'],
+ supportedMediaTypes: [BANNER, NATIVE],
isBidRequestValid: function (bid) {
- return (typeof bid.params.apiKey !== 'undefined' && typeof bid.params.userId !== 'undefined' && bid.hasOwnProperty('nativeParams'));
+ return (typeof bid.params.apiKey !== 'undefined' && typeof bid.params.userId !== 'undefined');
},
buildRequests: (validBidRequests, bidderRequest) => {
const userId = validBidRequests[0].params.userId;
@@ -55,66 +57,7 @@ export const spec = {
endpoint = endpoint + '&widgetId=' + widgetId;
}
- let bidfloor = 0.1;
- if (!isNaN(validBidRequests[0].params.bidfloor) && validBidRequests[0].params.bidfloor > 0) {
- bidfloor = validBidRequests[0].params.bidfloor;
- }
-
- const imp = validBidRequests.map((bid, id) => {
- if (bid.hasOwnProperty('nativeParams')) {
- const assets = utils._map(bid.nativeParams, (bidParams, key) => {
- const props = NATIVE_PARAMS[key];
- const asset = {
- required: bidParams.required & 1
- };
- if (props) {
- asset.id = props.id;
- let wmin, hmin, w, h;
- let aRatios = bidParams.aspect_ratios;
-
- if (aRatios && aRatios[0]) {
- aRatios = aRatios[0];
- wmin = aRatios.min_width || 0;
- hmin = aRatios.ratio_height * wmin / aRatios.ratio_width | 0;
- }
-
- asset[props.name] = {
- len: bidParams.len,
- type: props.type,
- wmin,
- hmin,
- w,
- h
- };
-
- return asset;
- }
- }).filter(Boolean);
-
- return {
- id: id + 1,
- tagid: bid.params.mid,
- bidderRequestId: bid.bidderRequestId,
- auctionId: bid.auctionId,
- transactionId: bid.transactionId,
- native: {
- request: {
- ver: '1.1',
- context: 2,
- contextsubtype: 21,
- plcmttype: 1,
- plcmtcnt: 1,
- assets: assets
- },
- ver: '1.1',
- battr: [1, 3, 8, 11, 17]
- },
- instl: 0,
- bidfloor: bidfloor,
- secure: '1'
- };
- }
- });
+ const imp = validBidRequests.map((bid, id) => buildImp(bid, id));
let data = {
id: bidderRequest.auctionId,
@@ -123,7 +66,6 @@ export const spec = {
id: widgetId,
domain: domain,
page: refererInfo,
- cat: ['IAB17'],
publisher: {
id: userId,
domain: domain
@@ -136,23 +78,7 @@ export const spec = {
user: {
id: 1
},
- at: 2,
- bcat: [
- 'IAB24',
- 'IAB25',
- 'IAB25-1',
- 'IAB25-2',
- 'IAB25-3',
- 'IAB25-4',
- 'IAB25-5',
- 'IAB25-6',
- 'IAB25-7',
- 'IAB26',
- 'IAB26-1',
- 'IAB26-2',
- 'IAB26-3',
- 'IAB26-4'
- ]
+ at: 2
};
serverRequests.push({
method: 'POST',
@@ -166,63 +92,76 @@ export const spec = {
return serverRequests;
},
- interpretResponse: function (serverResponse, originalBidRequest) {
- if (!serverResponse.body) {
- return;
+ interpretResponse: function (serverResponse, serverRequest) {
+ let response = serverResponse.body;
+ if ((!response) || (!response.seatbid)) {
+ return [];
}
- const seatbid = serverResponse.body.seatbid[0];
- const bidResponses = [];
-
- for (var x in seatbid.bid) {
- let adm = JSON.parse(seatbid.bid[x]['adm']);
- let ad = {
- clickUrl: adm.link.url
- };
- adm.assets.forEach(asset => {
- switch (asset.id) {
- case 3:
- ad['image'] = {
- url: asset.img.url,
- height: 1,
- width: 1
- };
- break;
- case 0:
- ad['title'] = asset.title.text;
- break;
- case 5:
- ad['sponsoredBy'] = asset.data.value;
- break;
- }
- });
-
- var size = originalBidRequest.bid[0].params.size;
-
- const bidResponse = {
- bidder: BIDDER_CODE,
- requestId: originalBidRequest.bid[0].bidId,
- cpm: seatbid.bid[x]['price'],
- creativeId: seatbid.bid[x]['adid'],
- currency: 'USD',
- netRevenue: true,
+ let rtbRequest = JSON.parse(serverRequest.data);
+ let rtbBids = response.seatbid
+ .map(seatbid => seatbid.bid)
+ .reduce((a, b) => a.concat(b), []);
+
+ return rtbBids.map(rtbBid => {
+ const bidIndex = +rtbBid.impid - 1;
+ let imp = rtbRequest.imp.filter(imp => imp.id.toString() === rtbBid.impid)[0];
+
+ let prBid = {
+ requestId: serverRequest.bid[bidIndex].bidId,
+ cpm: rtbBid.price,
+ creativeId: rtbBid.crid,
+ nurl: rtbBid.nurl,
+ currency: response.cur || 'USD',
ttl: 360,
- nurl: seatbid.bid[x]['nurl'],
- bidderCode: 'revcontent',
- mediaType: 'native',
- native: ad,
- width: size.width,
- height: size.height,
- ad: displayNative(ad, getTemplate(size, originalBidRequest.bid[0].params.template))
+ netRevenue: true,
+ bidder: 'revcontent',
+ bidderCode: 'revcontent'
};
+ if ('banner' in imp) {
+ prBid.mediaType = BANNER;
+ prBid.width = rtbBid.w;
+ prBid.height = rtbBid.h;
+ prBid.ad = STYLE_EXTRA + rtbBid.adm;
+ } else if ('native' in imp) {
+ let adm = JSON.parse(rtbBid.adm);
+ let ad = {
+ clickUrl: adm.link.url
+ };
- bidResponses.push(bidResponse);
- }
+ adm.assets.forEach(asset => {
+ switch (asset.id) {
+ case 3:
+ ad['image'] = {
+ url: asset.img.url,
+ height: 1,
+ width: 1
+ };
+ break;
+ case 0:
+ ad['title'] = asset.title.text;
+ break;
+ case 5:
+ ad['sponsoredBy'] = asset.data.value || 'Revcontent';
+ break;
+ }
+ });
+ var size = serverRequest.bid[0].params.size;
+ prBid.width = size.width;
+ prBid.height = size.height;
+
+ prBid.mediaType = NATIVE;
+ prBid.native = ad;
+ prBid.ad = displayNative(ad, getTemplate(serverRequest.bid[0].params.size, serverRequest.bid[0].params.template));
+ }
- return bidResponses;
+ return prBid;
+ });
},
onBidWon: function (bid) {
- utils.triggerPixel(bid.nurl);
+ if (bid.nurl) {
+ utils.triggerPixel(bid.nurl);
+ }
return true;
}
};
@@ -273,3 +212,80 @@ function extractHostname(url) {
return hostname;
}
+
+function buildImp(bid, id) {
+ let bidfloor;
+ if (utils.isFn(bid.getFloor)) {
+ bidfloor = bid.getFloor({
+ currency: 'USD',
+ mediaType: '*',
+ size: '*'
+ }).floor;
+ } else {
+ bidfloor = utils.deepAccess(bid, `params.bidfloor`) || 0.1;
+ }
+
+ let imp = {
+ id: id + 1,
+ tagid: bid.adUnitCode,
+ bidderRequestId: bid.bidderRequestId,
+ auctionId: bid.auctionId,
+ transactionId: bid.transactionId,
+ instl: 0,
+ bidfloor: bidfloor,
+ secure: '1'
+ };
+
+ let bannerReq = utils.deepAccess(bid, `mediaTypes.banner`);
+ let nativeReq = utils.deepAccess(bid, `mediaTypes.native`);
+ if (bannerReq) {
+ let sizes = utils.getAdUnitSizes(bid);
+ imp.banner = {
+ w: sizes[0][0],
+ h: sizes[0][1],
+ format: sizes.map(wh => utils.parseGPTSingleSizeArrayToRtbSize(wh)),
+ }
+ } else if (nativeReq) {
+ const assets = utils._map(bid.nativeParams, (bidParams, key) => {
+ const props = NATIVE_PARAMS[key];
+ const asset = {
+ required: bidParams.required & 1
+ };
+ if (props) {
+ asset.id = props.id;
+ let wmin, hmin, w, h;
+ let aRatios = bidParams.aspect_ratios;
+
+ if (aRatios && aRatios[0]) {
+ aRatios = aRatios[0];
+ wmin = aRatios.min_width || 0;
+ hmin = aRatios.ratio_height * wmin / aRatios.ratio_width | 0;
+ }
+
+ asset[props.name] = {
+ len: bidParams.len,
+ type: props.type,
+ wmin,
+ hmin,
+ w,
+ h
+ };
+
+ return asset;
+ }
+ }).filter(Boolean);
+ imp.native = {
+ request: {
+ ver: '1.1',
+ context: 2,
+ contextsubtype: 21,
+ plcmttype: 1,
+ plcmtcnt: 1,
+ assets: assets
+ },
+ ver: '1.1',
+ battr: [1, 3, 8, 11, 17]
+ };
+ }
+ return imp;
+}
diff --git a/modules/rhythmoneBidAdapter.js b/modules/rhythmoneBidAdapter.js
index fa090044f05..36b2c369213 100644
--- a/modules/rhythmoneBidAdapter.js
+++ b/modules/rhythmoneBidAdapter.js
@@ -38,7 +38,7 @@ function RhythmOneBidAdapter() {
slotsToBids[BRs[i].adUnitCode] = BRs[i];
var impObj = {};
impObj.id = BRs[i].adUnitCode;
- impObj.bidfloor = parseFloat(utils.deepAccess(BRs[i], 'params.floor')) || 0;
+ impObj.bidfloor = 0;
impObj.secure = isSecure;
if (utils.deepAccess(BRs[i], 'mediaTypes.banner') || utils.deepAccess(BRs[i], 'mediaType') === 'banner') {
diff --git a/modules/riseBidAdapter.js b/modules/riseBidAdapter.js
index e3265ad5d3e..b03c5c15056 100644
--- a/modules/riseBidAdapter.js
+++ b/modules/riseBidAdapter.js
@@ -5,8 +5,9 @@ import {config} from '../src/config.js';
const SUPPORTED_AD_TYPES = [VIDEO];
const BIDDER_CODE = 'rise';
-const BIDDER_VERSION = '4.0.0';
+const BIDDER_VERSION = '4.0.1';
const TTL = 360;
+const CURRENCY = 'USD';
const SELLER_ENDPOINT = 'https://hb.yellowblue.io/';
const MODES = {
PRODUCTION: 'hb',
@@ -53,6 +54,10 @@ export const spec = {
mediaType: VIDEO
};
+ if (body.adomain && body.adomain.length) {
+ bidResponse.meta = {};
+ bidResponse.meta.advertiserDomains = body.adomain
+ }
bidResponses.push(bidResponse);
return bidResponses;
@@ -82,6 +87,23 @@ export const spec = {
registerBidder(spec);
+/**
+ * Get floor price
+ * @param bid {bid}
+ * @returns {Number}
+ */
+function getFloor(bid) {
+ if (!utils.isFn(bid.getFloor)) {
+ return 0;
+ }
+ let floorResult = bid.getFloor({
+ currency: CURRENCY,
+ mediaType: VIDEO,
+ size: '*'
+ });
+ return floorResult.currency === CURRENCY ? floorResult.floor : 0;
+}
+
/**
* Build the video request
* @param bid {bid}
@@ -206,13 +228,12 @@ function generateParameters(bid, bidderRequest) {
width: width,
height: height,
publisher_id: params.org,
- floor_price: params.floorPrice,
+ floor_price: Math.max(getFloor(bid), params.floorPrice),
ua: navigator.userAgent,
bid_id: utils.getBidIdParameter('bidId', bid),
bidder_request_id: utils.getBidIdParameter('bidderRequestId', bid),
transaction_id: utils.getBidIdParameter('transactionId', bid),
- session_id: params.sessionId || utils.getBidIdParameter('auctionId', bid),
- is_wrapper: !!params.isWrapper,
+ session_id: utils.getBidIdParameter('auctionId', bid),
publisher_name: domain,
site_domain: domain,
bidder_version: BIDDER_VERSION
diff --git a/modules/rtbdemandBidAdapter.js b/modules/rtbdemandBidAdapter.js
deleted file mode 100644
index be5fb39f53a..00000000000
--- a/modules/rtbdemandBidAdapter.js
+++ /dev/null
@@ -1,123 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'rtbdemand';
-const BIDDER_SERVER = 'bidding.rtbdemand.com';
-export const spec = {
- code: BIDDER_CODE,
- isBidRequestValid: function(bid) {
- return !!(bid && bid.params && bid.params.zoneid);
- },
- buildRequests: function(validBidRequests, bidderRequest) {
- return validBidRequests.map(bidRequest => {
- var server = bidRequest.params.server || BIDDER_SERVER;
- var parse = getSize(bidderRequest.bids[0].sizes);
- const payload = {
- from: 'hb',
- v: '1.0',
- request_id: bidRequest.bidderRequestId,
- imp_id: bidRequest.bidId,
- aff: bidRequest.params.zoneid,
- bid_floor: parseFloat(bidRequest.params.floor) > 0 ? bidRequest.params.floor : 0,
- charset: document.charSet || document.characterSet,
- site_domain: document.location.hostname,
- site_page: window.location.href,
- subid: 'hb',
- flashver: getFlashVersion(),
- tmax: bidderRequest.timeout,
- hb: '1',
- name: document.location.hostname,
- width: parse.width,
- height: parse.height,
- device_width: screen.width,
- device_height: screen.height,
- dnt: (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0,
- secure: isSecure(),
- make: navigator.vendor ? navigator.vendor : '',
- };
- if (document.referrer) {
- payload.referrer = document.referrer;
- }
-
- return {
- method: 'GET',
- url: 'https://' + server + '/hb',
- data: payload
- };
- });
- },
- interpretResponse: function(serverResponse) {
- serverResponse = serverResponse.body;
- const bidResponses = [];
- if (serverResponse && serverResponse.seatbid) {
- serverResponse.seatbid.forEach(seatBid => seatBid.bid.forEach(bid => {
- const bidResponse = {
- requestId: bid.impid,
- creativeId: bid.impid,
- cpm: bid.price,
- width: bid.w,
- height: bid.h,
- ad: bid.adm,
- netRevenue: true,
- currency: 'USD',
- ttl: 360,
- };
-
- bidResponses.push(bidResponse);
- }));
- }
- return bidResponses;
- },
- getUserSyncs: function getUserSyncs(syncOptions) {
- if (syncOptions.iframeEnabled) {
- return [{
- type: 'iframe',
- url: 'https://' + BIDDER_SERVER + '/delivery/matches.php?type=iframe',
- }];
- }
- }
-}
-
-function getFlashVersion() {
- var plugins, plugin, result;
-
- if (navigator.plugins && navigator.plugins.length > 0) {
- plugins = navigator.plugins;
- for (var i = 0; i < plugins.length && !result; i++) {
- plugin = plugins[i];
- if (plugin.name.indexOf('Shockwave Flash') > -1) {
- result = plugin.description.split('Shockwave Flash ')[1];
- }
- }
- }
- return result || '';
-}
-
-/* Get parsed size from request size */
-function getSize(requestSizes) {
- const parsed = {};
- const size = utils.parseSizesInput(requestSizes)[0];
-
- if (typeof size !== 'string') {
- return parsed;
- }
-
- const parsedSize = size.toUpperCase().split('X');
- const width = parseInt(parsedSize[0], 10);
- if (width) {
- parsed.width = width;
- }
-
- const height = parseInt(parsedSize[1], 10);
- if (height) {
- parsed.height = height;
- }
-
- return parsed;
-}
-
-function isSecure() {
- return document.location.protocol === 'https:';
-}
-
-registerBidder(spec);
diff --git a/modules/rtbsapeBidAdapter.js b/modules/rtbsapeBidAdapter.js
index 8473ef4dbb3..f5c648d5234 100644
--- a/modules/rtbsapeBidAdapter.js
+++ b/modules/rtbsapeBidAdapter.js
@@ -64,30 +64,32 @@ export const spec = {
let bids = {};
bidRequest.data.bids.forEach(bid => bids[bid.bidId] = bid);
- return serverResponse.body.bids.map(bid => {
- let requestBid = bids[bid.requestId];
- let context = utils.deepAccess(requestBid, 'mediaTypes.video.context');
-
- if (context === OUTSTREAM && (bid.vastUrl || bid.vastXml)) {
- let renderer = Renderer.install({
- id: bid.requestId,
- url: RENDERER_SRC,
- loaded: false
- });
-
- let muted = utils.deepAccess(requestBid, 'params.video.playerMuted');
- if (typeof muted === 'undefined') {
- muted = true;
+ return serverResponse.body.bids
+ .filter(bid => typeof (bid.meta || {}).advertiserDomains !== 'undefined')
+ .map(bid => {
+ let requestBid = bids[bid.requestId];
+ let context = utils.deepAccess(requestBid, 'mediaTypes.video.context');
+
+ if (context === OUTSTREAM && (bid.vastUrl || bid.vastXml)) {
+ let renderer = Renderer.install({
+ id: bid.requestId,
+ url: RENDERER_SRC,
+ loaded: false
+ });
+
+ let muted = utils.deepAccess(requestBid, 'params.video.playerMuted');
+ if (typeof muted === 'undefined') {
+ muted = true;
+ }
+
+ bid.playerMuted = muted;
+ bid.renderer = renderer
+
+ renderer.setRender(setOutstreamRenderer);
}
- bid.playerMuted = muted;
- bid.renderer = renderer
-
- renderer.setRender(setOutstreamRenderer);
- }
-
- return bid;
- });
+ return bid;
+ });
},
/**
diff --git a/modules/rtbsolutionsBidAdapter.js b/modules/rtbsolutionsBidAdapter.js
deleted file mode 100644
index 244ab8a4eba..00000000000
--- a/modules/rtbsolutionsBidAdapter.js
+++ /dev/null
@@ -1,100 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import * as utils from '../src/utils.js';
-import { ajax } from '../src/ajax.js';
-
-const BIDDER_CODE = 'rtbsolutions';
-const ENDPOINT_URL = 'https://dsp-eu-lb.rtbsolutions.pro/bid/hb';
-
-export const spec = {
- version: '1.0',
- code: BIDDER_CODE,
- aliases: ['rtbss'], // short code
- nurls: {},
- isBidRequestValid: function(bid) {
- return !!bid.params.blockId;
- },
- buildRequests: function(validBidRequests, bidderRequest) {
- let req = [];
-
- bidderRequest.bids.forEach(item => {
- const width = item.sizes[0][0];
- const height = item.sizes[0][1];
-
- let imp = {
- referer: bidderRequest.refererInfo.referer,
- ua: navigator.userAgent,
- lang: this.getLanguage(),
- domain: this.getDomain(),
- width: width,
- height: height,
- type: 'banner',
- };
-
- if (item.params.s1 !== undefined) imp.s1 = item.params.s1;
- if (item.params.s2 !== undefined) imp.s2 = item.params.s2;
- if (item.params.s3 !== undefined) imp.s3 = item.params.s3;
- if (item.params.s4 !== undefined) imp.s4 = item.params.s4;
-
- req.push({
- bid_id: item.bidId,
- block_id: item.params.blockId,
- ver: this.version,
- imp
- });
- });
-
- return {
- method: 'POST',
- url: ENDPOINT_URL,
- data: req,
- options: {
- contentType: 'application/json'
- }
- }
- },
- interpretResponse: function(serverResponse, request) {
- const bidResponses = [];
-
- serverResponse.body.forEach(item => {
- this.nurls[item.bid_id] = item.nurl;
-
- const bidResponse = {
- requestId: item.bid_id,
- cpm: item.cpm,
- width: item.width,
- height: item.height,
- creativeId: item.creative_id,
- currency: item.currency,
- netRevenue: true,
- ttl: 360,
- ad: item.ad,
- };
-
- bidResponses.push(bidResponse);
- });
-
- return bidResponses;
- },
- onBidWon: function(bid) {
- ajax(this.nurls[bid.requestId], null);
- },
-
- getLanguage() {
- const language = navigator.language ? 'language' : 'userLanguage';
- const lang2 = navigator[language].split('-')[0];
- if (lang2.length === 2 || lang2.length === 3) {
- return lang2;
- }
- return '';
- },
- getDomain() {
- if (!utils.inIframe()) {
- return window.location.hostname
- }
- let origins = window.document.location.ancestorOrigins;
- if (origins && origins.length > 0) {
- return origins[origins.length - 1]
- }
- }
-};
-registerBidder(spec);
diff --git a/modules/rubiconAnalyticsAdapter.js b/modules/rubiconAnalyticsAdapter.js
index 5a2e02b8f89..0d47bee235f 100644
--- a/modules/rubiconAnalyticsAdapter.js
+++ b/modules/rubiconAnalyticsAdapter.js
@@ -115,7 +115,7 @@ function formatSource(src) {
return src.toLowerCase();
}
-function sendMessage(auctionId, bidWonId) {
+function sendMessage(auctionId, bidWonId, trigger) {
function formatBid(bid) {
return utils.pick(bid, [
'bidder',
@@ -152,7 +152,7 @@ function sendMessage(auctionId, bidWonId) {
'videoAdFormat', () => bid.videoAdFormat,
'mediaTypes'
]), {
- adserverTargeting: stringProperties(cache.targeting[bid.adUnit.adUnitCode] || {}),
+ adserverTargeting: !utils.isEmpty(cache.targeting[bid.adUnit.adUnitCode]) ? stringProperties(cache.targeting[bid.adUnit.adUnitCode]) : undefined,
bidwonStatus: 'success', // hard-coded for now
accountId,
siteId: bid.siteId,
@@ -163,7 +163,12 @@ function sendMessage(auctionId, bidWonId) {
let auctionCache = cache.auctions[auctionId];
let referrer = config.getConfig('pageUrl') || (auctionCache && auctionCache.referrer);
let message = {
- eventTimeMillis: Date.now(),
+ timestamps: {
+ prebidLoaded: rubiconAdapter.MODULE_INITIALIZED_TIME,
+ auctionEnded: auctionCache.endTs,
+ eventTime: Date.now()
+ },
+ trigger,
integration: rubiConf.int_type || DEFAULT_INTEGRATION,
version: '$prebid.version$',
referrerUri: referrer,
@@ -187,8 +192,8 @@ function sendMessage(auctionId, bidWonId) {
'transactionId',
'mediaTypes',
'dimensions',
- 'adserverTargeting', () => stringProperties(cache.targeting[bid.adUnit.adUnitCode] || {}),
- 'gam',
+ 'adserverTargeting', () => !utils.isEmpty(cache.targeting[bid.adUnit.adUnitCode]) ? stringProperties(cache.targeting[bid.adUnit.adUnitCode]) : undefined,
+ 'gam', gam => !utils.isEmpty(gam) ? gam : undefined,
'pbAdSlot',
'pattern'
]);
@@ -288,6 +293,10 @@ function sendMessage(auctionId, bidWonId) {
auction.serverTimeoutMillis = serverConfig.timeout;
}
+ if (auctionCache.userIds.length) {
+ auction.user = {ids: auctionCache.userIds};
+ }
+
message.auctions = [auction];
let bidsWon = Object.keys(auctionCache.bidsWon).reduce((memo, adUnitCode) => {
@@ -319,6 +328,10 @@ function sendMessage(auctionId, bidWonId) {
);
}
+function adUnitIsOnlyInstream(adUnit) {
+ return adUnit.mediaTypes && Object.keys(adUnit.mediaTypes).length === 1 && utils.deepAccess(adUnit, 'mediaTypes.video.context') === 'instream';
+}
+
function getBidPrice(bid) {
// get the cpm from bidResponse
let cpm;
@@ -498,9 +511,9 @@ function subscribeToGamSlots() {
clearTimeout(cache.timeouts[auctionId]);
delete cache.timeouts[auctionId];
if (rubiConf.analyticsEventDelay > 0) {
- setTimeout(() => sendMessage.call(rubiconAdapter, auctionId), rubiConf.analyticsEventDelay)
+ setTimeout(() => sendMessage.call(rubiconAdapter, auctionId, undefined, 'delayedGam'), rubiConf.analyticsEventDelay)
} else {
- sendMessage.call(rubiconAdapter, auctionId)
+ sendMessage.call(rubiconAdapter, auctionId, undefined, 'gam')
}
}
});
@@ -509,6 +522,7 @@ function subscribeToGamSlots() {
let baseAdapter = adapter({analyticsType: 'endpoint'});
let rubiconAdapter = Object.assign({}, baseAdapter, {
+ MODULE_INITIALIZED_TIME: Date.now(),
referrerHostname: '',
enableAnalytics(config = {}) {
let error = false;
@@ -575,6 +589,9 @@ let rubiconAdapter = Object.assign({}, baseAdapter, {
}
cacheEntry.gdprConsent = utils.deepAccess(args, 'bidderRequests.0.gdprConsent');
cacheEntry.session = storage.localStorageIsEnabled() && updateRpaCookie();
+ cacheEntry.userIds = Object.keys(utils.deepAccess(args, 'bidderRequests.0.bids.0.userId', {})).map(id => {
+ return {provider: id, hasId: true}
+ });
cache.auctions[args.auctionId] = cacheEntry;
// register to listen to gpt events if not done yet
if (!cache.gpt.registered && utils.isGptPubadsDefined()) {
@@ -594,7 +611,7 @@ let rubiconAdapter = Object.assign({}, baseAdapter, {
// mark adUnits we expect bidWon events for
cache.auctions[args.auctionId].bidsWon[bid.adUnitCode] = false;
- if (rubiConf.waitForGamSlots) {
+ if (rubiConf.waitForGamSlots && !adUnitIsOnlyInstream(bid)) {
cache.auctions[args.auctionId].gamHasRendered[bid.adUnitCode] = false;
}
@@ -750,7 +767,7 @@ let rubiconAdapter = Object.assign({}, baseAdapter, {
// check if this BID_WON missed the boat, if so send by itself
if (auctionCache.sent === true) {
- sendMessage.call(this, args.auctionId, args.requestId);
+ sendMessage.call(this, args.auctionId, args.requestId, 'soloBidWon');
} else if (!rubiConf.waitForGamSlots && Object.keys(auctionCache.bidsWon).reduce((memo, adUnitCode) => {
// only send if we've received bidWon events for all adUnits in auction
memo = memo && auctionCache.bidsWon[adUnitCode];
@@ -759,14 +776,23 @@ let rubiconAdapter = Object.assign({}, baseAdapter, {
clearTimeout(cache.timeouts[args.auctionId]);
delete cache.timeouts[args.auctionId];
- sendMessage.call(this, args.auctionId);
+ sendMessage.call(this, args.auctionId, undefined, 'allBidWons');
}
break;
case AUCTION_END:
- // start timer to send batched payload just in case we don't hear any BID_WON events
- cache.timeouts[args.auctionId] = setTimeout(() => {
- sendMessage.call(this, args.auctionId);
- }, rubiConf.analyticsBatchTimeout || SEND_TIMEOUT);
+ // see how long it takes for the payload to come fire
+ cache.auctions[args.auctionId].endTs = Date.now();
+
+ const isOnlyInstreamAuction = args.adUnits && args.adUnits.every(adUnit => adUnitIsOnlyInstream(adUnit));
+ // If only instream, do not wait around, just send payload
+ if (isOnlyInstreamAuction) {
+ sendMessage.call(this, args.auctionId, undefined, 'instreamAuction');
+ } else {
+ // start timer to send batched payload just in case we don't hear any BID_WON events
+ cache.timeouts[args.auctionId] = setTimeout(() => {
+ sendMessage.call(this, args.auctionId, undefined, 'auctionEnd');
+ }, rubiConf.analyticsBatchTimeout || SEND_TIMEOUT);
+ }
break;
case BID_TIMEOUT:
args.forEach(badBid => {
diff --git a/modules/rubiconBidAdapter.js b/modules/rubiconBidAdapter.js
index 078b5404baf..b0d4885fc69 100644
--- a/modules/rubiconBidAdapter.js
+++ b/modules/rubiconBidAdapter.js
@@ -482,7 +482,9 @@ export const spec = {
// add p_pos only if specified and valid
// For SRA we need to explicitly put empty semi colons so AE treats it as empty, instead of copying the latter value
- data['p_pos'] = (params.position === 'atf' || params.position === 'btf') ? params.position : '';
+ let posMapping = {1: 'atf', 3: 'btf'};
+ let pos = posMapping[utils.deepAccess(bidRequest, 'mediaTypes.banner.pos')] || '';
+ data['p_pos'] = (params.position === 'atf' || params.position === 'btf') ? params.position : pos;
// pass publisher provided userId if configured
const configUserId = config.getConfig('user.id');
@@ -505,8 +507,6 @@ export const spec = {
}
} else if (eid.source === 'liveramp.com') {
data['x_liverampidl'] = eid.uids[0].id;
- } else if (eid.source === 'sharedid.org') {
- data['eid_sharedid.org'] = `${eid.uids[0].id}^${eid.uids[0].atype}^${(eid.uids[0].ext && eid.uids[0].ext.third) || ''}`;
} else if (eid.source === 'id5-sync.com') {
data['eid_id5-sync.com'] = `${eid.uids[0].id}^${eid.uids[0].atype}^${(eid.uids[0].ext && eid.uids[0].ext.linkType) || ''}`;
} else {
@@ -978,7 +978,7 @@ function applyFPD(bidRequest, mediaType, data) {
let fpd = utils.mergeDeep({}, config.getConfig('ortb2') || {}, BID_FPD);
let impData = utils.deepAccess(bidRequest.ortb2Imp, 'ext.data') || {};
- const SEGTAX = {user: [3], site: [1, 2]};
+ const SEGTAX = {user: [4], site: [1, 2]};
const MAP = {user: 'tg_v.', site: 'tg_i.', adserver: 'tg_i.dfp_ad_unit_code', pbadslot: 'tg_i.pbadslot', keywords: 'kw'};
const validate = function(prop, key, parentName) {
if (key === 'data' && Array.isArray(prop)) {
diff --git a/modules/saambaaBidAdapter.js b/modules/saambaaBidAdapter.js
deleted file mode 100755
index 0e53d2a300d..00000000000
--- a/modules/saambaaBidAdapter.js
+++ /dev/null
@@ -1,401 +0,0 @@
-import * as utils from '../src/utils.js';
-import { config } from '../src/config.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { VIDEO, BANNER } from '../src/mediaTypes.js';
-import find from 'core-js-pure/features/array/find.js';
-import includes from 'core-js-pure/features/array/includes.js';
-
-const ADAPTER_VERSION = '1.0';
-const BIDDER_CODE = 'saambaa';
-
-export const VIDEO_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';
-export const BANNER_ENDPOINT = 'https://nep.advangelists.com/xp/get?pubid=';
-export const OUTSTREAM_SRC = 'https://player-cdn.beachfrontmedia.com/playerapi/loader/outstream.js';
-export const VIDEO_TARGETING = ['mimes', 'playbackmethod', 'maxduration', 'skip'];
-export const DEFAULT_MIMES = ['video/mp4', 'application/javascript'];
-
-let pubid = '';
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO],
-
- isBidRequestValid(bidRequest) {
- if (typeof bidRequest != 'undefined') {
- if (bidRequest.bidder !== BIDDER_CODE && typeof bidRequest.params === 'undefined') { return false; }
- if (bidRequest === '' || bidRequest.params.placement === '' || bidRequest.params.pubid === '') { return false; }
- return true;
- } else { return false; }
- },
-
- buildRequests(bids, bidderRequest) {
- let requests = [];
- let videoBids = bids.filter(bid => isVideoBidValid(bid));
- let bannerBids = bids.filter(bid => isBannerBidValid(bid));
- videoBids.forEach(bid => {
- pubid = getVideoBidParam(bid, 'pubid');
- requests.push({
- method: 'POST',
- url: VIDEO_ENDPOINT + pubid,
- data: createVideoRequestData(bid, bidderRequest),
- bidRequest: bid
- });
- });
-
- bannerBids.forEach(bid => {
- pubid = getBannerBidParam(bid, 'pubid');
-
- requests.push({
- method: 'POST',
- url: BANNER_ENDPOINT + pubid,
- data: createBannerRequestData(bid, bidderRequest),
- bidRequest: bid
- });
- });
- return requests;
- },
-
- interpretResponse(serverResponse, {bidRequest}) {
- let response = serverResponse.body;
- if (response !== null && utils.isEmpty(response) == false) {
- if (isVideoBid(bidRequest)) {
- let bidResponse = {
- requestId: response.id,
- bidderCode: BIDDER_CODE,
- cpm: response.seatbid[0].bid[0].price,
- width: response.seatbid[0].bid[0].w,
- height: response.seatbid[0].bid[0].h,
- ttl: response.seatbid[0].bid[0].ttl || 60,
- creativeId: response.seatbid[0].bid[0].crid,
- currency: response.cur,
- meta: { 'advertiserDomains': response.seatbid[0].bid[0].adomain },
- mediaType: VIDEO,
- netRevenue: true
- }
-
- if (response.seatbid[0].bid[0].adm) {
- bidResponse.vastXml = response.seatbid[0].bid[0].adm;
- bidResponse.adResponse = {
- content: response.seatbid[0].bid[0].adm
- };
- } else {
- bidResponse.vastUrl = response.seatbid[0].bid[0].nurl;
- }
-
- return bidResponse;
- } else {
- return {
- requestId: response.id,
- bidderCode: BIDDER_CODE,
- cpm: response.seatbid[0].bid[0].price,
- width: response.seatbid[0].bid[0].w,
- height: response.seatbid[0].bid[0].h,
- ad: response.seatbid[0].bid[0].adm,
- ttl: response.seatbid[0].bid[0].ttl || 60,
- creativeId: response.seatbid[0].bid[0].crid,
- currency: response.cur,
- meta: { 'advertiserDomains': response.seatbid[0].bid[0].adomain },
- mediaType: BANNER,
- netRevenue: true
- }
- }
- }
- }
-};
-
-function isBannerBid(bid) {
- return utils.deepAccess(bid, 'mediaTypes.banner') || !isVideoBid(bid);
-}
-
-function isVideoBid(bid) {
- return utils.deepAccess(bid, 'mediaTypes.video');
-}
-
-function isVideoBidValid(bid) {
- return isVideoBid(bid) && getVideoBidParam(bid, 'pubid') && getVideoBidParam(bid, 'placement');
-}
-
-function isBannerBidValid(bid) {
- return isBannerBid(bid) && getBannerBidParam(bid, 'pubid') && getBannerBidParam(bid, 'placement');
-}
-
-function getVideoBidParam(bid, key) {
- return utils.deepAccess(bid, 'params.video.' + key) || utils.deepAccess(bid, 'params.' + key);
-}
-
-function getBannerBidParam(bid, key) {
- return utils.deepAccess(bid, 'params.banner.' + key) || utils.deepAccess(bid, 'params.' + key);
-}
-
-function isMobile() {
- return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
-}
-
-function isConnectedTV() {
- return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
-}
-
-function getDoNotTrack() {
- return navigator.doNotTrack === '1' || window.doNotTrack === '1' || navigator.msDoNoTrack === '1' || navigator.doNotTrack === 'yes';
-}
-
-function findAndFillParam(o, key, value) {
- try {
- if (typeof value === 'function') {
- o[key] = value();
- } else {
- o[key] = value;
- }
- } catch (ex) {}
-}
-
-function getOsVersion() {
- let clientStrings = [
- { s: 'Android', r: /Android/ },
- { s: 'iOS', r: /(iPhone|iPad|iPod)/ },
- { s: 'Mac OS X', r: /Mac OS X/ },
- { s: 'Mac OS', r: /(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/ },
- { s: 'Linux', r: /(Linux|X11)/ },
- { s: 'Windows 10', r: /(Windows 10.0|Windows NT 10.0)/ },
- { s: 'Windows 8.1', r: /(Windows 8.1|Windows NT 6.3)/ },
- { s: 'Windows 8', r: /(Windows 8|Windows NT 6.2)/ },
- { s: 'Windows 7', r: /(Windows 7|Windows NT 6.1)/ },
- { s: 'Windows Vista', r: /Windows NT 6.0/ },
- { s: 'Windows Server 2003', r: /Windows NT 5.2/ },
- { s: 'Windows XP', r: /(Windows NT 5.1|Windows XP)/ },
- { s: 'UNIX', r: /UNIX/ },
- { s: 'Search Bot', r: /(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/ }
- ];
- let cs = find(clientStrings, cs => cs.r.test(navigator.userAgent));
- return cs ? cs.s : 'unknown';
-}
-
-function getFirstSize(sizes) {
- return (sizes && sizes.length) ? sizes[0] : { w: undefined, h: undefined };
-}
-
-function parseSizes(sizes) {
- return utils.parseSizesInput(sizes).map(size => {
- let [ width, height ] = size.split('x');
- return {
- w: parseInt(width, 10) || undefined,
- h: parseInt(height, 10) || undefined
- };
- });
-}
-
-function getVideoSizes(bid) {
- return parseSizes(utils.deepAccess(bid, 'mediaTypes.video.playerSize') || bid.sizes);
-}
-
-function getBannerSizes(bid) {
- return parseSizes(utils.deepAccess(bid, 'mediaTypes.banner.sizes') || bid.sizes);
-}
-
-function getTopWindowReferrer() {
- try {
- return window.top.document.referrer;
- } catch (e) {
- return '';
- }
-}
-
-function getVideoTargetingParams(bid) {
- return Object.keys(Object(bid.params.video))
- .filter(param => includes(VIDEO_TARGETING, param))
- .reduce((obj, param) => {
- obj[ param ] = bid.params.video[ param ];
- return obj;
- }, {});
-}
-
-function createVideoRequestData(bid, bidderRequest) {
- let topLocation = getTopWindowLocation(bidderRequest);
- let topReferrer = getTopWindowReferrer();
-
- // if size is explicitly given via adapter params
- let paramSize = getVideoBidParam(bid, 'size');
- let sizes = [];
-
- if (typeof paramSize !== 'undefined' && paramSize != '') {
- sizes = parseSizes(paramSize);
- } else {
- sizes = getVideoSizes(bid);
- }
- const firstSize = getFirstSize(sizes);
-
- let video = getVideoTargetingParams(bid);
- const o = {
- 'device': {
- 'langauge': (global.navigator.language).split('-')[0],
- 'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
- 'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
- 'js': 1,
- 'os': getOsVersion()
- },
- 'at': 2,
- 'site': {},
- 'tmax': 3000,
- 'cur': ['USD'],
- 'id': bid.bidId,
- 'imp': [],
- 'regs': {
- 'ext': {
- }
- },
- 'user': {
- 'ext': {
- }
- }
- };
-
- o.site['page'] = topLocation.href;
- o.site['domain'] = topLocation.hostname;
- o.site['search'] = topLocation.search;
- o.site['domain'] = topLocation.hostname;
- o.site['ref'] = topReferrer;
- o.site['mobile'] = isMobile() ? 1 : 0;
- const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
-
- o.device['dnt'] = getDoNotTrack() ? 1 : 0;
-
- findAndFillParam(o.site, 'name', function() {
- return global.top.document.title;
- });
-
- findAndFillParam(o.device, 'h', function() {
- return global.screen.height;
- });
- findAndFillParam(o.device, 'w', function() {
- return global.screen.width;
- });
-
- let placement = getVideoBidParam(bid, 'placement');
- let floor = getVideoBidParam(bid, 'floor');
- if (floor == null) { floor = 0.5; }
-
- for (let j = 0; j < sizes.length; j++) {
- o.imp.push({
- 'id': '' + j,
- 'displaymanager': '' + BIDDER_CODE,
- 'displaymanagerver': '' + ADAPTER_VERSION,
- 'tagId': placement,
- 'bidfloor': floor,
- 'bidfloorcur': 'USD',
- 'secure': secure,
- 'video': Object.assign({
- 'id': utils.generateUUID(),
- 'pos': 0,
- 'w': firstSize.w,
- 'h': firstSize.h,
- 'mimes': DEFAULT_MIMES
- }, video)
-
- });
- }
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- let { gdprApplies, consentString } = bidderRequest.gdprConsent;
- o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
- o.user.ext = {'consent': consentString};
- }
-
- return o;
-}
-
-function getTopWindowLocation(bidderRequest) {
- let url = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer;
- return utils.parseUrl(config.getConfig('pageUrl') || url, { decodeSearchAsString: true });
-}
-
-function createBannerRequestData(bid, bidderRequest) {
- let topLocation = getTopWindowLocation(bidderRequest);
- let topReferrer = getTopWindowReferrer();
-
- // if size is explicitly given via adapter params
-
- let paramSize = getBannerBidParam(bid, 'size');
- let sizes = [];
- if (typeof paramSize !== 'undefined' && paramSize != '') {
- sizes = parseSizes(paramSize);
- } else {
- sizes = getBannerSizes(bid);
- }
-
- const o = {
- 'device': {
- 'langauge': (global.navigator.language).split('-')[0],
- 'dnt': (global.navigator.doNotTrack === 1 ? 1 : 0),
- 'devicetype': isMobile() ? 4 : isConnectedTV() ? 3 : 2,
- 'js': 1
- },
- 'at': 2,
- 'site': {},
- 'tmax': 3000,
- 'cur': ['USD'],
- 'id': bid.bidId,
- 'imp': [],
- 'regs': {
- 'ext': {
- }
- },
- 'user': {
- 'ext': {
- }
- }
- };
-
- o.site['page'] = topLocation.href;
- o.site['domain'] = topLocation.hostname;
- o.site['search'] = topLocation.search;
- o.site['domain'] = topLocation.hostname;
- o.site['ref'] = topReferrer;
- o.site['mobile'] = isMobile() ? 1 : 0;
- const secure = topLocation.protocol.indexOf('https') === 0 ? 1 : 0;
-
- o.device['dnt'] = getDoNotTrack() ? 1 : 0;
-
- findAndFillParam(o.site, 'name', function() {
- return global.top.document.title;
- });
-
- findAndFillParam(o.device, 'h', function() {
- return global.screen.height;
- });
- findAndFillParam(o.device, 'w', function() {
- return global.screen.width;
- });
-
- let placement = getBannerBidParam(bid, 'placement');
- for (let j = 0; j < sizes.length; j++) {
- let size = sizes[j];
-
- let floor = getBannerBidParam(bid, 'floor');
- if (floor == null) { floor = 0.1; }
-
- o.imp.push({
- 'id': '' + j,
- 'displaymanager': '' + BIDDER_CODE,
- 'displaymanagerver': '' + ADAPTER_VERSION,
- 'tagId': placement,
- 'bidfloor': floor,
- 'bidfloorcur': 'USD',
- 'secure': secure,
- 'banner': {
- 'id': utils.generateUUID(),
- 'pos': 0,
- 'w': size['w'],
- 'h': size['h']
- }
- });
- }
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- let { gdprApplies, consentString } = bidderRequest.gdprConsent;
- o.regs.ext = {'gdpr': gdprApplies ? 1 : 0};
- o.user.ext = {'consent': consentString};
- }
-
- return o;
-}
-registerBidder(spec);
diff --git a/modules/seedingAllianceBidAdapter.js b/modules/seedingAllianceBidAdapter.js
deleted file mode 100755
index d85ae856317..00000000000
--- a/modules/seedingAllianceBidAdapter.js
+++ /dev/null
@@ -1,225 +0,0 @@
-// jshint esversion: 6, es3: false, node: true
-'use strict';
-
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { NATIVE } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-import { config } from '../src/config.js';
-
-const BIDDER_CODE = 'seedingAlliance';
-const DEFAULT_CUR = 'EUR';
-const ENDPOINT_URL = 'https://b.nativendo.de/cds/rtb/bid?format=openrtb2.5&ssp=nativendo';
-
-const NATIVE_ASSET_IDS = {0: 'title', 1: 'body', 2: 'sponsoredBy', 3: 'image', 4: 'cta', 5: 'icon'};
-
-const NATIVE_PARAMS = {
- title: {
- id: 0,
- name: 'title'
- },
-
- body: {
- id: 1,
- name: 'data',
- type: 2
- },
-
- sponsoredBy: {
- id: 2,
- name: 'data',
- type: 1
- },
-
- image: {
- id: 3,
- type: 3,
- name: 'img'
- },
-
- cta: {
- id: 4,
- type: 12,
- name: 'data'
- },
-
- icon: {
- id: 5,
- type: 1,
- name: 'img'
- }
-};
-
-export const spec = {
- code: BIDDER_CODE,
-
- supportedMediaTypes: [NATIVE],
-
- isBidRequestValid: function(bid) {
- return !!bid.params.adUnitId;
- },
-
- buildRequests: (validBidRequests, bidderRequest) => {
- const pt = setOnAny(validBidRequests, 'params.pt') || setOnAny(validBidRequests, 'params.priceType') || 'net';
- const tid = validBidRequests[0].transactionId;
- const cur = [config.getConfig('currency.adServerCurrency') || DEFAULT_CUR];
- let url = bidderRequest.refererInfo.referer;
-
- const imp = validBidRequests.map((bid, id) => {
- const assets = utils._map(bid.nativeParams, (bidParams, key) => {
- const props = NATIVE_PARAMS[key];
-
- const asset = {
- required: bidParams.required & 1
- };
-
- if (props) {
- asset.id = props.id;
-
- let w, h;
-
- if (bidParams.sizes) {
- w = bidParams.sizes[0];
- h = bidParams.sizes[1];
- }
-
- asset[props.name] = {
- len: bidParams.len,
- type: props.type,
- w,
- h
- };
-
- return asset;
- }
- })
- .filter(Boolean);
-
- if (bid.params.url) {
- url = bid.params.url;
- }
-
- return {
- id: String(id + 1),
- tagid: bid.params.adUnitId,
- tid: tid,
- pt: pt,
- native: {
- request: {
- assets
- }
- }
- };
- });
-
- const request = {
- id: bidderRequest.auctionId,
- site: {
- page: url
- },
- device: {
- ua: navigator.userAgent
- },
- cur,
- imp,
- user: {},
- regs: {
- ext: {
- gdpr: 0
- }
- }
- };
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- utils.deepSetValue(request, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
- utils.deepSetValue(request, 'regs.ext.gdpr', (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean' && bidderRequest.gdprConsent.gdprApplies) ? 1 : 0);
- }
-
- return {
- method: 'POST',
- url: ENDPOINT_URL,
- data: JSON.stringify(request),
- options: {
- contentType: 'application/json'
- },
- bids: validBidRequests
- };
- },
-
- interpretResponse: function(serverResponse, { bids }) {
- if (utils.isEmpty(serverResponse.body)) {
- return [];
- }
-
- const { seatbid, cur } = serverResponse.body;
-
- const bidResponses = flatten(seatbid.map(seat => seat.bid)).reduce((result, bid) => {
- result[bid.impid - 1] = bid;
- return result;
- }, []);
-
- return bids
- .map((bid, id) => {
- const bidResponse = bidResponses[id];
-
- if (bidResponse) {
- return {
- requestId: bid.bidId,
- cpm: bidResponse.price,
- creativeId: bidResponse.crid,
- ttl: 1000,
- netRevenue: bid.netRevenue === 'net',
- currency: cur,
- mediaType: NATIVE,
- bidderCode: BIDDER_CODE,
- native: parseNative(bidResponse)
- };
- }
- })
- .filter(Boolean);
- }
-};
-
-registerBidder(spec);
-
-function parseNative(bid) {
- const {assets, link, imptrackers} = bid.adm.native;
-
- link.clicktrackers.forEach(function (clicktracker, index) {
- link.clicktrackers[index] = clicktracker.replace(/\$\{AUCTION_PRICE\}/, bid.price);
- });
-
- imptrackers.forEach(function (imptracker, index) {
- imptrackers[index] = imptracker.replace(/\$\{AUCTION_PRICE\}/, bid.price);
- });
-
- const result = {
- url: link.url,
- clickUrl: link.url,
- clickTrackers: link.clicktrackers || undefined,
- impressionTrackers: imptrackers || undefined
- };
-
- assets.forEach(asset => {
- const kind = NATIVE_ASSET_IDS[asset.id];
- const content = kind && asset[NATIVE_PARAMS[kind].name];
-
- if (content) {
- result[kind] = content.text || content.value || { url: content.url, width: content.w, height: content.h };
- }
- });
-
- return result;
-}
-
-function setOnAny(collection, key) {
- for (let i = 0, result; i < collection.length; i++) {
- result = utils.deepAccess(collection[i], key);
- if (result) {
- return result;
- }
- }
-}
-
-function flatten(arr) {
- return [].concat(...arr);
-}
diff --git a/modules/seedtagBidAdapter.js b/modules/seedtagBidAdapter.js
index c25d833a71c..0acf1a8ff97 100644
--- a/modules/seedtagBidAdapter.js
+++ b/modules/seedtagBidAdapter.js
@@ -46,7 +46,7 @@ function mapMediaType(seedtagMediaType) {
}
function hasVideoMediaType(bid) {
- return !!bid.mediaTypes && !!bid.mediaTypes.video
+ return (!!bid.mediaTypes && !!bid.mediaTypes.video) || (!!bid.params && !!bid.params.video)
}
function hasMandatoryParams(params) {
@@ -58,51 +58,64 @@ function hasMandatoryParams(params) {
);
}
-function hasMandatoryVideoParams(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 hasMandatoryVideoParams(bid) {
+ const videoParams = getVideoParams(bid)
-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,
- };
+ return hasVideoMediaType(bid) && !!videoParams.playerSize &&
+ utils.isArray(videoParams.playerSize) &&
+ videoParams.playerSize.length > 0;
+}
- if (params.adPosition) {
- bidRequest.adPosition = params.adPosition;
+function buildBidRequest(validBidRequest) {
+ const params = validBidRequest.params;
+ const mediaTypes = utils._map(
+ Object.keys(validBidRequest.mediaTypes),
+ function (pbjsType) {
+ return mediaTypesMap[pbjsType];
}
+ );
- if (hasVideoMediaType(validBidRequest)) {
- bidRequest.videoParams = params.video || {};
- bidRequest.videoParams.w =
- validBidRequest.mediaTypes.video.playerSize[0][0];
- bidRequest.videoParams.h =
- validBidRequest.mediaTypes.video.playerSize[0][1];
- }
+ const bidRequest = {
+ id: validBidRequest.bidId,
+ transactionId: validBidRequest.transactionId,
+ sizes: validBidRequest.sizes,
+ supplyTypes: mediaTypes,
+ adUnitId: params.adUnitId,
+ placement: params.placement,
+ requestCount: validBidRequest.bidderRequestsCount || 1 // FIXME : in unit test the parameter bidderRequestsCount is undefined
+ };
+
+ if (params.adPosition) {
+ bidRequest.adPosition = params.adPosition;
+ }
- return bidRequest;
+ if (hasVideoMediaType(validBidRequest)) {
+ bidRequest.videoParams = getVideoParams(validBidRequest)
+ }
+
+ return bidRequest;
+}
+
+/**
+ * return video param (global or overrided per bidder)
+ */
+function getVideoParams(validBidRequest) {
+ const videoParams = validBidRequest.mediaTypes.video || {};
+ if (videoParams.playerSize) {
+ videoParams.w = videoParams.playerSize[0][0];
+ videoParams.h = videoParams.playerSize[0][1];
+ }
+
+ const bidderVideoParams = (validBidRequest.params && validBidRequest.params.video) || {}
+ // override video params from seedtag bidder params
+ Object.keys(bidderVideoParams).forEach(key => {
+ videoParams[key] = validBidRequest.params.video[key]
})
+
+ return videoParams
}
-function buildBid(seedtagBid) {
+function buildBidResponse(seedtagBid) {
const mediaType = mapMediaType(seedtagBid.mediaType);
const bid = {
requestId: seedtagBid.bidId,
@@ -114,7 +127,10 @@ function buildBid(seedtagBid) {
netRevenue: true,
mediaType: mediaType,
ttl: seedtagBid.ttl,
- nurl: seedtagBid.nurl
+ nurl: seedtagBid.nurl,
+ meta: {
+ advertiserDomains: seedtagBid && seedtagBid.adomain && seedtagBid.adomain.length > 0 ? seedtagBid.adomain : []
+ }
};
if (mediaType === VIDEO) {
@@ -143,7 +159,6 @@ export const spec = {
code: BIDDER_CODE,
aliases: [SEEDTAG_ALIAS],
supportedMediaTypes: [BANNER, VIDEO],
-
/**
* Determines whether or not the given bid request is valid.
*
@@ -152,7 +167,7 @@ export const spec = {
*/
isBidRequestValid(bid) {
return hasVideoMediaType(bid)
- ? hasMandatoryParams(bid.params) && hasMandatoryVideoParams(bid.mediaTypes)
+ ? hasMandatoryParams(bid.params) && hasMandatoryVideoParams(bid)
: hasMandatoryParams(bid.params);
},
@@ -170,7 +185,7 @@ export const spec = {
timeout: bidderRequest.timeout,
version: '$prebid.version$',
connectionType: getConnectionType(),
- bidRequests: buildBidRequests(validBidRequests)
+ bidRequests: utils._map(validBidRequests, buildBidRequest)
};
if (payload.cmp) {
@@ -197,7 +212,7 @@ export const spec = {
const serverBody = serverResponse.body;
if (serverBody && serverBody.bids && utils.isArray(serverBody.bids)) {
return utils._map(serverBody.bids, function(bid) {
- return buildBid(bid);
+ return buildBidResponse(bid);
});
} else {
return [];
diff --git a/modules/seedtagBidAdapter.md b/modules/seedtagBidAdapter.md
index 627ff8333ad..f4249fb2e89 100644
--- a/modules/seedtagBidAdapter.md
+++ b/modules/seedtagBidAdapter.md
@@ -46,7 +46,19 @@ var adUnits = [{
mediaTypes: {
video: {
context: 'instream', // required
- playerSize: [600, 300] // required
+ playerSize: [600, 300], // required
+ 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
}
},
bids: [
@@ -57,9 +69,10 @@ var adUnits = [{
adUnitId: '0000', // required
placement: 'video', // required
adPosition: 0, // optional
- // Video object as specified in OpenRTB 2.5
- video: {
- mimes: ['video/mp4'], // recommended
+ video: { // optional
+ context: 'instream', // optional
+ playerSize: [600, 300], // optional
+ mimes: ['video/mp4'], // optional
minduration: 5, // optional
maxduration: 60, // optional
boxingallowed: 1, // optional
diff --git a/modules/segmentoBidAdapter.js b/modules/segmentoBidAdapter.js
deleted file mode 100644
index a042bdf4942..00000000000
--- a/modules/segmentoBidAdapter.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'segmento';
-const URL = 'https://prebid-bidder.rutarget.ru/bid';
-const SYNC_IFRAME_URL = 'https://tag.rutarget.ru/tag?event=otherPage&check=true&response=syncframe&synconly=true';
-const SYNC_IMAGE_URL = 'https://tag.rutarget.ru/tag?event=otherPage&check=true&synconly=true';
-const RUB = 'RUB';
-const TIME_TO_LIVE = 0;
-
-export const spec = {
- code: BIDDER_CODE,
- isBidRequestValid: (bid) => {
- return Boolean(bid && bid.params && !isNaN(bid.params.placementId));
- },
- buildRequests: (validBidRequests, bidderRequest) => {
- const payload = {
- places: [],
- settings: {
- currency: RUB,
- referrer: bidderRequest.refererInfo && bidderRequest.refererInfo.referer
- }
- };
-
- for (let i = 0; i < validBidRequests.length; i++) {
- const bid = validBidRequests[i];
-
- payload.places.push({
- id: bid.bidId,
- placementId: bid.params.placementId,
- sizes: bid.sizes
- });
- }
-
- return {
- method: 'POST',
- url: URL,
- data: payload
- };
- },
- interpretResponse: (serverResponse) => {
- const bids = serverResponse.body && serverResponse.body.bids;
- if (!bids) {
- return [];
- }
-
- const bidResponses = [];
-
- for (let i = 0; i < bids.length; i++) {
- const bid = bids[i];
-
- bidResponses.push({
- requestId: bid.id,
- cpm: bid.cpm,
- width: bid.size.width,
- height: bid.size.height,
- creativeId: bid.creativeId,
- currency: RUB,
- netRevenue: true,
- ttl: TIME_TO_LIVE,
- adUrl: bid.displayUrl
- });
- }
-
- return bidResponses;
- },
- getUserSyncs: (syncOptions) => {
- if (syncOptions.iframeEnabled) {
- return [{
- type: 'iframe',
- url: SYNC_IFRAME_URL
- }];
- }
-
- if (syncOptions.pixelEnabled) {
- return [{
- type: 'image',
- url: SYNC_IMAGE_URL
- }];
- }
-
- return [];
- }
-};
-
-registerBidder(spec);
diff --git a/modules/sekindoUMBidAdapter.js b/modules/sekindoUMBidAdapter.js
deleted file mode 100644
index bea25173747..00000000000
--- a/modules/sekindoUMBidAdapter.js
+++ /dev/null
@@ -1,119 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-export const spec = {
- code: 'sekindoUM',
- 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: function(bid) {
- if (bid.mediaType == 'video' || (typeof bid.mediaTypes == 'object' && typeof bid.mediaTypes.video == 'object')) {
- if (typeof bid.params.video != 'object' || typeof bid.params.video.playerWidth == 'undefined' || typeof bid.params.video.playerHeight == 'undefined') {
- return false;
- }
- }
- return !!(bid.params.spaceId);
- },
- /**
- * 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) {
- var pubUrl = null;
- try {
- if (window.top == window) {
- pubUrl = window.location.href;
- } else {
- try {
- pubUrl = window.top.location.href;
- } catch (e2) {
- pubUrl = document.referrer;
- }
- }
- } catch (e1) {}
-
- return validBidRequests.map(bidRequest => {
- var subId = utils.getBidIdParameter('subId', bidRequest.params);
- var spaceId = utils.getBidIdParameter('spaceId', bidRequest.params);
- var bidfloor = utils.getBidIdParameter('bidfloor', bidRequest.params);
- var protocol = (document.location.protocol === 'https:' ? 's' : '');
- var queryString = '';
-
- queryString = utils.tryAppendQueryString(queryString, 's', spaceId);
- queryString = utils.tryAppendQueryString(queryString, 'subId', subId);
- queryString = utils.tryAppendQueryString(queryString, 'pubUrl', pubUrl);
- queryString = utils.tryAppendQueryString(queryString, 'hbTId', bidRequest.transactionId);
- queryString = utils.tryAppendQueryString(queryString, 'hbBidId', bidRequest.bidId);
- queryString = utils.tryAppendQueryString(queryString, 'hbver', '4');
- queryString = utils.tryAppendQueryString(queryString, 'hbcb', '1');/// legasy
- queryString = utils.tryAppendQueryString(queryString, 'dcpmflr', bidfloor);
- queryString = utils.tryAppendQueryString(queryString, 'protocol', protocol);
- queryString = utils.tryAppendQueryString(queryString, 'x', bidRequest.params.width);
- queryString = utils.tryAppendQueryString(queryString, 'y', bidRequest.params.height);
- if (bidderRequest && bidderRequest.gdprConsent) {
- queryString = utils.tryAppendQueryString(queryString, 'gdprConsent', bidderRequest.gdprConsent.consentString);
- queryString = utils.tryAppendQueryString(queryString, 'gdpr', (bidderRequest.gdprConsent.gdprApplies) ? '1' : '0');
- }
- if (bidRequest.mediaType === 'video' || (typeof bidRequest.mediaTypes == 'object' && typeof bidRequest.mediaTypes.video == 'object')) {
- queryString = utils.tryAppendQueryString(queryString, 'x', bidRequest.params.playerWidth);
- queryString = utils.tryAppendQueryString(queryString, 'y', bidRequest.params.playerHeight);
- if (typeof vid_vastType != 'undefined') { // eslint-disable-line camelcase
- queryString = utils.tryAppendQueryString(queryString, 'vid_vastType', bidRequest.params.vid_vastType);
- }
- if (typeof bidRequest.mediaTypes == 'object' && typeof bidRequest.mediaTypes.video == 'object' && typeof bidRequest.mediaTypes.video.context == 'string') {
- queryString = utils.tryAppendQueryString(queryString, 'vid_context', bidRequest.mediaTypes.video.context);
- }
- }
-
- var endpointUrl = 'https' + '://hb.sekindo.com/live/liveView.php';
-
- return {
- method: 'GET',
- url: endpointUrl,
- data: queryString,
- };
- });
- },
- /**
- * 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, bidRequest) {
- if (typeof serverResponse !== 'object') {
- return [];
- }
-
- let bidResponses = [];
- var bidResponse = {
- requestId: serverResponse.body.id,
- bidderCode: spec.code,
- cpm: serverResponse.body.cpm,
- width: serverResponse.body.width,
- height: serverResponse.body.height,
- creativeId: serverResponse.body.creativeId,
- currency: serverResponse.body.currency,
- netRevenue: serverResponse.body.netRevenue,
- ttl: serverResponse.body.ttl
- };
- if (bidRequest.mediaType == 'video') {
- if (typeof serverResponse.body.vastUrl != 'undefined') {
- bidResponse.vastUrl = serverResponse.body.vastUrl;
- } else {
- bidResponse.vastXml = serverResponse.body.vastXml;
- }
- } else {
- bidResponse.ad = serverResponse.body.ad;
- }
-
- bidResponses.push(bidResponse);
- return bidResponses;
- }
-}
-registerBidder(spec);
diff --git a/modules/sharedIdSystem.js b/modules/sharedIdSystem.js
index defa8d22639..2e3abd6b1a2 100644
--- a/modules/sharedIdSystem.js
+++ b/modules/sharedIdSystem.js
@@ -1,373 +1,177 @@
/**
- * This module adds Shared ID support to the User ID module
- * The {@link module:modules/userId} module is required.
+ * This module adds SharedId to the User ID module
+ * The {@link module:modules/userId} module is required
* @module modules/sharedIdSystem
* @requires module:modules/userId
*/
-import * as utils from '../src/utils.js'
-import {ajax} from '../src/ajax.js';
+import * as utils from '../src/utils.js';
import {submodule} from '../src/hook.js';
-import { uspDataHandler, coppaDataHandler } from '../src/adapterManager.js';
+import { coppaDataHandler } from '../src/adapterManager.js';
+import {getStorageManager} from '../src/storageManager.js';
-const MODULE_NAME = 'sharedId';
-const ID_SVC = 'https://id.sharedid.org/id';
-const DEFAULT_24_HOURS = 86400;
-const OPT_OUT_VALUE = '00000000000000000000000000';
-// These values should NEVER change. If
-// they do, we're no longer making ulids!
-const ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'; // Crockford's Base32
-const ENCODING_LEN = ENCODING.length;
-const TIME_MAX = Math.pow(2, 48) - 1;
-const TIME_LEN = 10;
-const RANDOM_LEN = 16;
-const id = factory();
const GVLID = 887;
-/**
- * Constructs cookie value
- * @param value
- * @param needsSync
- * @returns {string}
- */
-function constructCookieValue(value, needsSync) {
- const cookieValue = {};
- cookieValue.id = value;
- cookieValue.ts = utils.timestamp();
- if (needsSync) {
- cookieValue.ns = true;
- }
- utils.logInfo('SharedId: cookie Value: ' + JSON.stringify(cookieValue));
- return cookieValue;
-}
-
-/**
- * Checks if id needs to be synced
- * @param configParams
- * @param storedId
- * @returns {boolean}
- */
-function isIdSynced(configParams, storedId) {
- const needSync = storedId.ns;
- if (needSync) {
- return true;
- }
- if (!configParams || typeof configParams.syncTime !== 'number') {
- utils.logInfo('SharedId: Sync time is not configured or is not a number');
- }
- let syncTime = (!configParams || typeof configParams.syncTime !== 'number') ? DEFAULT_24_HOURS : configParams.syncTime;
- if (syncTime > DEFAULT_24_HOURS) {
- syncTime = DEFAULT_24_HOURS;
- }
- const cookieTimestamp = storedId.ts;
- if (cookieTimestamp) {
- var secondBetweenTwoDate = timeDifferenceInSeconds(utils.timestamp(), cookieTimestamp);
- return secondBetweenTwoDate >= syncTime;
- }
- return false;
-}
+const storage = getStorageManager(GVLID, 'pubCommonId');
+const COOKIE = 'cookie';
+const LOCAL_STORAGE = 'html5';
+const OPTOUT_NAME = '_pubcid_optout';
+const PUB_COMMON_ID = 'PublisherCommonId';
/**
- * Gets time difference in secounds
- * @param date1
- * @param date2
- * @returns {number}
+ * Read a value either from cookie or local storage
+ * @param {string} name Name of the item
+ * @param {string} type storage type override
+ * @returns {string|null} a string if item exists
*/
-function timeDifferenceInSeconds(date1, date2) {
- const diff = (date1 - date2) / 1000;
- return Math.abs(Math.round(diff));
-}
-
-/**
- * id generation call back
- * @param result
- * @param callback
- * @returns {{success: success, error: error}}
- */
-function idGenerationCallback(callback) {
- return {
- success: function (responseBody) {
- let value = {};
- if (responseBody) {
- try {
- let responseObj = JSON.parse(responseBody);
- utils.logInfo('SharedId: Generated SharedId: ' + responseObj.sharedId);
- value = constructCookieValue(responseObj.sharedId, false);
- } catch (error) {
- utils.logError(error);
- }
+function readValue(name, type) {
+ if (type === COOKIE) {
+ return storage.getCookie(name);
+ } else if (type === LOCAL_STORAGE) {
+ if (storage.hasLocalStorage()) {
+ const expValue = storage.getDataFromLocalStorage(`${name}_exp`);
+ if (!expValue) {
+ return storage.getDataFromLocalStorage(name);
+ } else if ((new Date(expValue)).getTime() - Date.now() > 0) {
+ return storage.getDataFromLocalStorage(name)
}
- callback(value);
- },
- error: function (statusText, responseBody) {
- const value = constructCookieValue(id(), true);
- utils.logInfo('SharedId: Ulid Generated SharedId: ' + value.id);
- callback(value);
}
}
}
-/**
- * existing id generation call back
- * @param result
- * @param callback
- * @returns {{success: success, error: error}}
- */
-function existingIdCallback(storedId, callback) {
- return {
- success: function (responseBody) {
- utils.logInfo('SharedId: id to be synced: ' + storedId.id);
- if (responseBody) {
- try {
- let responseObj = JSON.parse(responseBody);
- storedId = constructCookieValue(responseObj.sharedId, false);
- utils.logInfo('SharedId: Older SharedId: ' + storedId.id);
- } catch (error) {
- utils.logError(error);
- }
- }
- callback(storedId);
- },
- error: function () {
- utils.logInfo('SharedId: Sync error for id : ' + storedId.id);
- callback(storedId);
+function getIdCallback(pubcid, pixelCallback) {
+ return function (callback) {
+ if (typeof pixelCallback === 'function') {
+ pixelCallback();
}
+ callback(pubcid);
}
}
-/**
- * Encode the id
- * @param value
- * @returns {string|*}
- */
-function encodeId(value) {
- const result = {};
- const sharedId = (value && typeof value['id'] === 'string') ? value['id'] : undefined;
- if (sharedId == OPT_OUT_VALUE) {
- return undefined;
+function queuePixelCallback(pixelUrl, id = '', callback) {
+ if (!pixelUrl) {
+ return;
}
- if (sharedId) {
- const bidIds = {
- id: sharedId,
- }
- const ns = (value && typeof value['ns'] === 'boolean') ? value['ns'] : undefined;
- if (ns == undefined) {
- bidIds.third = sharedId;
- }
- result.sharedid = bidIds;
- utils.logInfo('SharedId: Decoded value ' + JSON.stringify(result));
- return result;
- }
- return sharedId;
-}
-
-/**
- * the factory to generate unique identifier based on time and current pseudorandom number
- * @param {string} the current pseudorandom number generator
- * @returns {function(*=): *}
- */
-function factory(currPrng) {
- if (!currPrng) {
- currPrng = detectPrng();
- }
- return function ulid(seedTime) {
- if (isNaN(seedTime)) {
- seedTime = Date.now();
- }
- return encodeTime(seedTime, TIME_LEN) + encodeRandom(RANDOM_LEN, currPrng);
- };
-}
-/**
- * creates and logs the error message
- * @function
- * @param {string} error message
- * @returns {Error}
- */
-function createError(message) {
- utils.logError(message);
- const err = new Error(message);
- err.source = 'sharedId';
- return err;
-}
+ // Use pubcid as a cache buster
+ const urlInfo = utils.parseUrl(pixelUrl);
+ urlInfo.search.id = encodeURIComponent('pubcid:' + id);
+ const targetUrl = utils.buildUrl(urlInfo);
-/**
- * gets a a random charcter from generated pseudorandom number
- * @param {string} the generated pseudorandom number
- * @returns {string}
- */
-function randomChar(prng) {
- let rand = Math.floor(prng() * ENCODING_LEN);
- if (rand === ENCODING_LEN) {
- rand = ENCODING_LEN - 1;
- }
- return ENCODING.charAt(rand);
-}
-
-/**
- * encodes the time based on the length
- * @param now
- * @param len
- * @returns {string} encoded time.
- */
-function encodeTime (now, len) {
- if (isNaN(now)) {
- throw new Error(now + ' must be a number');
- }
-
- if (Number.isInteger(now) === false) {
- throw createError('time must be an integer');
- }
-
- if (now > TIME_MAX) {
- throw createError('cannot encode time greater than ' + TIME_MAX);
- }
- if (now < 0) {
- throw createError('time must be positive');
- }
-
- if (Number.isInteger(len) === false) {
- throw createError('length must be an integer');
- }
- if (len < 0) {
- throw createError('length must be positive');
- }
-
- let mod;
- let str = '';
- for (; len > 0; len--) {
- mod = now % ENCODING_LEN;
- str = ENCODING.charAt(mod) + str;
- now = (now - mod) / ENCODING_LEN;
- }
- return str;
-}
-
-/**
- * encodes random character
- * @param len
- * @param prng
- * @returns {string}
- */
-function encodeRandom (len, prng) {
- let str = '';
- for (; len > 0; len--) {
- str = randomChar(prng) + str;
- }
- return str;
-}
-
-/**
- * detects the pseudorandom number generator and generates the random number
- * @function
- * @param {string} error message
- * @returns {string} a random number
- */
-function detectPrng(root) {
- if (!root) {
- root = typeof window !== 'undefined' ? window : null;
- }
- const browserCrypto = root && (root.crypto || root.msCrypto);
- if (browserCrypto) {
- return () => {
- const buffer = new Uint8Array(1);
- browserCrypto.getRandomValues(buffer);
- return buffer[0] / 0xff;
- };
- }
- return () => Math.random();
+ return function () {
+ utils.triggerPixel(targetUrl);
+ };
}
-/**
- * Builds and returns the shared Id URL with attached consent data if applicable
- * @param {Object} consentData
- * @return {string}
- */
-function sharedIdUrl(consentData) {
- const usPrivacyString = uspDataHandler.getConsentData();
- let sharedIdUrl = ID_SVC;
- if (usPrivacyString) {
- sharedIdUrl = `${ID_SVC}?us_privacy=${usPrivacyString}`;
- }
- if (!consentData || typeof consentData.gdprApplies !== 'boolean' || !consentData.gdprApplies) return sharedIdUrl;
- if (usPrivacyString) {
- sharedIdUrl = `${sharedIdUrl}&gdpr=1&gdpr_consent=${consentData.consentString}`
- return sharedIdUrl;
- }
- sharedIdUrl = `${ID_SVC}?gdpr=1&gdpr_consent=${consentData.consentString}`;
- return sharedIdUrl
+function hasOptedOut() {
+ return !!((storage.cookiesAreEnabled() && readValue(OPTOUT_NAME, COOKIE)) ||
+ (storage.hasLocalStorage() && readValue(OPTOUT_NAME, LOCAL_STORAGE)));
}
-/** @type {Submodule} */
-export const sharedIdSubmodule = {
+export const sharedIdSystemSubmodule = {
/**
* used to link submodule with config
* @type {string}
*/
- name: MODULE_NAME,
-
+ name: 'sharedId',
+ aliasName: 'pubCommonId',
/**
- * Vendor id of Prebid
+ * Vendor id of prebid
* @type {Number}
*/
gvlid: GVLID,
+
/**
* decode the stored id value for passing to bid requests
* @function
* @param {string} value
- * @returns {{sharedid:{ id: string, third:string}} or undefined if value doesn't exists
+ * @param {SubmoduleConfig} config
+ * @returns {{pubcid:string}}
*/
- decode(value) {
- return (value) ? encodeId(value) : undefined;
+ decode(value, config) {
+ if (hasOptedOut()) {
+ utils.logInfo('PubCommonId decode: Has opted-out');
+ return undefined;
+ }
+ utils.logInfo(' Decoded value PubCommonId ' + value);
+ const idObj = {'pubcid': value};
+ return idObj;
},
-
/**
- * performs action to obtain id and return a value.
+ * performs action to obtain id
* @function
- * @param {SubmoduleConfig} [config]
- * @param {ConsentData|undefined} consentData
- * @returns {sharedId}
+ * @param {SubmoduleConfig} [config] Config object with params and storage properties
+ * @param {Object} consentData
+ * @param {string} storedId Existing pubcommon id
+ * @returns {IdResponse}
*/
- getId(config, consentData) {
+ getId: function (config = {}, consentData, storedId) {
+ if (hasOptedOut()) {
+ utils.logInfo('PubCommonId: Has opted-out');
+ return;
+ }
const coppa = coppaDataHandler.getCoppa();
+
if (coppa) {
- utils.logInfo('SharedId: IDs not provided for coppa requests, exiting SharedId');
+ utils.logInfo('PubCommonId: IDs not provided for coppa requests, exiting PubCommonId');
return;
}
- const resp = function (callback) {
- utils.logInfo('SharedId: Sharedid doesnt exists, new cookie creation');
- ajax(sharedIdUrl(consentData), idGenerationCallback(callback), undefined, {method: 'GET', withCredentials: true});
- };
- return {callback: resp};
- },
+ const {params: {create = true, pixelUrl} = {}} = config;
+ let newId = storedId;
+ if (!newId) {
+ try {
+ if (typeof window[PUB_COMMON_ID] === 'object') {
+ // If the page includes its own pubcid module, then save a copy of id.
+ newId = window[PUB_COMMON_ID].getId();
+ }
+ } catch (e) {
+ }
+
+ if (!newId) newId = (create && utils.hasDeviceAccess()) ? utils.generateUUID() : undefined;
+ }
+ const pixelCallback = queuePixelCallback(pixelUrl, newId);
+ return {id: newId, callback: getIdCallback(newId, pixelCallback)};
+ },
/**
- * performs actions even if the id exists and returns a value
- * @param config
- * @param consentData
- * @param storedId
- * @returns {{callback: *}}
+ * performs action to extend an id. There are generally two ways to extend the expiration time
+ * of stored id: using pixelUrl or return the id and let main user id module write it again with
+ * the new expiration time.
+ *
+ * PixelUrl, if defined, should point back to a first party domain endpoint. On the server
+ * side, there is either a plugin, or customized logic to read and write back the pubcid cookie.
+ * The extendId function itself should return only the callback, and not the id itself to avoid
+ * having the script-side overwriting server-side. This applies to both pubcid and sharedid.
+ *
+ * On the other hand, if there is no pixelUrl, then the extendId should return storedId so that
+ * its expiration time is updated.
+ *
+ * @function
+ * @param {SubmoduleParams} [config]
+ * @param {ConsentData|undefined} consentData
+ * @param {Object} storedId existing id
+ * @returns {IdResponse|undefined}
*/
- extendId(config, consentData, storedId) {
+ extendId: function(config = {}, consentData, storedId) {
+ if (hasOptedOut()) {
+ utils.logInfo('PubCommonId: Has opted-out');
+ return {id: undefined};
+ }
const coppa = coppaDataHandler.getCoppa();
if (coppa) {
- utils.logInfo('SharedId: IDs not provided for coppa requests, exiting SharedId');
+ utils.logInfo('PubCommonId: IDs not provided for coppa requests, exiting PubCommonId');
return;
}
- const configParams = (config && config.params) || {};
- utils.logInfo('SharedId: Existing shared id ' + storedId.id);
- const resp = function (callback) {
- const needSync = isIdSynced(configParams, storedId);
- if (needSync) {
- utils.logInfo('SharedId: Existing shared id ' + storedId + ' is not synced');
- const sharedIdPayload = {};
- sharedIdPayload.sharedId = storedId.id;
- const payloadString = JSON.stringify(sharedIdPayload);
- ajax(sharedIdUrl(consentData), existingIdCallback(storedId, callback), payloadString, {method: 'POST', withCredentials: true});
+ const {params: {extend = false, pixelUrl} = {}} = config;
+
+ if (extend) {
+ if (pixelUrl) {
+ const callback = queuePixelCallback(pixelUrl, storedId);
+ return {callback: callback};
+ } else {
+ return {id: storedId};
}
- };
- return {callback: resp};
+ }
}
};
-// Register submodule for userId
-submodule('userId', sharedIdSubmodule);
+submodule('userId', sharedIdSystemSubmodule);
diff --git a/modules/sharedIdSystem.md b/modules/sharedIdSystem.md
deleted file mode 100644
index a4541c16c49..00000000000
--- a/modules/sharedIdSystem.md
+++ /dev/null
@@ -1,43 +0,0 @@
-## Shared ID User ID Submodule
-
-Shared ID User ID Module generates a UUID that can be utilized to improve user matching.This module enables timely synchronization which handles sharedId.org optout. This module does not require any registration.
-
-### Building Prebid with Shared Id Support
-Your Prebid build must include the modules for both **userId** and **sharedId** submodule. Follow the build instructions for Prebid as
-explained in the top level README.md file of the Prebid source tree.
-
-ex: $ gulp build --modules=userId,sharedIdSystem
-
-### Prebid Params
-
-Individual params may be set for the Shared ID User ID Submodule.
-```
-pbjs.setConfig({
- userSync: {
- userIds: [{
- name: 'sharedId',
- params: {
- syncTime: 60 // in seconds, default is 24 hours
- },
- storage: {
- name: 'sharedid',
- type: 'cookie',
- expires: 28
- },
- }]
- }
-});
-```
-
-### Parameter Descriptions for the `usersync` Configuration Section
-The below parameters apply only to the Shared ID User ID Module integration.
-
-| Params under usersync.userIds[]| Scope | Type | Description | Example |
-| --- | --- | --- | --- | --- |
-| name | Required | String | ID value for the Shared ID module - `"sharedId"` | `"sharedId"` |
-| params | Optional | Object | Details for sharedId syncing. | |
-| params.syncTime | Optional | Object | Configuration to define the frequency(in seconds) of id synchronization. By default id is synchronized every 24 hours | 60 |
-| storage | Required | Object | The publisher must specify the local storage in which to store the results of the call to get the user ID. This can be either cookie or HTML5 storage. | |
-| storage.type | Required | String | This is where the results of the user ID will be stored. The recommended method is `localStorage` by specifying `html5`. | `"html5"` |
-| storage.name | Required | String | The name of the cookie or html5 local storage where the user ID will be stored. | `"sharedid"` |
-| storage.expires | Optional | Integer | How long (in days) the user ID information will be stored. | `28` |
diff --git a/modules/sharethroughBidAdapter.js b/modules/sharethroughBidAdapter.js
index 68ccde0da46..967d8194607 100644
--- a/modules/sharethroughBidAdapter.js
+++ b/modules/sharethroughBidAdapter.js
@@ -2,7 +2,7 @@ import { registerBidder } from '../src/adapters/bidderFactory.js';
import * as utils from '../src/utils.js';
import { config } from '../src/config.js';
-const VERSION = '3.3.2';
+const VERSION = '3.4.1';
const BIDDER_CODE = 'sharethrough';
const STR_ENDPOINT = 'https://btlr.sharethrough.com/WYu2BXv1/v1';
const DEFAULT_SIZE = [1, 1];
@@ -29,9 +29,14 @@ export const sharethroughAdapterSpec = {
instant_play_capable: canAutoPlayHTML5Video(),
hbSource: 'prebid',
hbVersion: '$prebid.version$',
- strVersion: VERSION
+ strVersion: VERSION,
};
+ const gpid = utils.deepAccess(bidRequest, 'ortb2Imp.ext.data.pbadslot');
+ if (gpid) {
+ query.gpid = gpid;
+ }
+
Object.assign(query, handleUniversalIds(bidRequest));
const nonHttp = sharethroughInternal.getProtocol().indexOf('http') < 0;
@@ -57,8 +62,9 @@ export const sharethroughAdapterSpec = {
query.schain = JSON.stringify(bidRequest.schain);
}
- if (bidRequest.bidfloor) {
- query.bidfloor = parseFloat(bidRequest.bidfloor);
+ const floor = getFloor(bidRequest);
+ if (floor) {
+ query.bidfloor = floor;
}
if (bidRequest.params.badv) {
@@ -165,9 +171,6 @@ function handleUniversalIds(bidRequest) {
const lipb = utils.deepAccess(bidRequest, 'userId.lipb.lipbid');
if (lipb) universalIds.liuid = lipb;
- const shd = utils.deepAccess(bidRequest, 'userId.sharedid');
- if (shd) universalIds.shduid = shd; // object with keys: id & third
-
return universalIds;
}
@@ -292,4 +295,18 @@ function getProtocol() {
return document.location.protocol;
}
+function getFloor(bid) {
+ if (utils.isFn(bid.getFloor)) {
+ const floorInfo = bid.getFloor({
+ currency: 'USD',
+ mediaType: 'banner',
+ size: bid.sizes.map(size => ({ w: size[0], h: size[1] }))
+ });
+ if (utils.isPlainObject(floorInfo) && !isNaN(floorInfo.floor) && floorInfo.currency === 'USD') {
+ return parseFloat(floorInfo.floor);
+ }
+ }
+ return null;
+}
+
registerBidder(sharethroughAdapterSpec);
diff --git a/modules/shinezBidAdapter.js b/modules/shinezBidAdapter.js
deleted file mode 100644
index d5734d23fdc..00000000000
--- a/modules/shinezBidAdapter.js
+++ /dev/null
@@ -1,83 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'shinez';
-const BIDDER_SHORT_CODE = 'shz';
-const ADAPTER_VERSION = '1.0.0';
-
-const TARGET_URL = 'https://shinez-ssp.shinez.workers.dev/prebid';
-
-export const spec = {
- code: BIDDER_CODE,
- version: ADAPTER_VERSION,
- aliases: {
- code: BIDDER_SHORT_CODE
- },
- supportedMediaTypes: [ BANNER ],
- isBidRequestValid: isBidRequestValid,
- buildRequests: buildRequests,
- interpretResponse: interpretResponse,
-};
-
-export const internal = {
- TARGET_URL
-}
-
-function isBidRequestValid(bid) {
- return !!(bid && bid.params &&
- bid.params.placementId && typeof bid.params.placementId === 'string' &&
- (bid.params.unit == null || (typeof bid.params.unit === 'string' && bid.params.unit.length > 0))
- );
-}
-
-function buildRequests(validBidRequests, bidderRequest) {
- const utcOffset = (new Date()).getTimezoneOffset();
- const data = [];
- validBidRequests.forEach(function(bidRequest) {
- data.push(_buildServerBidRequest(bidRequest, bidderRequest, utcOffset));
- });
- const request = {
- method: 'POST',
- url: TARGET_URL,
- data: data
- };
- return request;
-}
-
-function interpretResponse(serverResponse, request) {
- const bids = [];
- serverResponse.body.forEach(function(serverBid) {
- bids.push(_convertServerBid(serverBid));
- });
- return bids;
-}
-
-function _buildServerBidRequest(bidRequest, bidderRequest, utcOffset) {
- return {
- bidId: bidRequest.bidId,
- transactionId: bidRequest.transactionId,
- crumbs: bidRequest.crumbs,
- mediaTypes: bidRequest.mediaTypes,
- refererInfo: bidderRequest.refererInfo,
- placementId: bidRequest.params.placementId,
- utcOffset: utcOffset,
- adUnitCode: bidRequest.adUnitCode,
- unit: bidRequest.params.unit
- }
-}
-
-function _convertServerBid(response) {
- return {
- requestId: response.bidId,
- cpm: response.cpm,
- currency: response.currency,
- width: response.width,
- height: response.height,
- ad: response.ad,
- ttl: response.ttl,
- creativeId: response.creativeId,
- netRevenue: response.netRevenue
- };
-}
-
-registerBidder(spec);
diff --git a/modules/showheroes-bsBidAdapter.js b/modules/showheroes-bsBidAdapter.js
index d0eb8c6a589..8d94a8e508b 100644
--- a/modules/showheroes-bsBidAdapter.js
+++ b/modules/showheroes-bsBidAdapter.js
@@ -166,6 +166,9 @@ function createBids(bidRes, reqData) {
bidUnit.netRevenue = true;
bidUnit.width = bid.size.width;
bidUnit.height = bid.size.height;
+ bidUnit.meta = {
+ advertiserDomains: bid.adomain || []
+ };
if (bid.vastXml) {
bidUnit.vastXml = bid.vastXml;
bidUnit.adResponse = {
diff --git a/modules/slimcutBidAdapter.js b/modules/slimcutBidAdapter.js
deleted file mode 100644
index d717f3a88bd..00000000000
--- a/modules/slimcutBidAdapter.js
+++ /dev/null
@@ -1,128 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { ajax } from '../src/ajax.js';
-
-const BIDDER_CODE = 'slimcut';
-const ENDPOINT_URL = 'https://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: 'https://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/smaatoBidAdapter.js b/modules/smaatoBidAdapter.js
index fbb4c14e5f8..700fcf17785 100644
--- a/modules/smaatoBidAdapter.js
+++ b/modules/smaatoBidAdapter.js
@@ -1,79 +1,23 @@
import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { config } from '../src/config.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
+import {registerBidder} from '../src/adapters/bidderFactory.js';
+import {config} from '../src/config.js';
+import {ADPOD, BANNER, VIDEO} from '../src/mediaTypes.js';
const BIDDER_CODE = 'smaato';
const SMAATO_ENDPOINT = 'https://prebid.ad.smaato.net/oapi/prebid';
-const CLIENT = 'prebid_js_$prebid.version$_1.1'
-
-/**
-* Transform BidRequest to OpenRTB-formatted BidRequest Object
-* @param {Array} validBidRequests
-* @param {any} bidderRequest
-* @returns {string}
-*/
-const buildOpenRtbBidRequestPayload = (validBidRequests, bidderRequest) => {
- /**
- * Turn incoming prebid sizes into openRtb format mapping.
- * @param {*} sizes in format [[10, 10], [20, 20]]
- * @returns array of openRtb format mappings [{w: 10, h: 10}, {w: 20, h: 20}]
- */
- const parseSizes = (sizes) => {
- return sizes.map((size) => {
- return {w: size[0], h: size[1]};
- })
- }
-
- const imp = validBidRequests.map(br => {
- const bannerMediaType = utils.deepAccess(br, 'mediaTypes.banner');
- const videoMediaType = utils.deepAccess(br, 'mediaTypes.video');
- let result = {
- id: br.bidId,
- tagid: utils.deepAccess(br, 'params.adspaceId')
- }
-
- if (bannerMediaType) {
- const sizes = parseSizes(utils.getAdUnitSizes(br));
- result.banner = {
- w: sizes[0].w,
- h: sizes[0].h,
- format: sizes
- }
- }
+const SMAATO_CLIENT = 'prebid_js_$prebid.version$_1.4'
+const CURRENCY = 'USD';
- if (videoMediaType) {
- result.video = {
- mimes: videoMediaType.mimes,
- minduration: videoMediaType.minduration,
- startdelay: videoMediaType.startdelay,
- linearity: videoMediaType.linearity,
- w: videoMediaType.playerSize[0][0],
- h: videoMediaType.playerSize[0][1],
- maxduration: videoMediaType.maxduration,
- skip: videoMediaType.skip,
- protocols: videoMediaType.protocols,
- ext: {
- rewarded: videoMediaType.ext && videoMediaType.ext.rewarded ? videoMediaType.ext.rewarded : 0
- },
- skipmin: videoMediaType.skipmin,
- api: videoMediaType.api
- }
- }
-
- return result;
- });
-
- const request = {
+const buildOpenRtbBidRequest = (bidRequest, bidderRequest) => {
+ const requestTemplate = {
id: bidderRequest.auctionId,
at: 1,
- imp,
- cur: ['USD'],
+ cur: [CURRENCY],
tmax: bidderRequest.timeout,
site: {
id: window.location.hostname,
publisher: {
- id: utils.deepAccess(validBidRequests[0], 'params.publisherId')
+ id: utils.deepAccess(bidRequest, 'params.publisherId')
},
domain: window.location.hostname,
page: window.location.href,
@@ -94,38 +38,68 @@ const buildOpenRtbBidRequestPayload = (validBidRequests, bidderRequest) => {
ext: {}
},
ext: {
- client: CLIENT
+ client: SMAATO_CLIENT
}
};
let ortb2 = config.getConfig('ortb2') || {};
-
- Object.assign(request.user, ortb2.user);
- Object.assign(request.site, ortb2.site);
+ Object.assign(requestTemplate.user, ortb2.user);
+ Object.assign(requestTemplate.site, ortb2.site);
if (bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies === true) {
- utils.deepSetValue(request, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0);
- utils.deepSetValue(request, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
+ utils.deepSetValue(requestTemplate, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies ? 1 : 0);
+ utils.deepSetValue(requestTemplate, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
}
if (bidderRequest.uspConsent !== undefined) {
- utils.deepSetValue(request, 'regs.ext.us_privacy', bidderRequest.uspConsent);
+ utils.deepSetValue(requestTemplate, 'regs.ext.us_privacy', bidderRequest.uspConsent);
}
- if (utils.deepAccess(validBidRequests[0], 'params.app')) {
- const geo = utils.deepAccess(validBidRequests[0], 'params.app.geo');
- utils.deepSetValue(request, 'device.geo', geo);
- const ifa = utils.deepAccess(validBidRequests[0], 'params.app.ifa')
- utils.deepSetValue(request, 'device.ifa', ifa);
+ if (utils.deepAccess(bidRequest, 'params.app')) {
+ const geo = utils.deepAccess(bidRequest, 'params.app.geo');
+ utils.deepSetValue(requestTemplate, 'device.geo', geo);
+ const ifa = utils.deepAccess(bidRequest, 'params.app.ifa')
+ utils.deepSetValue(requestTemplate, 'device.ifa', ifa);
}
- const eids = utils.deepAccess(validBidRequests[0], 'userIdAsEids');
+ const eids = utils.deepAccess(bidRequest, 'userIdAsEids');
if (eids && eids.length) {
- utils.deepSetValue(request, 'user.ext.eids', eids);
+ utils.deepSetValue(requestTemplate, 'user.ext.eids', eids);
}
- utils.logInfo('[SMAATO] OpenRTB Request:', request);
- return JSON.stringify(request);
+ let requests = [];
+
+ if (utils.deepAccess(bidRequest, 'mediaTypes.banner')) {
+ const bannerRequest = Object.assign({}, requestTemplate, createBannerImp(bidRequest));
+ requests.push(bannerRequest);
+ }
+
+ const videoMediaType = utils.deepAccess(bidRequest, 'mediaTypes.video');
+ if (videoMediaType) {
+ if (videoMediaType.context === ADPOD) {
+ const adPodRequest = Object.assign({}, requestTemplate, createAdPodImp(bidRequest, videoMediaType));
+ addOptionalAdpodParameters(adPodRequest, videoMediaType);
+ requests.push(adPodRequest);
+ } else {
+ const videoRequest = Object.assign({}, requestTemplate, createVideoImp(bidRequest, videoMediaType));
+ requests.push(videoRequest);
+ }
+ }
+
+ return requests;
+}
+
+const buildServerRequest = (validBidRequest, data) => {
+ utils.logInfo('[SMAATO] OpenRTB Request:', data);
+ return {
+ method: 'POST',
+ url: validBidRequest.params.endpoint || SMAATO_ENDPOINT,
+ data: JSON.stringify(data),
+ options: {
+ withCredentials: true,
+ crossOrigin: true,
+ }
+ };
}
export const spec = {
@@ -133,41 +107,66 @@ export const spec = {
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.
- */
+ * 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 typeof bid.params === 'object' &&
- typeof bid.params.publisherId === 'string' &&
- typeof bid.params.adspaceId === 'string';
+ if (typeof bid.params !== 'object') {
+ utils.logError('[SMAATO] Missing params object');
+ return false;
+ }
+
+ if (typeof bid.params.publisherId !== 'string') {
+ utils.logError('[SMAATO] Missing mandatory publisherId param');
+ return false;
+ }
+
+ if (utils.deepAccess(bid, 'mediaTypes.video.context') === ADPOD) {
+ utils.logInfo('[SMAATO] Verifying adpod bid request');
+
+ if (typeof bid.params.adbreakId !== 'string') {
+ utils.logError('[SMAATO] Missing for adpod request mandatory adbreakId param');
+ return false;
+ }
+
+ if (bid.params.adspaceId) {
+ utils.logError('[SMAATO] The adspaceId param is not allowed in an adpod bid request');
+ return false;
+ }
+ } else {
+ utils.logInfo('[SMAATO] Verifying a non adpod bid request');
+
+ if (typeof bid.params.adspaceId !== 'string') {
+ utils.logError('[SMAATO] Missing mandatory adspaceId param');
+ return false;
+ }
+
+ if (bid.params.adbreakId) {
+ utils.logError('[SMAATO] The adbreakId param is only allowed in an adpod bid request');
+ return false;
+ }
+ }
+
+ utils.logInfo('[SMAATO] Verification done, all good');
+ return true;
},
- /**
- * 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) => {
- utils.logInfo('[SMAATO] Client version:', CLIENT);
- return {
- method: 'POST',
- url: validBidRequests[0].params.endpoint || SMAATO_ENDPOINT,
- data: buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest),
- options: {
- withCredentials: true,
- crossOrigin: true,
- }
- };
+ utils.logInfo('[SMAATO] Client version:', SMAATO_CLIENT);
+
+ return validBidRequests.map((validBidRequest) => {
+ const openRtbBidRequests = buildOpenRtbBidRequest(validBidRequest, bidderRequest);
+ return openRtbBidRequests.map((openRtbBidRequest) => buildServerRequest(validBidRequest, openRtbBidRequest));
+ }).reduce((acc, item) => item != null && acc.concat(item), []);
},
/**
- * 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.
- */
+ * 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: (serverResponse, bidRequest) => {
// response is empty (HTTP 204)
if (utils.isEmpty(serverResponse.body)) {
@@ -175,58 +174,70 @@ export const spec = {
return []; // no bids
}
- let serverResponseHeaders = serverResponse.headers;
- const smtAdType = serverResponseHeaders.get('X-SMT-ADTYPE');
+ const serverResponseHeaders = serverResponse.headers;
const smtExpires = serverResponseHeaders.get('X-SMT-Expires');
- let ttlSec = 300;
utils.logInfo('[SMAATO] Expires:', smtExpires);
- if (smtExpires) {
- ttlSec = Math.floor((smtExpires - Date.now()) / 1000);
- }
+ const ttlInSec = smtExpires ? Math.floor((smtExpires - Date.now()) / 1000) : 300;
- const res = serverResponse.body;
- utils.logInfo('[SMAATO] OpenRTB Response:', res);
+ const response = serverResponse.body;
+ utils.logInfo('[SMAATO] OpenRTB Response:', response);
- var bids = [];
- res.seatbid.forEach(sb => {
- sb.bid.forEach(b => {
+ const smtAdType = serverResponseHeaders.get('X-SMT-ADTYPE');
+ const bids = [];
+ response.seatbid.forEach(seatbid => {
+ seatbid.bid.forEach(bid => {
let resultingBid = {
- requestId: b.impid,
- cpm: b.price || 0,
- width: b.w,
- height: b.h,
- ttl: ttlSec,
- creativeId: b.crid,
- dealId: b.dealid || null,
- netRevenue: utils.deepAccess(b, 'ext.net', true),
- currency: res.cur,
+ requestId: bid.impid,
+ cpm: bid.price || 0,
+ width: bid.w,
+ height: bid.h,
+ ttl: ttlInSec,
+ creativeId: bid.crid,
+ dealId: bid.dealid || null,
+ netRevenue: utils.deepAccess(bid, 'ext.net', true),
+ currency: response.cur,
meta: {
- advertiserDomains: b.adomain,
- networkName: b.bidderName,
- agencyId: sb.seat
+ advertiserDomains: bid.adomain,
+ networkName: bid.bidderName,
+ agencyId: seatbid.seat
}
};
- switch (smtAdType) {
- case 'Img':
- resultingBid.ad = createImgAd(b.adm);
- resultingBid.meta.mediaType = BANNER;
- bids.push(resultingBid);
- break;
- case 'Richmedia':
- resultingBid.ad = createRichmediaAd(b.adm);
- resultingBid.meta.mediaType = BANNER;
- bids.push(resultingBid);
- break;
- case 'Video':
- resultingBid.vastXml = b.adm;
- resultingBid.meta.mediaType = VIDEO;
- bids.push(resultingBid);
- break;
- default:
- utils.logInfo('[SMAATO] Invalid ad type:', smtAdType);
+ const videoContext = utils.deepAccess(JSON.parse(bidRequest.data).imp[0], 'video.ext.context')
+ if (videoContext === ADPOD) {
+ resultingBid.vastXml = bid.adm;
+ resultingBid.mediaType = VIDEO;
+ if (config.getConfig('adpod.brandCategoryExclusion')) {
+ resultingBid.meta.primaryCatId = bid.cat[0];
+ }
+ resultingBid.video = {
+ context: ADPOD,
+ durationSeconds: bid.ext.duration
+ };
+ bids.push(resultingBid);
+ } else {
+ switch (smtAdType) {
+ case 'Img':
+ resultingBid.ad = createImgAd(bid.adm);
+ resultingBid.mediaType = BANNER;
+ bids.push(resultingBid);
+ break;
+ case 'Richmedia':
+ resultingBid.ad = createRichmediaAd(bid.adm);
+ resultingBid.mediaType = BANNER;
+ bids.push(resultingBid);
+ break;
+ case 'Video':
+ resultingBid.vastXml = bid.adm;
+ resultingBid.mediaType = VIDEO;
+ bids.push(resultingBid);
+ break;
+ default:
+ utils.logInfo('[SMAATO] Invalid ad type:', smtAdType);
+ }
}
+ resultingBid.meta.mediaType = resultingBid.mediaType;
});
});
@@ -235,15 +246,14 @@ export const spec = {
},
/**
- * 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.
- */
+ * 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, gdprConsent, uspConsent) => {
- const syncs = []
- return syncs;
+ return [];
}
}
registerBidder(spec);
@@ -280,3 +290,150 @@ const createRichmediaAd = (adm) => {
return markup + '';
};
+
+function createBannerImp(bidRequest) {
+ const adUnitSizes = utils.getAdUnitSizes(bidRequest);
+ const sizes = adUnitSizes.map((size) => ({w: size[0], h: size[1]}));
+ return {
+ imp: [{
+ id: bidRequest.bidId,
+ tagid: utils.deepAccess(bidRequest, 'params.adspaceId'),
+ bidfloor: getBidFloor(bidRequest, BANNER, adUnitSizes),
+ banner: {
+ w: sizes[0].w,
+ h: sizes[0].h,
+ format: sizes
+ }
+ }]
+ };
+}
+
+function createVideoImp(bidRequest, videoMediaType) {
+ return {
+ imp: [{
+ id: bidRequest.bidId,
+ tagid: utils.deepAccess(bidRequest, 'params.adspaceId'),
+ bidfloor: getBidFloor(bidRequest, VIDEO, videoMediaType.playerSize),
+ video: {
+ mimes: videoMediaType.mimes,
+ minduration: videoMediaType.minduration,
+ startdelay: videoMediaType.startdelay,
+ linearity: videoMediaType.linearity,
+ w: videoMediaType.playerSize[0][0],
+ h: videoMediaType.playerSize[0][1],
+ maxduration: videoMediaType.maxduration,
+ skip: videoMediaType.skip,
+ protocols: videoMediaType.protocols,
+ ext: {
+ rewarded: videoMediaType.ext && videoMediaType.ext.rewarded ? videoMediaType.ext.rewarded : 0
+ },
+ skipmin: videoMediaType.skipmin,
+ api: videoMediaType.api
+ }
+ }]
+ };
+}
+
+function createAdPodImp(bidRequest, videoMediaType) {
+ const tagid = utils.deepAccess(bidRequest, 'params.adbreakId')
+ const bce = config.getConfig('adpod.brandCategoryExclusion')
+ let imp = {
+ id: bidRequest.bidId,
+ tagid: tagid,
+ bidfloor: getBidFloor(bidRequest, VIDEO, videoMediaType.playerSize),
+ video: {
+ w: videoMediaType.playerSize[0][0],
+ h: videoMediaType.playerSize[0][1],
+ mimes: videoMediaType.mimes,
+ startdelay: videoMediaType.startdelay,
+ linearity: videoMediaType.linearity,
+ skip: videoMediaType.skip,
+ protocols: videoMediaType.protocols,
+ skipmin: videoMediaType.skipmin,
+ api: videoMediaType.api,
+ ext: {
+ context: ADPOD,
+ brandcategoryexclusion: bce !== undefined && bce
+ }
+ }
+ }
+
+ const numberOfPlacements = getAdPodNumberOfPlacements(videoMediaType)
+ let imps = utils.fill(imp, numberOfPlacements)
+
+ const durationRangeSec = videoMediaType.durationRangeSec
+ if (videoMediaType.requireExactDuration) {
+ // equal distribution of numberOfPlacement over all available durations
+ const divider = Math.ceil(numberOfPlacements / durationRangeSec.length)
+ const chunked = utils.chunk(imps, divider)
+
+ // each configured duration is set as min/maxduration for a subset of requests
+ durationRangeSec.forEach((duration, index) => {
+ chunked[index].map(imp => {
+ const sequence = index + 1;
+ imp.video.minduration = duration
+ imp.video.maxduration = duration
+ imp.video.sequence = sequence
+ });
+ });
+ } else {
+ // all maxdurations should be the same
+ const maxDuration = utils.getMaxValueFromArray(durationRangeSec);
+ imps.map((imp, index) => {
+ const sequence = index + 1;
+ imp.video.maxduration = maxDuration
+ imp.video.sequence = sequence
+ });
+ }
+
+ return {
+ imp: imps
+ }
+}
+
+function getAdPodNumberOfPlacements(videoMediaType) {
+ const {adPodDurationSec, durationRangeSec, requireExactDuration} = videoMediaType
+ const minAllowedDuration = utils.getMinValueFromArray(durationRangeSec)
+ const numberOfPlacements = Math.floor(adPodDurationSec / minAllowedDuration)
+
+ return requireExactDuration
+ ? Math.max(numberOfPlacements, durationRangeSec.length)
+ : numberOfPlacements
+}
+
+const addOptionalAdpodParameters = (request, videoMediaType) => {
+ const content = {}
+
+ if (videoMediaType.tvSeriesName) {
+ content.series = videoMediaType.tvSeriesName
+ }
+ if (videoMediaType.tvEpisodeName) {
+ content.title = videoMediaType.tvEpisodeName
+ }
+ if (typeof videoMediaType.tvSeasonNumber === 'number') {
+ content.season = videoMediaType.tvSeasonNumber.toString() // conversion to string as in OpenRTB season is a string
+ }
+ if (typeof videoMediaType.tvEpisodeNumber === 'number') {
+ content.episode = videoMediaType.tvEpisodeNumber
+ }
+ if (typeof videoMediaType.contentLengthSec === 'number') {
+ content.len = videoMediaType.contentLengthSec
+ }
+ if (videoMediaType.contentMode && ['live', 'on-demand'].indexOf(videoMediaType.contentMode) >= 0) {
+ content.livestream = videoMediaType.contentMode === 'live' ? 1 : 0
+ }
+
+ if (!utils.isEmpty(content)) {
+ request.site.content = content
+ }
+}
+
+function getBidFloor(bidRequest, mediaType, sizes) {
+ if (typeof bidRequest.getFloor === 'function') {
+ const size = sizes.length === 1 ? sizes[0] : '*';
+ const floor = bidRequest.getFloor({currency: CURRENCY, mediaType: mediaType, size: size});
+ if (floor && !isNaN(floor.floor) && (floor.currency === CURRENCY)) {
+ return floor.floor;
+ }
+ }
+}
diff --git a/modules/smaatoBidAdapter.md b/modules/smaatoBidAdapter.md
index d26d7ecf64e..41e1c952f2a 100644
--- a/modules/smaatoBidAdapter.md
+++ b/modules/smaatoBidAdapter.md
@@ -61,4 +61,35 @@ var adUnits = [{
}
}]
}];
-```
\ No newline at end of file
+```
+
+For adpod adunits:
+
+```
+var adUnits = [{
+ "code": "adpod unit",
+ "mediaTypes": {
+ "video": {
+ "context": "adpod",
+ "playerSize": [640, 480],
+ "adPodDurationSec": 300,
+ "durationRangeSec": [15, 30],
+ "requireExactDuration": false,
+ "mimes": ["video/mp4"],
+ "startdelay": 0,
+ "linearity": 1,
+ "protocols": [7],
+ "skip": 1,
+ "skipmin": 5,
+ "api": [7],
+ }
+ },
+ "bids": [{
+ "bidder": "smaato",
+ "params": {
+ "publisherId": "1100042525",
+ "adbreakId": "330563103"
+ }
+ }]
+}];
+```
diff --git a/modules/smartadserverBidAdapter.js b/modules/smartadserverBidAdapter.js
index bb9364c72c3..54c58084dff 100644
--- a/modules/smartadserverBidAdapter.js
+++ b/modules/smartadserverBidAdapter.js
@@ -86,15 +86,36 @@ export const spec = {
h: size[1]
}));
} else if (videoMediaType && (videoMediaType.context === 'instream' || videoMediaType.context === 'outstream')) {
+ // use IAB ORTB values if the corresponding values weren't already set by bid.params.video
+ // Assign a default protocol, the highest value possible means we are retrocompatible with all older values.
+ var protocol = null;
+ if (bid.params.video && bid.params.video.protocol) {
+ protocol = bid.params.video.protocol;
+ } else if (Array.isArray(videoMediaType.protocols)) {
+ protocol = Math.max.apply(Math, videoMediaType.protocols);
+ }
+
+ // Default value for all exotic cases set to bid.params.video.startDelay midroll hence 2.
+ var startDelay = 2;
+ if (bid.params.video && bid.params.video.startDelay) {
+ startDelay = bid.params.video.startDelay
+ } else if (videoMediaType.startdelay == 0) {
+ startDelay = 1;
+ } else if (videoMediaType.startdelay == -1) {
+ startDelay = 2;
+ } else if (videoMediaType.startdelay == -2) {
+ startDelay = 3;
+ }
+
// Specific attributes for instream.
let playerSize = videoMediaType.playerSize[0];
payload.isVideo = videoMediaType.context === 'instream';
payload.mediaType = VIDEO;
payload.videoData = {
- videoProtocol: bid.params.video.protocol,
+ videoProtocol: protocol,
playerWidth: playerSize[0],
playerHeight: playerSize[1],
- adBreak: bid.params.video.startDelay || 1
+ adBreak: startDelay
};
} else {
return {};
@@ -148,7 +169,8 @@ export const spec = {
currency: response.currency,
netRevenue: response.isNetCpm,
ttl: response.ttl,
- dspPixels: response.dspPixels
+ dspPixels: response.dspPixels,
+ meta: { advertiserDomains: response.adomain ? response.adomain : [] }
};
if (bidRequest.mediaType === VIDEO) {
diff --git a/modules/smarticoBidAdapter.js b/modules/smarticoBidAdapter.js
index 9107ce5f908..2399a12f932 100644
--- a/modules/smarticoBidAdapter.js
+++ b/modules/smarticoBidAdapter.js
@@ -66,9 +66,8 @@ export const spec = {
method: SMARTICO_CONFIG.method,
url: SMARTICO_CONFIG.bidRequestUrl,
bids: validBidRequests,
- data: {bidParams: bidParams, auctionId: bidderRequest.auctionId, origin: window.location.origin}
+ data: {bidParams: bidParams, auctionId: bidderRequest.auctionId}
}
-
return ServerRequestObjects;
},
interpretResponse: function (serverResponse, bidRequest) {
@@ -78,13 +77,14 @@ export const spec = {
var url
var html
var ad
+ var ads
var token
var language
var scriptId
var bidResponses = []
-
- for (i = 0; i < serverResponse.length; i++) {
- ad = serverResponse[i];
+ ads = serverResponse.body
+ for (i = 0; i < ads.length; i++) {
+ ad = ads[i]
bid = find(bidRequest.bids, bid => bid.bidId === ad.bidId)
if (bid) {
token = bid.params.token || ''
@@ -103,9 +103,14 @@ export const spec = {
width: parseInt(ad.bannerFormatWidth),
height: parseInt(ad.bannerFormatHeight),
creativeId: ad.id,
- netRevenue: false, // gross
+ netRevenue: !!ad.netRevenue,
+ currency: ad.currency,
ttl: ad.ttl,
- ad: html
+ ad: html,
+ meta: {
+ advertiserDomains: ad.domains,
+ advertiserName: ad.title
+ }
}
bidResponses.push(bidObject);
}
diff --git a/modules/smartxBidAdapter.js b/modules/smartxBidAdapter.js
index b2c48b58f82..c29708c8420 100644
--- a/modules/smartxBidAdapter.js
+++ b/modules/smartxBidAdapter.js
@@ -46,14 +46,6 @@ export const spec = {
utils.logError(BIDDER_CODE + ': siteId is not present in bidder params');
return false;
}
- if (!utils.getBidIdParameter('bidfloor', bid.params)) {
- utils.logError(BIDDER_CODE + ': bidfloor is not present in bidder params');
- return false;
- }
- if (!utils.getBidIdParameter('bidfloorcur', bid.params)) {
- utils.logError(BIDDER_CODE + ': bidfloorcur is not present in bidder params');
- return false;
- }
if (utils.deepAccess(bid, 'mediaTypes.video.context') === 'outstream') {
if (!utils.getBidIdParameter('outstream_options', bid.params)) {
utils.logError(BIDDER_CODE + ': outstream_options parameter is not defined');
@@ -63,10 +55,6 @@ export const spec = {
utils.logError(BIDDER_CODE + ': slot parameter is not defined in outstream_options object in the configuration');
return false;
}
- if (!utils.getBidIdParameter('outstream_function', bid.params)) {
- utils.logMessage(BIDDER_CODE + ': outstream_function parameter is not defined. The default outstream renderer will be injected in the header.');
- return true;
- }
}
return true;
@@ -85,11 +73,11 @@ export const spec = {
const smartxRequests = bidRequests.map(function (bid) {
const tagId = utils.getBidIdParameter('tagId', bid.params);
const publisherId = utils.getBidIdParameter('publisherId', bid.params);
- const bidfloor = utils.getBidIdParameter('bidfloor', bid.params);
- const bidfloorcur = utils.getBidIdParameter('bidfloorcur', bid.params);
+ const bidfloor = getBidFloor(bid) || 0;
+ const bidfloorcur = utils.getBidIdParameter('bidfloorcur', bid.params) || 'EUR';
const siteId = utils.getBidIdParameter('siteId', bid.params);
const domain = utils.getBidIdParameter('domain', bid.params);
- const cat = utils.getBidIdParameter('cat', bid.params);
+ const cat = utils.getBidIdParameter('cat', bid.params) || [''];
let pubcid = null;
const playerSize = utils.deepAccess(bid, 'mediaTypes.video.playerSize');
const contentWidth = playerSize[0][0];
@@ -116,7 +104,7 @@ export const spec = {
placement = 3;
}
- let smartxReq = {
+ let smartxReq = [{
id: bid.bidId,
secure: secure,
bidfloor: bidfloor,
@@ -142,7 +130,7 @@ export const spec = {
ext: {
'smart.bidpricetype': 1
}
- };
+ }];
if (bid.crumbs && bid.crumbs.pubcid) {
pubcid = bid.crumbs.pubcid;
@@ -170,7 +158,6 @@ export const spec = {
id: siteId,
page: page,
cat: cat,
- content: 'content',
domain: domain,
publisher: {
id: publisherId
@@ -226,6 +213,8 @@ export const spec = {
}
}
+ // Todo: USER ID MODULE
+
requestPayload.user = {
ext: userExt,
data: targetingarr
@@ -302,7 +291,7 @@ export const spec = {
const playersize = utils.deepAccess(currentBidRequest, 'mediaTypes.video.playerSize');
const renderer = Renderer.install({
id: 0,
- url: '/',
+ url: 'https://dco.smartclip.net/?plc=7777778',
config: {
adText: 'SmartX Outstream Video Ad via Prebid.js',
player_width: playersize[0][0],
@@ -310,12 +299,11 @@ export const spec = {
content_page_url: utils.deepAccess(bidderRequest, 'data.site.page'),
ad_mute: +!!utils.deepAccess(currentBidRequest, 'params.ad_mute'),
hide_skin: +!!utils.deepAccess(currentBidRequest, 'params.hide_skin'),
- outstream_options: utils.deepAccess(currentBidRequest, 'params.outstream_options'),
- outstream_function: utils.deepAccess(currentBidRequest, 'params.outstream_function')
+ outstream_options: utils.deepAccess(currentBidRequest, 'params.outstream_options')
}
});
try {
- renderer.setRender(outstreamRender);
+ renderer.setRender(createOutstreamConfig);
renderer.setEventHandlers({
impression: function impression() {
return utils.logMessage('SmartX outstream video impression event');
@@ -340,7 +328,7 @@ export const spec = {
}
}
-function createOutstreamScript(bid) {
+function createOutstreamConfig(bid) {
const confMinAdWidth = utils.getBidIdParameter('minAdWidth', bid.renderer.config.outstream_options) || 290;
const confMaxAdWidth = utils.getBidIdParameter('maxAdWidth', bid.renderer.config.outstream_options) || 900;
const confStartOpen = utils.getBidIdParameter('startOpen', bid.renderer.config.outstream_options);
@@ -380,36 +368,39 @@ function createOutstreamScript(bid) {
smartPlayObj.adResponse = bid.vastContent;
const divID = '[id="' + elementId + '"]';
- var script = document.createElement('script');
- script.src = 'https://dco.smartclip.net/?plc=7777778';
- script.type = 'text/javascript';
- script.async = 'true';
- script.onload = script.onreadystatechange = function () {
- try {
- // eslint-disable-next-line
+
+ try {
+ // eslint-disable-next-line
let _outstreamPlayer = new OutstreamPlayer(divID, smartPlayObj);
- } catch (e) {
- utils.logError('[SmartPlay][renderer] Error caught: ' + e);
- }
- };
- return script;
+ } catch (e) {
+ utils.logError('[SMARTX][renderer] Error caught: ' + e);
+ }
+ return smartPlayObj;
}
-function outstreamRender(bid) {
- const script = createOutstreamScript(bid);
- if (bid.renderer.config.outstream_function != null && typeof bid.renderer.config.outstream_function === 'function') {
- bid.renderer.config.outstream_function(bid, script);
- } else {
- try {
- const slot = utils.getBidIdParameter('slot', bid.renderer.config.outstream_options);
- if (slot && window.document.getElementById(slot)) {
- window.document.getElementById(slot).appendChild(script);
- } else {
- window.document.getElementsByTagName('head')[0].appendChild(script);
- }
- } catch (err) {
- utils.logError('[SMARTX][renderer] Error:' + err.message)
+/**
+ * Get the floor price from bid.params for backward compatibility.
+ * If not found, then check floor module.
+ * @param bid A valid bid object
+ * @returns {*|number} floor price
+ */
+function getBidFloor(bid) {
+ let floor = utils.getBidIdParameter('bidfloor', bid.params);
+ let floorcur = utils.getBidIdParameter('bidfloorcur', bid.params) || 'EUR';
+
+ if (!floor && utils.isFn(bid.getFloor)) {
+ const floorObj = bid.getFloor({
+ currency: floorcur,
+ mediaType: '*',
+ size: '*'
+ });
+
+ if (utils.isPlainObject(floorObj) && !isNaN(floorObj.floor) && floorObj.currency === floorcur) {
+ floor = floorObj.floor;
}
}
+
+ return floor;
}
+
registerBidder(spec);
diff --git a/modules/smilewantedBidAdapter.js b/modules/smilewantedBidAdapter.js
index fb05298a230..fad1aad194c 100644
--- a/modules/smilewantedBidAdapter.js
+++ b/modules/smilewantedBidAdapter.js
@@ -29,7 +29,6 @@ export const spec = {
var payload = {
zoneId: bid.params.zoneId,
currencyCode: config.getConfig('currency.adServerCurrency') || 'EUR',
- bidfloor: bid.params.bidfloor || 0.0,
tagId: bid.adUnitCode,
sizes: bid.sizes.map(size => ({
w: size[0],
@@ -41,6 +40,15 @@ export const spec = {
prebidVersion: '$prebid.version$'
};
+ const floor = getBidFloor(bid);
+ if (floor) {
+ payload.bidfloor = floor;
+ }
+
+ if (bid.params.bidfloor) {
+ payload.bidfloor = bid.params.bidfloor;
+ }
+
if (bidderRequest && bidderRequest.refererInfo) {
payload.pageDomain = bidderRequest.refererInfo.referer || '';
}
@@ -70,6 +78,7 @@ export const spec = {
try {
if (response) {
+ const dealId = response.dealId || '';
const bidResponse = {
requestId: JSON.parse(bidRequest.data).bidId,
cpm: response.cpm,
@@ -93,6 +102,14 @@ export const spec = {
bidResponse['renderer'] = newRenderer(JSON.parse(bidRequest.data), response);
}
+ if (dealId.length > 0) {
+ bidResponse.dealId = dealId;
+ }
+
+ bidResponse.meta = {};
+ if (response.meta && response.meta.advertiserDomains && utils.isArray(response.meta.advertiserDomains)) {
+ bidResponse.meta.advertiserDomains = response.meta.advertiserDomains;
+ }
bidResponses.push(bidResponse);
}
} catch (error) {
@@ -172,4 +189,24 @@ function outstreamRender(bid) {
});
}
+/**
+ * Get the floor price from bid.params for backward compatibility.
+ * If not found, then check floor module.
+ * @param bid A valid bid object
+ * @returns {*|number} floor price
+ */
+function getBidFloor(bid) {
+ if (utils.isFn(bid.getFloor)) {
+ const floorInfo = bid.getFloor({
+ currency: 'USD',
+ mediaType: 'banner',
+ size: bid.sizes.map(size => ({ w: size[0], h: size[1] }))
+ });
+ if (utils.isPlainObject(floorInfo) && !isNaN(floorInfo.floor) && floorInfo.currency === 'USD') {
+ return parseFloat(floorInfo.floor);
+ }
+ }
+ return null;
+}
+
registerBidder(spec);
diff --git a/modules/smmsBidAdapter.js b/modules/smmsBidAdapter.js
deleted file mode 100644
index 670caebe61b..00000000000
--- a/modules/smmsBidAdapter.js
+++ /dev/null
@@ -1,156 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'smms';
-const ENDPOINT_BANNER = 'https://bidder.mediams.mb.softbank.jp/api/v1/prebid/banner';
-const ENDPOINT_NATIVE = 'https://bidder.mediams.mb.softbank.jp/api/v1/prebid/native';
-const COOKIE_SYNC_URL = 'https://bidder.mediams.mb.softbank.jp/api/v1/cookie/gen';
-const SUPPORTED_MEDIA_TYPES = ['banner', 'native'];
-const SUPPORTED_CURRENCIES = ['USD', 'JPY'];
-const DEFAULT_CURRENCY = 'JPY';
-const NET_REVENUE = true;
-
-function _encodeURIComponent(a) {
- let b = window.encodeURIComponent(a);
- b = b.replace(/'/g, '%27');
- return b;
-}
-
-export function _getUrlVars(url) {
- let hash;
- const myJson = {};
- const hashes = url.slice(url.indexOf('?') + 1).split('&');
- for (let i = 0; i < hashes.length; i++) {
- hash = hashes[i].split('=');
- myJson[hash[0]] = hash[1];
- }
- return myJson;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
- isBidRequestValid: function(bid) {
- let valid = !!(bid.params.placementId);
- if (valid && bid.params.hasOwnProperty('currency')) {
- if (SUPPORTED_CURRENCIES.indexOf(bid.params.currency) === -1) {
- utils.logError('Invalid currency type, we support only JPY and USD!');
- valid = false;
- }
- }
-
- return valid;
- },
- /**
- * 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 serverRequests = [];
- let refererInfo;
- if (bidderRequest && bidderRequest.refererInfo) {
- refererInfo = bidderRequest.refererInfo;
- }
-
- // eslint-disable-next-line no-undef
- const g = (typeof (geparams) !== 'undefined' && typeof (geparams) == 'object' && geparams) ? geparams : {};
- validBidRequests.forEach((bid, i) => {
- let endpoint = ENDPOINT_BANNER;
- let data = {
- 'placementid': bid.params.placementId,
- 'cur': bid.params.hasOwnProperty('currency') ? bid.params.currency : DEFAULT_CURRENCY,
- 'ua': navigator.userAgent,
- 'adtk': _encodeURIComponent(g.lat ? '0' : '1'),
- 'loc': (refererInfo && refererInfo.referer) ? refererInfo.referer : '',
- 'topframe': (window.parent == window.self) ? 1 : 0,
- 'sw': screen && screen.width,
- 'sh': screen && screen.height,
- 'cb': Math.floor(Math.random() * 99999999999),
- 'tpaf': 1,
- 'cks': 1,
- 'requestid': bid.bidId,
- 'referer': (refererInfo && refererInfo.referer) ? refererInfo.referer : ''
- };
-
- if (bid.hasOwnProperty('nativeParams')) {
- endpoint = ENDPOINT_NATIVE;
- data.tkf = 1; // return url tracker
- data.ad_track = '1';
- data.apiv = '1.1.0';
- }
-
- serverRequests.push({
- method: 'GET',
- url: endpoint,
- data: utils.parseQueryStringParameters(data)
- });
- });
-
- return serverRequests;
- },
- interpretResponse: function(serverResponse, request) {
- const data = _getUrlVars(request.data)
- const successBid = serverResponse.body || {};
- let bidResponses = [];
- if (successBid.hasOwnProperty(data.placementid)) {
- let bid = successBid[data.placementid]
- let bidResponse = {
- requestId: bid.requestid,
- cpm: bid.price,
- creativeId: bid.creativeId,
- currency: bid.cur,
- netRevenue: NET_REVENUE,
- ttl: 700
- };
-
- if (bid.hasOwnProperty('title')) { // it is native ad response
- bidResponse.mediaType = 'native'
- bidResponse.native = {
- title: bid.title,
- body: bid.description,
- cta: bid.cta,
- sponsoredBy: bid.advertiser,
- clickUrl: _encodeURIComponent(bid.landingURL),
- impressionTrackers: bid.trackings,
- }
- if (bid.screenshots) {
- bidResponse.native.image = {
- url: bid.screenshots.url,
- height: bid.screenshots.height,
- width: bid.screenshots.width,
- }
- }
- if (bid.icon) {
- bidResponse.native.icon = {
- url: bid.icon.url,
- height: bid.icon.height,
- width: bid.icon.width,
- }
- }
- } else {
- bidResponse.ad = bid.adm
- bidResponse.width = bid.width
- bidResponse.height = bid.height
- }
-
- bidResponses.push(bidResponse);
- }
-
- return bidResponses;
- },
- getUserSyncs: function(syncOptions, serverResponses) {
- let syncs = []
- syncs.push({
- type: 'image',
- url: COOKIE_SYNC_URL
- })
-
- return syncs;
- },
- onTimeout: function(timeoutData) {},
- onBidWon: function(bid) {},
- onSetTargeting: function(bid) {}
-}
-registerBidder(spec);
diff --git a/modules/somoBidAdapter.js b/modules/somoBidAdapter.js
deleted file mode 100644
index c6e31790005..00000000000
--- a/modules/somoBidAdapter.js
+++ /dev/null
@@ -1,289 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import includes from 'core-js-pure/features/array/includes.js';
-import {BANNER, VIDEO} from '../src/mediaTypes.js';
-
-const VIDEO_TARGETING = ['mimes', 'minduration', 'maxduration', 'protocols',
- 'startdelay', 'linearity', 'skip', 'delivery',
- 'pos', 'api', 'ext', 'battr'];
-const BANNER_TARGETING = ['battr', 'btype', 'pos', 'mimes', 'ext'];
-
-const SITE_TARGETING = ['name', 'domain', 'cat', 'keywords', 'content']
-const APP_TARGETING = ['name', 'bundle', 'domain', 'storeUrl', 'cat', 'ver', 'keywords', 'content']
-
-export const spec = {
-
- code: 'somo',
-
- supportedMediaTypes: [BANNER, VIDEO],
- aliases: ['somoaudience'],
-
- isBidRequestValid: bid => (
- !!(bid && bid.params && bid.params.placementId)
- ),
-
- buildRequests: function(bidRequests, bidderRequest) {
- return bidRequests.map(bidRequest => {
- let da = openRtbRequest(bidRequest, bidderRequest);
-
- return {
- method: 'POST',
- url: 'https://publisher-east.mobileadtrading.com/rtb/bid?s=' + bidRequest.params.placementId.toString(),
- data: da,
- bidRequest: bidRequest
- };
- });
- },
-
- interpretResponse(response, request) {
- return bidResponseAvailable(request, response);
- },
-
- getUserSyncs: (syncOptions, serverResponses, gdprConsent) => {
- const syncs = [];
- var url = 'https://publisher-east.mobileadtrading.com/usersync';
-
- if (syncOptions.pixelEnabled) {
- if (gdprConsent && typeof gdprConsent.consentString === 'string') {
- // add 'gdpr' only if 'gdprApplies' is defined
- if (typeof gdprConsent.gdprApplies === 'boolean') {
- url += `?gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
- }
- }
- syncs.push({
- type: 'image',
- url: url
- });
- }
- return syncs;
- }
-};
-
-function bidResponseAvailable(bidRequest, bidResponse) {
- let bidResponses = [];
-
- if (bidResponse.body) {
- let bidData = bidResponse.body.seatbid[0].bid[0];
- const bid = {
- requestId: bidResponse.body.id,
- cpm: bidData.price,
- width: bidData.w,
- height: bidData.h,
- ad: bidData.adm,
- ttl: 360,
- creativeId: bidData.crid,
- adId: bidData.impid,
- netRevenue: false,
- currency: 'USD',
- adUnitCode: bidRequest.bidRequest.adUnitCode
- };
- if (isVideo(bidRequest.bidRequest)) {
- bid.vastXml = bidData.adm;
- bid.mediaType = 'video';
- } else {
- bid.ad = bidData.adm;
- bid.mediaType = 'banner';
- }
- bidResponses.push(bid);
- }
- return bidResponses;
-}
-
-function openRtbRequest(bidRequest, bidderRequest) {
- var openRtbRequest = {
- id: bidRequest.bidId,
- imp: [openRtbImpression(bidRequest)],
- at: 1,
- tmax: 400,
- site: openRtbSite(bidRequest, bidderRequest),
- app: openRtbApp(bidRequest),
- device: openRtbDevice(),
- bcat: openRtbBCat(bidRequest),
- badv: openRtbBAdv(bidRequest),
- ext: {
- prebid: '$prebid.version$',
- },
- };
- if (typeof bidderRequest !== 'undefined') {
- openRtbRequest = populateOpenRtbGdpr(bidderRequest.gdprConsent, openRtbRequest);
- }
-
- return openRtbRequest;
-}
-
-function populateOpenRtbGdpr(gdpr, bidRequest) {
- if (gdpr && bidRequest && 'gdprApplies' in gdpr) {
- if (!('reqs' in bidRequest)) {
- bidRequest.reqs = {};
- }
- if (!('ext' in bidRequest.reqs)) {
- bidRequest.reqs.ext = {};
- }
- bidRequest.reqs.ext.gdpr = gdpr.gdprApplies;
-
- if ('consentString' in gdpr) {
- if (!('user' in bidRequest)) {
- bidRequest.user = {};
- }
- if (!('ext' in bidRequest.user)) {
- bidRequest.user.ext = {};
- }
- bidRequest.user.ext.consent = gdpr.consentString;
- }
- }
-
- return bidRequest;
-}
-
-function openRtbImpression(bidRequest) {
- const imp = {
- 'id': bidRequest.bidId,
- bidfloor: bidRequest.params.bidfloor || 0,
- };
- if (isVideo(bidRequest)) {
- imp.video = {};
- if (bidRequest.mediaTypes &&
- bidRequest.mediaTypes.video &&
- bidRequest.mediaTypes.video.sizes) {
- const sizes = getSizes(bidRequest.mediaTypes.video.sizes);
- imp.video.w = sizes[0];
- imp.video.h = sizes[1];
- }
- if (bidRequest.params.video) {
- Object.keys(bidRequest.params.video)
- .filter(param => includes(VIDEO_TARGETING, param))
- .forEach(param => imp.video[param] = bidRequest.params.video[param]);
- }
- } else {
- imp.banner = {
- topframe: 0
- };
- if (bidRequest.mediaTypes &&
- bidRequest.mediaTypes.banner &&
- bidRequest.mediaTypes.banner.sizes) {
- const sizes = getSizes(bidRequest.mediaTypes.banner.sizes);
- imp.banner.w = sizes[0];
- imp.banner.h = sizes[1];
- }
- if (bidRequest.params.banner) {
- Object.keys(bidRequest.params.banner)
- .filter(param => includes(BANNER_TARGETING, param))
- .forEach(param => imp.banner[param] = bidRequest.params.banner[param]);
- }
- }
- return imp;
-}
-
-function isApp(bidRequest) {
- if (bidRequest.params.app) {
- return true;
- } else {
- return false;
- }
-}
-
-function openRtbSite(bidRequest, bidderRequest) {
- if (!isApp(bidRequest)) {
- const site = {};
-
- if (bidderRequest && bidderRequest.refererInfo) {
- site.ref = bidderRequest.refererInfo.referer;
- site.page = bidderRequest.refererInfo.canonicalUrl;
- }
-
- if (bidRequest.params.site) {
- Object.keys(bidRequest.params.site)
- .filter(param => includes(SITE_TARGETING, param))
- .forEach(param => site[param] = bidRequest.params.site[param]);
- }
- if (typeof site.domain === 'undefined' &&
- typeof site.page !== 'undefined') {
- if (typeof window.URL === 'function') {
- site.domain = (new window.URL(site.page)).hostname;
- } else {
- site.domain = getDomainFromUrl(site.page);
- }
- }
-
- return site;
- } else {
- return null;
- }
-}
-
-function getDomainFromUrl(url) {
- var domain = url;
-
- if (url.indexOf('//') > -1) {
- domain = url.split('/')[2];
- } else {
- domain = url.split('/')[0];
- }
-
- domain = domain.split(':')[0];
- domain = domain.split('?')[0];
-
- return domain;
-}
-
-function openRtbApp(bidRequest) {
- if (isApp(bidRequest)) {
- const app = {
-
- }
- Object.keys(bidRequest.params.app)
- .filter(param => includes(APP_TARGETING, param))
- .forEach(param => app[param] = bidRequest.params.app[param]);
-
- return app;
- } else {
- return null;
- }
-}
-
-function openRtbDevice() {
- return {
- ip: 'check',
- ua: navigator.userAgent,
- language: (navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage),
- };
-}
-
-function openRtbBCat(bidRequest) {
- if (utils.isArray(bidRequest.params.bcat)) {
- return bidRequest.params.bcat;
- }
- return [];
-}
-
-function openRtbBAdv(bidRequest) {
- if (utils.isArray(bidRequest.params.badv)) {
- return bidRequest.params.badv;
- }
- return [];
-}
-
-function isVideo(format) {
- return utils.deepAccess(format, 'mediaTypes.video') || format.mediaType == 'video';
-}
-
-/* Turn bid request sizes into compatible format */
-function getSizes(requestSizes) {
- let width = 0;
- let height = 0;
- if (utils.isArray(requestSizes) && requestSizes.length === 2 &&
- !utils.isArray(requestSizes[0])) {
- width = parseInt(requestSizes[0], 10);
- height = parseInt(requestSizes[1], 10);
- } else if (typeof requestSizes === 'object') {
- for (let i = 0; i < requestSizes.length; i++) {
- let size = requestSizes[i];
- width = parseInt(size[0], 10);
- height = parseInt(size[1], 10);
- break;
- }
- }
- return [width, height];
-}
-
-registerBidder(spec);
diff --git a/modules/sonobiBidAdapter.js b/modules/sonobiBidAdapter.js
index eb6009079ac..2edcdca1a51 100644
--- a/modules/sonobiBidAdapter.js
+++ b/modules/sonobiBidAdapter.js
@@ -1,5 +1,5 @@
import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { parseSizesInput, logError, generateUUID, isEmpty, deepAccess, logWarn, logMessage, deepClone, getGptSlotInfoForAdUnitCode } from '../src/utils.js';
+import { parseSizesInput, logError, generateUUID, isEmpty, deepAccess, logWarn, logMessage, deepClone, getGptSlotInfoForAdUnitCode, isFn, isPlainObject } from '../src/utils.js';
import { BANNER, VIDEO } from '../src/mediaTypes.js';
import { config } from '../src/config.js';
import { Renderer } from '../src/Renderer.js';
@@ -303,8 +303,10 @@ function _validateSlot (bid) {
}
function _validateFloor (bid) {
- if (bid.params.floor) {
- return `|f=${bid.params.floor}`;
+ const floor = getBidFloor(bid);
+
+ if (floor) {
+ return `|f=${floor}`;
}
return '';
}
@@ -407,4 +409,21 @@ function _iframeAllowed() {
return userSync.canBidderRegisterSync('iframe', BIDDER_CODE);
}
+function getBidFloor(bid) {
+ if (!isFn(bid.getFloor)) {
+ return (bid.params.floor) ? bid.params.floor : null;
+ }
+
+ let floor = bid.getFloor({
+ currency: 'USD',
+ mediaType: '*',
+ size: '*'
+ });
+
+ if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'USD') {
+ return floor.floor;
+ }
+ return '';
+}
+
registerBidder(spec);
diff --git a/modules/sortableBidAdapter.js b/modules/sortableBidAdapter.js
index 6989abff143..906369eccc3 100644
--- a/modules/sortableBidAdapter.js
+++ b/modules/sortableBidAdapter.js
@@ -129,6 +129,24 @@ function transformSyncs(responses, type, syncs) {
});
}
+function getBidFloor(bid) {
+ if (!utils.isFn(bid.getFloor)) {
+ return bid.params.floor ? bid.params.floor : null;
+ }
+
+ // MediaType and Size will automatically get set for us if the bid only has
+ // one media type or one size.
+ let floor = bid.getFloor({
+ currency: 'USD',
+ mediaType: '*',
+ size: '*'
+ });
+ if (utils.isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'USD') {
+ return floor.floor;
+ }
+ return null;
+}
+
export const spec = {
code: BIDDER_CODE,
supportedMediaTypes: [BANNER, NATIVE, VIDEO],
@@ -136,13 +154,8 @@ export const spec = {
isBidRequestValid: function(bid) {
const sortableConfig = config.getConfig('sortable');
const haveSiteId = (sortableConfig && !!sortableConfig.siteId) || bid.params.siteId;
- const validFloor = !bid.params.floor || utils.isNumber(bid.params.floor);
- const validSize = /\d+x\d+/;
- const validFloorSizeMap = !bid.params.floorSizeMap ||
- (utils.isPlainObject(bid.params.floorSizeMap) &&
- Object.keys(bid.params.floorSizeMap).every(size =>
- size.match(validSize) && utils.isNumber(bid.params.floorSizeMap[size])
- ))
+ const floor = getBidFloor(bid);
+ const validFloor = !floor || utils.isNumber(floor);
const validKeywords = !bid.params.keywords ||
(utils.isPlainObject(bid.params.keywords) &&
Object.keys(bid.params.keywords).every(key =>
@@ -150,7 +163,7 @@ export const spec = {
))
const isBanner = !bid.mediaTypes || bid.mediaTypes[BANNER] || !(bid.mediaTypes[NATIVE] || bid.mediaTypes[VIDEO]);
const bannerSizes = isBanner ? utils.deepAccess(bid, `mediaType.${BANNER}.sizes`) || bid.sizes : null;
- return !!(bid.params.tagId && haveSiteId && validFloor && validFloorSizeMap && validKeywords && (!isBanner ||
+ return !!(bid.params.tagId && haveSiteId && validFloor && validKeywords && (!isBanner ||
(bannerSizes && bannerSizes.length > 0 && bannerSizes.every(sizeArr => sizeArr.length == 2 && sizeArr.every(num => utils.isNumber(num))))));
},
@@ -202,8 +215,9 @@ export const spec = {
}
rv.video = video;
}
- if (bid.params.floor) {
- rv.bidfloor = bid.params.floor;
+ const floor = getBidFloor(bid);
+ if (floor) {
+ rv.floor = floor;
}
if (bid.params.keywords) {
rv.ext.keywords = bid.params.keywords;
@@ -213,9 +227,6 @@ export const spec = {
rv.ext[partner] = params;
});
}
- if (bid.params.floorSizeMap) {
- rv.ext.floorSizeMap = bid.params.floorSizeMap;
- }
return rv;
});
const gdprConsent = bidderRequest && bidderRequest.gdprConsent;
@@ -291,7 +302,10 @@ export const spec = {
currency: 'USD',
netRevenue: true,
mediaType: BANNER,
- ttl: 60
+ ttl: 60,
+ meta: {
+ advertiserDomains: bid.adomain || []
+ }
};
if (bid.adm) {
const adFormat = utils.deepAccess(bid, 'ext.ad_format')
diff --git a/modules/spotxBidAdapter.js b/modules/spotxBidAdapter.js
index b60d25db4d6..e18c0d3ba3e 100644
--- a/modules/spotxBidAdapter.js
+++ b/modules/spotxBidAdapter.js
@@ -163,10 +163,6 @@ export const spec = {
}
};
- if (utils.getBidIdParameter('price_floor', bid.params) != '') {
- spotxReq.bidfloor = utils.getBidIdParameter('price_floor', bid.params);
- }
-
if (utils.getBidIdParameter('start_delay', bid.params) != '') {
spotxReq.video.startdelay = 0 + Boolean(utils.getBidIdParameter('start_delay', bid.params));
}
diff --git a/modules/sspBCBidAdapter.js b/modules/sspBCBidAdapter.js
index d166a01a1da..15e0baa811f 100644
--- a/modules/sspBCBidAdapter.js
+++ b/modules/sspBCBidAdapter.js
@@ -9,10 +9,11 @@ const BIDDER_URL = 'https://ssp.wp.pl/bidder/';
const SYNC_URL = 'https://ssp.wp.pl/bidder/usersync';
const NOTIFY_URL = 'https://ssp.wp.pl/bidder/notify';
const TMAX = 450;
-const BIDDER_VERSION = '4.9';
+const BIDDER_VERSION = '5.0';
const W = window;
const { navigator } = W;
const oneCodeDetection = {};
+const adSizesCalled = {};
var consentApiVersion;
/**
@@ -69,7 +70,7 @@ const cookieSupport = () => {
};
const applyClientHints = ortbRequest => {
- const connection = navigator.connection || false;
+ const { connection = {}, deviceMemory, userAgentData = {} } = navigator;
const viewport = W.visualViewport || false;
const segments = [];
const hints = {
@@ -77,9 +78,11 @@ const applyClientHints = ortbRequest => {
'CH-Rtt': connection.rtt,
'CH-SaveData': connection.saveData,
'CH-Downlink': connection.downlink,
- 'CH-DeviceMemory': navigator.deviceMemory,
+ 'CH-DeviceMemory': deviceMemory,
'CH-Dpr': W.devicePixelRatio,
'CH-ViewportWidth': viewport.width,
+ 'CH-BrowserBrands': JSON.stringify(userAgentData.brands),
+ 'CH-isMobile': userAgentData.mobile,
};
Object.keys(hints).forEach(key => {
@@ -153,22 +156,37 @@ const mapBanner = slot => {
}
const mapImpression = slot => {
- const { adUnitCode, bidId, params } = slot;
- const { id, siteId } = params || {};
+ const { adUnitCode, bidId, params = {}, ortb2Imp = {} } = slot;
+ const { id, siteId } = params;
+ const { ext = {} } = ortb2Imp;
+
+ /*
+ check max size for this imp, and check/store number this size was called (for current view)
+ send this info as ext.pbsize
+ */
+ const slotSize = slot.sizes.length ? slot.sizes.reduce((prev, next) => prev[0] * prev[1] <= next[0] * next[1] ? next : prev).join('x') : '1x1';
+ adSizesCalled[slotSize] = adSizesCalled[slotSize] ? adSizesCalled[slotSize] + 1 : 1;
+ ext.data = Object.assign({ pbsize: `${slotSize}_${adSizesCalled[slotSize]}` }, ext.data);
+
const imp = {
id: id && siteId ? id : 'bidid-' + bidId,
banner: mapBanner(slot),
- /* native: mapNative(slot), */
+ // native: mapNative(slot),
tagid: adUnitCode,
+ ext,
};
// Check floorprices for this imp
if (typeof slot.getFloor === 'function') {
- // sspBC adapter accepts only floor per imp - check for maximum value for requested ad sizes
- imp.bidfloor = slot.sizes.reduce((prev, next) => {
- const currentFloor = slot.getFloor({ mediaType: 'banner', size: next }).floor;
- return prev > currentFloor ? prev : currentFloor;
- }, 0);
+ let bannerFloor = 0;
+ // sspBC adapter accepts only floor per imp - check for maximum value for requested ad types and sizes
+ if (slot.sizes.length) {
+ bannerFloor = slot.sizes.reduce((prev, next) => {
+ const currentFloor = slot.getFloor({ mediaType: 'banner', size: next }).floor;
+ return prev > currentFloor ? prev : currentFloor;
+ }, 0);
+ }
+ imp.bidfloor = bannerFloor;
}
return imp;
}
diff --git a/modules/stroeerCoreBidAdapter.js b/modules/stroeerCoreBidAdapter.js
index ec442f5125a..9d10092b2d8 100644
--- a/modules/stroeerCoreBidAdapter.js
+++ b/modules/stroeerCoreBidAdapter.js
@@ -174,6 +174,9 @@ export const spec = {
currency: 'EUR',
netRevenue: true,
creativeId: '',
+ meta: {
+ advertiserDomains: bidResponse.adomain
+ },
});
});
}
diff --git a/modules/stvBidAdapter.js b/modules/stvBidAdapter.js
deleted file mode 100644
index 2200e01b089..00000000000
--- a/modules/stvBidAdapter.js
+++ /dev/null
@@ -1,150 +0,0 @@
-
-import * as utils from '../src/utils.js';
-import {config} from '../src/config.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'stv';
-const VADS_ENDPOINT_URL = 'https://ads.smartstream.tv/r/';
-const DEFAULT_VIDEO_SOURCE = 'vads';
-const DEFAULT_BANNER_FORMAT = 'vast2';
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['vads'],
- supportedMediaTypes: [BANNER, VIDEO],
- isBidRequestValid: function(bid) {
- return !!(bid.params.placement);
- },
- buildRequests: function(validBidRequests, bidderRequest) {
- return validBidRequests.map(bidRequest => {
- const params = bidRequest.params;
-
- const videoData = utils.deepAccess(bidRequest, 'mediaTypes.video') || {};
- const sizes = utils.parseSizesInput(videoData.playerSize || bidRequest.sizes)[0];
- const width = sizes.split('x')[0];
- const height = sizes.split('x')[1];
-
- const placementId = params.placement;
-
- const rnd = Math.floor(Math.random() * 99999999999);
- const referrer = bidderRequest.refererInfo.referer;
- const bidId = bidRequest.bidId;
- let endpoint = VADS_ENDPOINT_URL;
-
- let payload = {};
- if (isVideoRequest(bidRequest)) {
- const source = params.source || DEFAULT_VIDEO_SOURCE;
- if (source === 'vads') {
- payload = {
- _f: 'vast2',
- alternative: 'prebid_js',
- _ps: placementId,
- srw: width,
- srh: height,
- idt: 100,
- rnd: rnd,
- ref: referrer,
- bid_id: bidId,
- };
- endpoint = VADS_ENDPOINT_URL;
- }
- } else {
- const outputFormat = params.format || DEFAULT_BANNER_FORMAT;
- payload = {
- _f: outputFormat,
- alternative: 'prebid_js',
- inventory_item_id: placementId,
- srw: width,
- srh: height,
- idt: 100,
- rnd: rnd,
- ref: referrer,
- bid_id: bidId,
- };
- }
- prepareExtraParams(params, payload);
-
- return {
- method: 'GET',
- url: endpoint,
- data: objectToQueryString(payload),
- }
- });
- },
- interpretResponse: function(serverResponse, bidRequest) {
- const bidResponses = [];
- const response = serverResponse.body;
- const crid = response.crid || 0;
- const cpm = response.cpm / 1000000 || 0;
- if (cpm !== 0 && crid !== 0) {
- const dealId = response.dealid || '';
- const currency = response.currency || 'EUR';
- const netRevenue = (response.netRevenue === undefined) ? true : response.netRevenue;
- const bidResponse = {
- requestId: response.bid_id,
- cpm: cpm,
- width: response.width,
- height: response.height,
- creativeId: crid,
- dealId: dealId,
- currency: currency,
- netRevenue: netRevenue,
- ttl: config.getConfig('_bidderTimeout')
- };
-
- if (response.vastXml) {
- bidResponse.vastXml = response.vastXml;
- bidResponse.mediaType = 'video';
- } else {
- bidResponse.ad = response.adTag;
- }
-
- bidResponses.push(bidResponse);
- }
- return bidResponses;
- }
-}
-
-function objectToQueryString(obj, prefix) {
- let str = [];
- let p;
- for (p in obj) {
- if (obj.hasOwnProperty(p)) {
- let k = prefix ? prefix + '[' + p + ']' : p;
- let v = obj[p];
- str.push((v !== null && typeof v === 'object')
- ? objectToQueryString(v, k)
- : encodeURIComponent(k) + '=' + (k == '_ps' ? v : encodeURIComponent(v)));
- }
- }
- return str.join('&');
-}
-
-/**
- * Check if it's a video bid request
- *
- * @param {BidRequest} bid - Bid request generated from ad slots
- * @returns {boolean} True if it's a video bid
- */
-function isVideoRequest(bid) {
- return bid.mediaType === 'video' || !!utils.deepAccess(bid, 'mediaTypes.video');
-}
-
-function prepareExtraParams(params, payload) {
- if (params.pfilter !== undefined) {
- payload.pfilter = params.pfilter;
- }
- if (params.bcat !== undefined) {
- payload.bcat = params.bcat;
- }
- if (params.noskip !== undefined) {
- payload.noskip = params.noskip;
- }
-
- if (params.dvt !== undefined) {
- payload.dvt = params.dvt;
- }
-}
-
-registerBidder(spec);
diff --git a/modules/sublimeBidAdapter.js b/modules/sublimeBidAdapter.js
index 41fdb72e76e..462665202a5 100644
--- a/modules/sublimeBidAdapter.js
+++ b/modules/sublimeBidAdapter.js
@@ -9,7 +9,7 @@ const DEFAULT_CURRENCY = 'EUR';
const DEFAULT_PROTOCOL = 'https';
const DEFAULT_TTL = 600;
const SUBLIME_ANTENNA = 'antenna.ayads.co';
-const SUBLIME_VERSION = '0.7.1';
+const SUBLIME_VERSION = '0.7.3';
/**
* Identify the current device type
@@ -40,7 +40,8 @@ export function log(msg, obj) {
export const state = {
zoneId: '',
transactionId: '',
- notifyId: ''
+ notifyId: '',
+ timeout: config.getConfig('bidderTimeout'),
};
/**
@@ -66,9 +67,9 @@ export function sendEvent(eventName, sspName) {
e: eventName,
src: 'pa',
puid: state.transactionId || state.notifyId,
- trId: state.transactionId || state.notifyId,
+ notid: state.notifyId || '',
pbav: SUBLIME_VERSION,
- pubtimeout: config.getConfig('bidderTimeout'),
+ pubtimeout: state.timeout,
pubpbv: '$prebid.version$',
device: detectDevice(),
};
@@ -109,6 +110,8 @@ function buildRequests(validBidRequests, bidderRequest) {
timeout: (typeof bidderRequest === 'object' && !!bidderRequest) ? bidderRequest.timeout : config.getConfig('bidderTimeout'),
};
+ setState({ timeout: commonPayload.timeout });
+
// RefererInfo
if (bidderRequest && bidderRequest.refererInfo) {
commonPayload.referer = bidderRequest.refererInfo.referer;
@@ -207,6 +210,12 @@ function interpretResponse(serverResponse, bidRequest) {
sspname: response.sspname || null
};
+ // We don't support advertiserDomains atm
+ if (response.advertiserDomains) {
+ // Creating a stub for Prebid.js 5.0 compliance
+ bidResponse.meta = Object.assign({}, bidResponse.meta, { advertiserDomains: [] });
+ }
+
bidResponses.push(bidResponse);
}
@@ -215,7 +224,7 @@ function interpretResponse(serverResponse, bidRequest) {
/**
* Send pixel when bidWon event is triggered
- * @param {Object} timeoutData
+ * @param {Object} bid
*/
function onBidWon(bid) {
log('Bid won', bid);
@@ -224,10 +233,16 @@ function onBidWon(bid) {
/**
* Send debug when we timeout
- * @param {Object} timeoutData
+ * @param {Array[{}]} timeoutData
*/
function onTimeout(timeoutData) {
log('Timeout from adapter', timeoutData);
+
+ const timeout = utils.deepAccess(timeoutData, '0.timeout');
+ if (timeout) {
+ // Set timeout to the one we got from the bid
+ setState({ timeout });
+ }
sendEvent('bidtimeout');
}
@@ -235,12 +250,15 @@ export const spec = {
code: BIDDER_CODE,
gvlid: BIDDER_GVLID,
aliases: [],
- sendEvent: sendEvent,
isBidRequestValid: isBidRequestValid,
buildRequests: buildRequests,
interpretResponse: interpretResponse,
onBidWon: onBidWon,
onTimeout: onTimeout,
+ // Exposed for test purpose
+ sendEvent: sendEvent,
+ setState: setState,
+ state: state,
};
registerBidder(spec);
diff --git a/modules/taphypeBidAdapter.js b/modules/taphypeBidAdapter.js
deleted file mode 100644
index 65c5a728127..00000000000
--- a/modules/taphypeBidAdapter.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-
-export const spec = {
- code: 'taphype',
- isBidRequestValid: function (bid) {
- return !!bid.params.placementId;
- },
- buildRequests: function (bidRequests) {
- const requests = bidRequests.map(function (bid) {
- const params = {
- placementId: bid.params.placementId,
- url: encodeURIComponent(window.location.href),
- size: bid.sizes[0][0] + 'x' + bid.sizes[0][1],
- rnd: Math.random(),
- bidId: bid.bidId,
- };
-
- return {method: 'GET', url: 'https://us-central1-taphype-internal.cloudfunctions.net/th-prebid', data: params, options: {withCredentials: false}}
- });
-
- return requests;
- },
- interpretResponse: function (serverResponse, bidRequest) {
- if (!serverResponse || !serverResponse.body || !serverResponse.body.ad) {
- return [];
- }
-
- const bid = serverResponse.body;
- const sizes = bid.size.split(',');
-
- return [{
- requestId: bidRequest.data.bidId,
- cpm: bid.price,
- width: sizes[0],
- height: sizes[1],
- creativeId: bidRequest.data.bidId,
- currency: bid.currency || 'USD',
- netRevenue: true,
- ad: bid.ad,
- ttl: 360
- }];
- },
-};
-
-registerBidder(spec);
diff --git a/modules/tappxBidAdapter.js b/modules/tappxBidAdapter.js
index 48e0abc5c7f..927d60277cd 100644
--- a/modules/tappxBidAdapter.js
+++ b/modules/tappxBidAdapter.js
@@ -8,10 +8,35 @@ import { config } from '../src/config.js';
const BIDDER_CODE = 'tappx';
const TTL = 360;
const CUR = 'USD';
-const TAPPX_BIDDER_VERSION = '0.1.10526';
+const TAPPX_BIDDER_VERSION = '0.1.10714';
const TYPE_CNN = 'prebidjs';
+const LOG_PREFIX = '[TAPPX]: ';
const VIDEO_SUPPORT = ['instream'];
+const DATA_TYPES = {
+ 'NUMBER': 'number',
+ 'STRING': 'string',
+ 'BOOLEAN': 'boolean',
+ 'ARRAY': 'array',
+ 'OBJECT': 'object'
+};
+const VIDEO_CUSTOM_PARAMS = {
+ 'minduration': DATA_TYPES.NUMBER,
+ 'maxduration': DATA_TYPES.NUMBER,
+ 'startdelay': DATA_TYPES.NUMBER,
+ 'playbackmethod': DATA_TYPES.ARRAY,
+ 'api': DATA_TYPES.ARRAY,
+ 'protocols': DATA_TYPES.ARRAY,
+ 'w': DATA_TYPES.NUMBER,
+ 'h': DATA_TYPES.NUMBER,
+ 'battr': DATA_TYPES.ARRAY,
+ 'linearity': DATA_TYPES.NUMBER,
+ 'placement': DATA_TYPES.NUMBER,
+ 'minbitrate': DATA_TYPES.NUMBER,
+ 'maxbitrate': DATA_TYPES.NUMBER,
+ 'skip': DATA_TYPES.NUMBER
+}
+
var hostDomain;
export const spec = {
@@ -53,7 +78,7 @@ export const spec = {
interpretResponse: function(serverResponse, originalRequest) {
const responseBody = serverResponse.body;
if (!serverResponse.body) {
- utils.logWarn('[TAPPX]: Empty response body HTTP 204, no bids');
+ utils.logWarn(LOG_PREFIX, 'Empty response body HTTP 204, no bids');
return [];
}
@@ -105,17 +130,17 @@ export const spec = {
function validBasic(bid) {
if (bid.params == null) {
- utils.logWarn(`[TAPPX]: Please review the mandatory Tappx parameters.`);
+ utils.logWarn(LOG_PREFIX, 'Please review the mandatory Tappx parameters.');
return false;
}
if (bid.params.tappxkey == null) {
- utils.logWarn(`[TAPPX]: Please review the mandatory Tappxkey parameter.`);
+ utils.logWarn(LOG_PREFIX, 'Please review the mandatory Tappxkey parameter.');
return false;
}
if (bid.params.host == null) {
- utils.logWarn(`[TAPPX]: Please review the mandatory Host parameter.`);
+ utils.logWarn(LOG_PREFIX, 'Please review the mandatory Host parameter.');
return false;
}
@@ -125,7 +150,7 @@ function validBasic(bid) {
}
if (classicEndpoint && bid.params.endpoint == null) {
- utils.logWarn(`[TAPPX]: Please review the mandatory endpoint Tappx parameters.`);
+ utils.logWarn(LOG_PREFIX, 'Please review the mandatory endpoint Tappx parameters.');
return false;
}
@@ -138,7 +163,11 @@ function validMediaType(bid) {
// Video validations
if (typeof video != 'undefined') {
if (VIDEO_SUPPORT.indexOf(video.context) === -1) {
- utils.logWarn(`[TAPPX]: Please review the mandatory Tappx parameters for Video. Only "instream" is suported.`);
+ utils.logWarn(LOG_PREFIX, 'Please review the mandatory Tappx parameters for Video. Only "instream" is suported.');
+ return false;
+ }
+ if (typeof video.mimes == 'undefined') {
+ utils.logWarn(LOG_PREFIX, 'Please review the mandatory Tappx parameters for Video. Mimes param is mandatory.');
return false;
}
}
@@ -191,16 +220,16 @@ function interpretBid(serverBid, request) {
* @return response ad
*/
function buildOneRequest(validBidRequests, bidderRequest) {
- let hostInfo = getHostInfo(validBidRequests);
+ let hostInfo = _getHostInfo(validBidRequests);
const ENDPOINT = hostInfo.endpoint;
hostDomain = hostInfo.domain;
const TAPPXKEY = utils.deepAccess(validBidRequests, 'params.tappxkey');
+ const MKTAG = utils.deepAccess(validBidRequests, 'params.mktag');
const BIDFLOOR = utils.deepAccess(validBidRequests, 'params.bidfloor');
const BIDEXTRA = utils.deepAccess(validBidRequests, 'params.ext');
const bannerMediaType = utils.deepAccess(validBidRequests, 'mediaTypes.banner');
const videoMediaType = utils.deepAccess(validBidRequests, 'mediaTypes.video');
- const { refererInfo } = bidderRequest;
// let requests = [];
let payload = {};
@@ -220,12 +249,12 @@ function buildOneRequest(validBidRequests, bidderRequest) {
payload.app = app;
api[0] = utils.deepAccess(validBidRequests, 'params.api') ? utils.deepAccess(validBidRequests, 'params.api') : [3, 5];
} else {
+ let bundle = _extractPageUrl(validBidRequests, bidderRequest);
let site = {};
- site.name = (bidderRequest && refererInfo) ? utils.parseUrl(refererInfo.referer).hostname : window.location.hostname;
- site.bundle = (bidderRequest && refererInfo) ? utils.parseUrl(refererInfo.referer).hostname : window.location.hostname;
- site.domain = (bidderRequest && refererInfo) ? utils.parseUrl(refererInfo.referer).hostname : window.location.hostname;
- publisher.name = (bidderRequest && refererInfo) ? utils.parseUrl(refererInfo.referer).hostname : window.location.hostname;
- publisher.domain = (bidderRequest && refererInfo) ? utils.parseUrl(refererInfo.referer).hostname : window.location.hostname;
+ site.name = bundle;
+ site.domain = bundle;
+ publisher.name = bundle;
+ publisher.domain = bundle;
tagid = `${site.name}_typeAdBanVid_${getOs()}`;
payload.site = site;
}
@@ -263,10 +292,23 @@ function buildOneRequest(validBidRequests, bidderRequest) {
if (videoMediaType) {
let video = {};
- w = videoMediaType.playerSize[0][0];
- h = videoMediaType.playerSize[0][1];
- video.w = w;
- video.h = h;
+
+ let videoParams = utils.deepAccess(validBidRequests, 'params.video');
+ if (typeof videoParams !== 'undefined') {
+ for (var key in VIDEO_CUSTOM_PARAMS) {
+ if (videoParams.hasOwnProperty(key)) {
+ video[key] = _checkParamDataType(key, videoParams[key], VIDEO_CUSTOM_PARAMS[key]);
+ }
+ }
+ }
+
+ if ((video.w === undefined || video.w == null || video.w <= 0) ||
+ (video.h === undefined || video.h == null || video.h <= 0)) {
+ w = videoMediaType.playerSize[0][0];
+ h = videoMediaType.playerSize[0][1];
+ video.w = w;
+ video.h = h;
+ }
video.mimes = videoMediaType.mimes;
@@ -288,16 +330,15 @@ function buildOneRequest(validBidRequests, bidderRequest) {
if (utils.isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'USD') {
imp.bidfloor = floor.floor;
} else {
- utils.logWarn('[TAPPX]: ', 'Currency not valid. Use only USD with Tappx.');
+ utils.logWarn(LOG_PREFIX, 'Currency not valid. Use only USD with Tappx.');
}
} catch (e) {
- utils.logWarn('[TAPPX]: ', e);
+ utils.logWarn(LOG_PREFIX, e);
imp.bidfloor = utils.deepAccess(validBidRequests, 'params.bidfloor'); // Be sure that we have an imp.bidfloor
}
}
let bidder = {};
- bidder.tappxkey = TAPPXKEY;
bidder.endpoint = ENDPOINT;
bidder.host = hostInfo.url;
bidder.bidfloor = BIDFLOOR;
@@ -326,18 +367,28 @@ function buildOneRequest(validBidRequests, bidderRequest) {
geo.country = utils.deepAccess(validBidRequests, 'params.geo.country');
// < Device object
- // > Params
- let params = {};
- params.host = 'tappx.com';
- params.bidfloor = BIDFLOOR;
- // < Params
-
// > GDPR
+ let user = {};
+ user.ext = {};
+
+ // Universal ID
+ let eidsArr = utils.deepAccess(validBidRequests, 'userIdAsEids');
+ if (typeof eidsArr !== 'undefined') {
+ eidsArr = eidsArr.filter(
+ uuid =>
+ (typeof uuid !== 'undefined' && uuid !== null) &&
+ (typeof uuid.source == 'string' && uuid.source !== null) &&
+ (typeof uuid.uids[0].id == 'string' && uuid.uids[0].id !== null)
+ )
+
+ if (typeof user !== 'undefined') { user.ext.eids = eidsArr }
+ };
+
let regs = {};
regs.gdpr = 0;
if (!(bidderRequest.gdprConsent == null)) {
if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') { regs.gdpr = bidderRequest.gdprConsent.gdprApplies; }
- if (regs.gdpr) { regs.consent = bidderRequest.gdprConsent.consentString; }
+ if (regs.gdpr) { user.ext.consent = bidderRequest.gdprConsent.consentString; }
}
// CCPA
@@ -350,16 +401,17 @@ function buildOneRequest(validBidRequests, bidderRequest) {
if (config.getConfig('coppa') === true) {
regs.coppa = config.getConfig('coppa') === true ? 1 : 0;
}
-
- // Universal ID
- const eidsArr = utils.deepAccess(validBidRequests, 'userIdAsEids');
- payload.user = {
- ext: {
- eids: eidsArr
- }
- };
// < GDPR
+ // > Payload Ext
+ let payloadExt = {};
+ payloadExt.bidder = {};
+ payloadExt.bidder.tappxkey = TAPPXKEY;
+ payloadExt.bidder.mktag = MKTAG;
+ payloadExt.bidder.bcid = utils.deepAccess(validBidRequests, 'params.bcid');
+ payloadExt.bidder.bcrid = utils.deepAccess(validBidRequests, 'params.bcrid');
+ // < Payload Ext
+
// > Payload
payload.id = validBidRequests.auctionId;
payload.test = utils.deepAccess(validBidRequests, 'params.test') ? 1 : 0;
@@ -367,15 +419,18 @@ function buildOneRequest(validBidRequests, bidderRequest) {
payload.tmax = bidderRequest.timeout ? bidderRequest.timeout : 600;
payload.bidder = BIDDER_CODE;
payload.imp = [imp];
+ payload.user = user;
+ payload.ext = payloadExt;
payload.device = device;
- payload.params = params;
payload.regs = regs;
// < Payload
+ let pbjsv = ($$PREBID_GLOBAL$$.version != null) ? encodeURIComponent($$PREBID_GLOBAL$$.version) : -1;
+
return {
method: 'POST',
- url: `${hostInfo.url}?type_cnn=${TYPE_CNN}&v=${TAPPX_BIDDER_VERSION}`,
+ url: `${hostInfo.url}?type_cnn=${TYPE_CNN}&v=${TAPPX_BIDDER_VERSION}&pbjsv=${pbjsv}`,
data: JSON.stringify(payload),
bids: validBidRequests
};
@@ -391,7 +446,7 @@ function getOs() {
if (ua == null) { return 'unknown'; } else if (ua.match(/(iPhone|iPod|iPad)/)) { return 'ios'; } else if (ua.match(/Android/)) { return 'android'; } else if (ua.match(/Window/)) { return 'windows'; } else { return 'unknown'; }
}
-function getHostInfo(validBidRequests) {
+export function _getHostInfo(validBidRequests) {
let domainInfo = {};
let endpoint = utils.deepAccess(validBidRequests, 'params.endpoint');
let hostParam = utils.deepAccess(validBidRequests, 'params.host');
@@ -414,4 +469,56 @@ function getHostInfo(validBidRequests) {
return domainInfo;
}
+export function _checkParamDataType(key, value, datatype) {
+ var errMsg = 'Ignoring param key: ' + key + ', expects ' + datatype + ', found ' + typeof value;
+ var functionToExecute;
+ switch (datatype) {
+ case DATA_TYPES.BOOLEAN:
+ functionToExecute = utils.isBoolean;
+ break;
+ case DATA_TYPES.NUMBER:
+ functionToExecute = utils.isNumber;
+ break;
+ case DATA_TYPES.STRING:
+ functionToExecute = utils.isStr;
+ break;
+ case DATA_TYPES.ARRAY:
+ functionToExecute = utils.isArray;
+ break;
+ }
+ if (functionToExecute(value)) {
+ return value;
+ }
+ utils.logWarn(LOG_PREFIX, errMsg);
+ return undefined;
+}
+
+export function _extractPageUrl(validBidRequests, bidderRequest) {
+ let domainUrl = utils.deepAccess(validBidRequests, 'params.domainUrl');
+
+ if (typeof domainUrl == 'undefined' || domainUrl == null) {
+ domainUrl = config.getConfig('pageUrl') || utils.deepAccess(bidderRequest, 'refererInfo.canonicalUrl');
+ }
+
+ if (typeof domainUrl == 'undefined' || domainUrl == null) {
+ try {
+ domainUrl = window.top.document.head.querySelector('link[rel="canonical"][href]').getAttribute('href');
+ } catch (error) {
+ domainUrl = undefined;
+ }
+ }
+
+ try {
+ domainUrl = domainUrl.match(/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n?]+)/img)[0].replace(/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?/img, '');
+ } catch (error) {
+ domainUrl = undefined;
+ }
+
+ if (typeof domainUrl == 'undefined' || domainUrl == null) {
+ domainUrl = window.location.hostname;
+ }
+
+ return domainUrl;
+}
+
registerBidder(spec);
diff --git a/modules/tappxBidAdapter.md b/modules/tappxBidAdapter.md
index 776b24bb07c..f98b996c52a 100644
--- a/modules/tappxBidAdapter.md
+++ b/modules/tappxBidAdapter.md
@@ -29,7 +29,12 @@ Ads sizes available: [300,250], [320,50], [320,480], [480,320], [728,90], [768,1
tappxkey: "pub-1234-android-1234",
endpoint: "ZZ1234PBJS",
bidfloor: 0.005,
- test: true // Optional for testing purposes
+ mktag: "123456", // Optional: tappx mktag
+ test: true, // Optional: for testing purposes
+ domainUrl: "www.example.com", // Optional: add domain site
+ ext: { // Optional: extra params
+ foo: "bar"
+ }
}
}
]
@@ -62,7 +67,26 @@ Ads sizes available: [300,250], [320,50], [320,480], [480,320], [728,90], [768,1
tappxkey: "pub-1234-desktop-1234",
endpoint: "VZ12TESTCTV",
bidfloor: 0.005,
- test: true
+ mktag: "123456", // Optional: tappx mktag
+ test: true, // Optional: for testing purposes
+ domainUrl: "www.example.com", // Optional: add domain site
+ video: { // Optional
+ skippable: true, // Optional
+ minduration: 5, // Optional
+ maxduration: 30, // Optional
+ startdelay: 5, // Optional
+ playbackmethod: [1,3], // Optional
+ api: [ 1, 2 ], // Optional
+ protocols: [ 2, 3 ], // Optional
+ battr: [ 13, 14 ], // Optional
+ linearity: 1, // Optional
+ placement: 2, // Optional
+ minbitrate: 10, // Optional
+ maxbitrate: 10 // Optional
+ },
+ ext: { // Optional: extra params
+ foo: "bar"
+ }
}
}]
}
diff --git a/modules/timBidAdapter.js b/modules/timBidAdapter.js
deleted file mode 100644
index 68c711f9935..00000000000
--- a/modules/timBidAdapter.js
+++ /dev/null
@@ -1,177 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import * as bidfactory from '../src/bidfactory.js';
-var CONSTANTS = require('../src/constants.json');
-const BIDDER_CODE = 'tim';
-
-function parseBidRequest(bidRequest) {
- let params = bidRequest.url.split('?')[1];
- var obj = {};
- var pairs = params.split('&');
- try {
- for (var i in pairs) {
- var split = pairs[i].split('=');
- obj[decodeURIComponent(split[0])] = decodeURIComponent(split[1]);
- }
- } catch (e) {
- utils.logError(e);
- }
-
- return JSON.parse(obj.br);
-}
-
-function formatAdMarkup(bid) {
- var adm = bid.adm;
- if ('nurl' in bid) {
- adm += createTrackPixelHtml(bid.nurl);
- }
- return ` ${adm}`;
-}
-
-function createTrackPixelHtml(url) {
- if (!url) {
- return '';
- }
- let img = '';
- img += '
';
- return img;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['timmedia'],
-
- isBidRequestValid: function(bid) {
- if (bid.params && bid.params.publisherid && bid.params.placementCode) {
- return true;
- } if (!bid.params) {
- utils.logError('bid not valid: params were not provided');
- } else if (!bid.params.publisherid) {
- utils.logError('bid not valid: publisherid was not provided');
- } else if (!bid.params.placementCode) {
- utils.logError('bid not valid: placementCode was not provided');
- } return false;
- },
-
- buildRequests: function(validBidRequests, bidderRequest) {
- var requests = [];
- for (var i = 0; i < validBidRequests.length; i++) {
- requests.push(this.createRTBRequestURL(validBidRequests[i]));
- }
- return requests;
- },
-
- createRTBRequestURL: function(bidReq) {
- // build bid request object
- var domain = window.location.host;
- var page = window.location.href;
- var publisherid = bidReq.params.publisherid;
- var bidFloor = bidReq.params.bidfloor;
- var placementCode = bidReq.params.placementCode;
-
- var adW = bidReq.mediaTypes.banner.sizes[0][0];
- var adH = bidReq.mediaTypes.banner.sizes[0][1];
-
- // build bid request with impressions
- var bidRequest = {
- id: utils.getUniqueIdentifierStr(),
- imp: [{
- id: bidReq.bidId,
- banner: {
- w: adW,
- h: adH
- },
- tagid: placementCode,
- bidfloor: bidFloor
- }],
- site: {
- domain: domain,
- page: page,
- publisher: {
- id: publisherid
- }
- },
- device: {
- 'language': this.getLanguage(),
- 'w': adW,
- 'h': adH,
- 'js': 1,
- 'ua': navigator.userAgent
- }
- };
- if (!bidFloor) {
- delete bidRequest.imp['bidfloor'];
- }
-
- bidRequest.bidId = bidReq.bidId;
- var url = 'https://hb.timmedia-hb.com/api/v2/services/prebid/' + publisherid + '/' + placementCode + '?' + 'br=' + encodeURIComponent(JSON.stringify(bidRequest));
- return {
- method: 'GET',
- url: url,
- data: '',
- options: {withCredentials: false}
- };
- },
-
- interpretResponse: function(serverResponse, bidRequest) {
- bidRequest = parseBidRequest(bidRequest);
- var bidResp = serverResponse.body;
- const bidResponses = [];
- if ((!bidResp || !bidResp.id) ||
- (!bidResp.seatbid || bidResp.seatbid.length === 0 || !bidResp.seatbid[0].bid || bidResp.seatbid[0].bid.length === 0)) {
- return [];
- }
- bidResp.seatbid[0].bid.forEach(function (bidderBid) {
- var responseCPM;
- var placementCode = '';
- if (bidRequest) {
- var bidResponse = bidfactory.createBid(1);
- placementCode = bidRequest.placementCode;
- bidRequest.status = CONSTANTS.STATUS.GOOD;
- responseCPM = parseFloat(bidderBid.price);
- if (responseCPM === 0) {
- var bid = bidfactory.createBid(2);
- bid.bidderCode = BIDDER_CODE;
- bidResponses.push(bid);
- return bidResponses;
- }
- bidResponse.placementCode = placementCode;
- bidResponse.size = bidRequest.sizes;
- bidResponse.creativeId = bidderBid.id;
- bidResponse.bidderCode = BIDDER_CODE;
- bidResponse.cpm = responseCPM;
- bidResponse.ad = formatAdMarkup(bidderBid);
- bidResponse.width = parseInt(bidderBid.w);
- bidResponse.height = parseInt(bidderBid.h);
- bidResponse.currency = bidResp.cur;
- bidResponse.netRevenue = true;
- bidResponse.requestId = bidRequest.bidId;
- bidResponse.ttl = 180;
- bidResponses.push(bidResponse);
- }
- });
- return bidResponses;
- },
- getLanguage: function() {
- const language = navigator.language ? 'language' : 'userLanguage';
- return navigator[language].split('-')[0];
- },
-
- getUserSyncs: function(syncOptions, serverResponses) {
- const syncs = []
- return syncs;
- },
-
- onTimeout: function(data) {
- // Bidder specifc code
- },
-
- onBidWon: function(bid) {
- // Bidder specific code
- },
-
- onSetTargeting: function(bid) {
- // Bidder specific code
- },
-}
-registerBidder(spec);
diff --git a/modules/topRTBBidAdapter.js b/modules/topRTBBidAdapter.js
deleted file mode 100644
index c93bd8ccaac..00000000000
--- a/modules/topRTBBidAdapter.js
+++ /dev/null
@@ -1,65 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import {BANNER, VIDEO} from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'topRTB';
-const ENDPOINT_URL = 'https://ssp.toprtb.com/ssp/rest/ReqAd?ref=www.google.com&hbid=0&adUnitId=';
-var adName = '';
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO],
- isBidRequestValid: function (bid) {
- if (utils.deepAccess(bid, 'mediaTypes.banner')) {
- adName = 'banner';
- return bid.params && !!bid.params.adUnitId;
- }
- if (utils.deepAccess(bid, 'mediaTypes.video')) {
- adName = 'video';
- return bid.params && !!bid.params.adUnitId;
- }
- },
-
- buildRequests: function (validBidRequests, bidderRequest) {
- let adunitid = [];
- utils._each(validBidRequests, function (bid) {
- adunitid.push(bid.params.adUnitId + '_' + bid.bidId);
- });
-
- return {
- method: 'GET',
- url: ENDPOINT_URL + adunitid.toString()
- };
- },
-
- interpretResponse: function(serverResponses, request) {
- const bidResponses = [];
- utils._each(serverResponses.body, function(response) {
- if (response.cpm > 0) {
- const bidResponse = {
- requestId: response.bidId,
- cpm: response.cpm,
- width: response.width,
- height: response.height,
- ad: response.mediadata,
- ttl: response.ttl,
- creativeId: response.id,
- netRevenue: true,
- currency: response.currency,
- tracking: response.tracking,
- impression: response.impression
- };
- if (adName == 'video') {
- bidResponse.vastXml = response.mediadata;
- bidResponse.mediaType = 'video';
- } else {
- bidResponse.ad = response.mediadata;
- bidResponse.mediaType = 'banner';
- }
- bidResponses.push(bidResponse);
- }
- });
- return bidResponses;
- }
-};
-
-registerBidder(spec);
diff --git a/modules/trendqubeBidAdapter.js b/modules/trendqubeBidAdapter.js
deleted file mode 100644
index d0364b4acec..00000000000
--- a/modules/trendqubeBidAdapter.js
+++ /dev/null
@@ -1,102 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'trendqube';
-const AD_URL = 'https://ads.trendqube.com/?c=o&m=multi';
-
-function isBidResponseValid(bid) {
- if (!bid.requestId || !bid.cpm || !bid.creativeId ||
- !bid.ttl || !bid.currency) {
- return false;
- }
- switch (bid.mediaType) {
- case BANNER:
- return Boolean(bid.width && bid.height && bid.ad);
- case VIDEO:
- return Boolean(bid.vastUrl);
- case NATIVE:
- return Boolean(bid.native && bid.native.title && bid.native.image && bid.native.impressionTrackers);
- default:
- return false;
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
- isBidRequestValid: (bid) => {
- return Boolean(bid.bidId && bid.params && !isNaN(parseInt(bid.params.placementId)));
- },
-
- buildRequests: (validBidRequests = [], bidderRequest) => {
- let winTop = window;
- let location;
- try {
- location = new URL(bidderRequest.refererInfo.referer)
- winTop = window.top;
- } catch (e) {
- location = winTop.location;
- utils.logMessage(e);
- };
- let placements = [];
- let request = {
- 'deviceWidth': winTop.screen.width,
- 'deviceHeight': winTop.screen.height,
- 'language': (navigator && navigator.language) ? navigator.language.split('-')[0] : '',
- 'secure': 1,
- 'host': location.host,
- 'page': location.pathname,
- 'placements': placements
- };
- if (bidderRequest) {
- if (bidderRequest.uspConsent) {
- request.ccpa = bidderRequest.uspConsent;
- }
- if (bidderRequest.gdprConsent) {
- request.gdpr = bidderRequest.gdprConsent
- }
- }
- const len = validBidRequests.length;
-
- for (let i = 0; i < len; i++) {
- let bid = validBidRequests[i];
- let sizes
- if (bid.mediaTypes) {
- if (bid.mediaTypes[BANNER] && bid.mediaTypes[BANNER].sizes) {
- sizes = bid.mediaTypes[BANNER].sizes
- } else if (bid.mediaTypes[VIDEO] && bid.mediaTypes[VIDEO].playerSize) {
- sizes = bid.mediaTypes[VIDEO].playerSize
- }
- }
- placements.push({
- placementId: bid.params.placementId,
- bidId: bid.bidId,
- sizes: sizes || [],
- wPlayer: sizes ? sizes[0] : 0,
- hPlayer: sizes ? sizes[1] : 0,
- traffic: bid.params.traffic || BANNER,
- schain: bid.schain || {}
- });
- }
- return {
- method: 'POST',
- url: AD_URL,
- data: request
- };
- },
-
- interpretResponse: (serverResponse) => {
- let response = [];
- for (let i = 0; i < serverResponse.body.length; i++) {
- let resItem = serverResponse.body[i];
- if (isBidResponseValid(resItem)) {
- response.push(resItem);
- }
- }
- return response;
- },
-};
-
-registerBidder(spec);
diff --git a/modules/tribeosBidAdapter.js b/modules/tribeosBidAdapter.js
deleted file mode 100644
index 80361aa3fdb..00000000000
--- a/modules/tribeosBidAdapter.js
+++ /dev/null
@@ -1,165 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import * as bidfactory from '../src/bidfactory.js';
-import {BANNER} from '../src/mediaTypes.js';
-var CONSTANTS = require('../src/constants.json');
-
-const BIDDER_CODE = 'tribeos';
-const ENDPOINT_URL = 'https://bidder.tribeos.tech/prebid/';
-const LOG_PREFIX = 'TRIBEOS: ';
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [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) {
- if (utils.isEmpty(bid.params.placementId)) {
- utils.logError(LOG_PREFIX, 'placementId is required, please contact tribeOS for placementId. Bid details: ', JSON.stringify(bid));
- return false;
- }
- return true;
- },
- /**
- * 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) {
- var requests = [];
- for (var i = 0; i < validBidRequests.length; i++) {
- requests.push(this.buidRTBRequest(validBidRequests[i]));
- }
- return requests;
- },
- buidRTBRequest: function(bidReq) {
- // build bid request object
-
- var placementId = bidReq.params.placementId;
- var bidFloor = bidReq.params.bidfloor;
- var placementCode = bidReq.params.placementCode;
-
- var adWidth = bidReq.mediaTypes.banner.sizes[0][0];
- var adHeight = bidReq.mediaTypes.banner.sizes[0][1];
-
- // build bid request with impressions
- var bidRequest = {
- id: utils.getUniqueIdentifierStr(),
- imp: [{
- id: bidReq.bidId,
- banner: {
- w: adWidth,
- h: adHeight
- },
- tagid: placementCode,
- bidfloor: bidFloor
- }],
- site: {
- domain: window.location.host,
- page: window.location.href,
- publisher: {
- id: placementId
- }
- },
- device: {
- 'language': (navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage),
- 'w': adWidth,
- 'h': adHeight,
- 'js': 1,
- 'ua': navigator.userAgent
- }
- };
-
- // apply gdpr
- if (bidReq.gdprConsent) {
- bidRequest.regs = {ext: {gdpr: bidReq.gdprConsent.gdprApplies ? 1 : 0}};
- bidRequest.user = {ext: {consent: bidReq.gdprConsent.consentString}};
- }
-
- bidRequest.bidId = bidReq.bidId;
- var url = ENDPOINT_URL + placementId + '/requests';
- if (!utils.isEmpty(bidReq.params.endpointUrl)) {
- url = bidReq.params.endpointUrl + placementId + '/requests';
- }
-
- return {
- method: 'POST',
- url: url,
- data: JSON.stringify(bidRequest),
- options: { withCredentials: true, contentType: 'application/json' },
- };
- },
- /**
- * 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, bidRequest) {
- const responseBody = serverResponse.body;
-
- utils.logInfo(LOG_PREFIX, 'response body: ', JSON.stringify(serverResponse));
-
- if ((!responseBody || !responseBody.id)) {
- return [];
- }
- const bidResponses = [];
- responseBody.seatbid[0].bid.forEach(function(bidderBid) {
- var responsePrice;
- var placementCode = '';
- if (bidRequest) {
- var bidResponse = bidfactory.createBid(1);
- placementCode = bidRequest.placementCode;
- bidRequest.status = CONSTANTS.STATUS.GOOD;
- responsePrice = parseFloat(bidderBid.price);
- if (responsePrice === 0) {
- var bid = bidfactory.createBid(2);
- bid.bidderCode = BIDDER_CODE;
- bidResponses.push(bid);
-
- utils.logInfo(LOG_PREFIX, 'response price is zero. Response data: ', JSON.stringify(bidRequest));
-
- return bidResponses;
- }
- bidResponse.placementCode = placementCode;
- bidResponse.size = bidRequest.sizes;
- bidResponse.creativeId = bidderBid.crid;
- bidResponse.bidderCode = BIDDER_CODE;
- bidResponse.cpm = responsePrice;
- bidResponse.ad = bidderBid.adm;
- bidResponse.width = parseInt(bidderBid.w);
- bidResponse.height = parseInt(bidderBid.h);
- bidResponse.currency = responseBody.cur;
- bidResponse.netRevenue = true;
- bidResponse.requestId = bidderBid.impid;
- bidResponse.ttl = 180;
-
- utils.logInfo(LOG_PREFIX, 'bid response data: ', JSON.stringify(bidResponse));
- utils.logInfo(LOG_PREFIX, 'bid request data: ', JSON.stringify(bidRequest));
-
- bidResponses.push(bidResponse);
- }
- });
- return bidResponses;
- },
- /**
- * Register bidder specific code, which will execute if a bid from this
- * bidder won the auction
- *
- * @param {Bid}
- * The bid that won the auction
- */
-// onBidWon: function(bid) {
-// ajax(this.nurls[bid.requestId], null);
-// }
-
-}
-registerBidder(spec);
diff --git a/modules/truereachBidAdapter.js b/modules/truereachBidAdapter.js
index 92f9cc9951e..fadc952b5fb 100755
--- a/modules/truereachBidAdapter.js
+++ b/modules/truereachBidAdapter.js
@@ -115,7 +115,7 @@ function buildCommonQueryParamsFromBids(validBidRequests, bidderRequest) {
adH = adSizes[0][1];
}
- let bidFloor = Number(utils.deepAccess(validBidRequests[0], 'params.bidfloor'));
+ let bidFloor = Number(0);
let domain = window.location.host;
let page = window.location.host + window.location.pathname + location.search + location.hash;
diff --git a/modules/trustxBidAdapter.js b/modules/trustxBidAdapter.js
index 247a1f6d048..66574e4fe57 100644
--- a/modules/trustxBidAdapter.js
+++ b/modules/trustxBidAdapter.js
@@ -285,6 +285,34 @@ function createBannerRequest(bid, mediaType) {
return result;
}
+function addSegments(name, segName, segments, data, bidConfigName) {
+ if (segments && segments.length) {
+ data.push({
+ name: name,
+ segment: segments.map((seg) => {
+ return {name: segName, value: seg};
+ })
+ });
+ } else if (bidConfigName) {
+ const configData = config.getConfig('ortb2.user.data');
+ let segData = null;
+ configData && configData.some(({name, segment}) => {
+ if (name === bidConfigName) {
+ segData = segment;
+ return true;
+ }
+ });
+ if (segData && segData.length) {
+ data.push({
+ name: name,
+ segment: segData.map((seg) => {
+ return {name: segName, value: seg};
+ })
+ });
+ }
+ }
+}
+
/**
* Gets bidfloor
* @param {Object} mediaTypes
@@ -318,6 +346,7 @@ function newFormatRequest(validBidRequests, bidderRequest) {
}
let pageKeywords = null;
let jwpseg = null;
+ let permutiveseg = null;
let content = null;
let schain = null;
let userId = null;
@@ -352,13 +381,19 @@ function newFormatRequest(validBidRequests, bidderRequest) {
pageKeywords = utils.transformBidderParamKeywords(keywords);
}
const bidFloor = _getFloor(mediaTypes || {}, bid);
- const jwTargeting = rtd && rtd.jwplayer && rtd.jwplayer.targeting;
- if (jwTargeting) {
- if (!jwpseg && jwTargeting.segments) {
- jwpseg = jwTargeting.segments;
+ if (rtd) {
+ const jwTargeting = rtd.jwplayer && rtd.jwplayer.targeting;
+ if (jwTargeting) {
+ if (!jwpseg && jwTargeting.segments) {
+ jwpseg = jwTargeting.segments;
+ }
+ if (!content && jwTargeting.content) {
+ content = jwTargeting.content;
+ }
}
- if (!content && jwTargeting.content) {
- content = jwTargeting.content;
+ const permutiveTargeting = rtd.p_standard && rtd.p_standard.targeting;
+ if (!permutiveseg && permutiveTargeting && permutiveTargeting.segments) {
+ permutiveseg = permutiveTargeting.segments;
}
}
let impObj = {
@@ -420,14 +455,13 @@ function newFormatRequest(validBidRequests, bidderRequest) {
request.site.content = content;
}
- if (jwpseg && jwpseg.length) {
+ const userData = [];
+ addSegments('iow_labs_pub_data', 'jwpseg', jwpseg, userData);
+ addSegments('permutive', 'p_standard', permutiveseg, userData, 'permutive.com');
+
+ if (userData.length) {
user = {
- data: [{
- name: 'iow_labs_pub_data',
- segment: jwpseg.map((seg) => {
- return {name: 'jwpseg', value: seg};
- })
- }]
+ data: userData
};
}
@@ -499,6 +533,8 @@ function oldFormatRequest(validBidRequests, bidderRequest) {
const sizeMap = {};
const bids = validBidRequests || [];
let priceType = 'net';
+ let jwpseg = null;
+ let permutiveseg = null;
let pageKeywords;
let reqId;
@@ -507,7 +543,7 @@ function oldFormatRequest(validBidRequests, bidderRequest) {
priceType = 'gross';
}
reqId = bid.bidderRequestId;
- const {params: {uid}, adUnitCode} = bid;
+ const {params: {uid}, adUnitCode, rtd} = bid;
auids.push(uid);
const sizesId = utils.parseSizesInput(bid.sizes);
@@ -520,6 +556,19 @@ function oldFormatRequest(validBidRequests, bidderRequest) {
pageKeywords = keywords;
}
+ if (rtd) {
+ const jwTargeting = rtd.jwplayer && rtd.jwplayer.targeting;
+ if (jwTargeting) {
+ if (!jwpseg && jwTargeting.segments) {
+ jwpseg = jwTargeting.segments;
+ }
+ }
+ const permutiveTargeting = rtd.p_standard && rtd.p_standard.targeting;
+ if (!permutiveseg && permutiveTargeting && permutiveTargeting.segments) {
+ permutiveseg = permutiveTargeting.segments;
+ }
+ }
+
if (!slotsMapByUid[uid]) {
slotsMapByUid[uid] = {};
}
@@ -546,6 +595,24 @@ function oldFormatRequest(validBidRequests, bidderRequest) {
});
});
+ const segmentsData = [];
+ addSegments('iow_labs_pub_data', 'jwpseg', jwpseg, segmentsData);
+ addSegments('permutive', 'p_standard', permutiveseg, segmentsData, 'permutive.com');
+
+ if (segmentsData.length) {
+ if (!pageKeywords) {
+ pageKeywords = [];
+ }
+ segmentsData.forEach(({segment}) => {
+ if (segment.length) {
+ pageKeywords.push({
+ key: segment[0].name,
+ value: segment.map(({value}) => value)
+ });
+ }
+ });
+ }
+
const payload = {
pt: priceType,
auids: auids.join(','),
diff --git a/modules/turktelekomBidAdapter.js b/modules/turktelekomBidAdapter.js
deleted file mode 100644
index 852e557290c..00000000000
--- a/modules/turktelekomBidAdapter.js
+++ /dev/null
@@ -1,261 +0,0 @@
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { Renderer } from '../src/Renderer.js';
-import { VIDEO, BANNER } from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'turktelekom';
-const ENDPOINT_URL = 'https://ssp.programattik.com/hb';
-const TIME_TO_LIVE = 360;
-const ADAPTER_SYNC_URL = 'https://ssp.programattik.com/sync';
-const RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';
-
-const LOG_ERROR_MESS = {
- noAuid: 'Bid from response has no auid parameter - ',
- noAdm: 'Bid from response has no adm parameter - ',
- noBid: 'Array of bid objects is empty',
- noPlacementCode: 'Can\'t find in requested bids the bid with auid - ',
- emptyUids: 'Uids should be not empty',
- emptySeatbid: 'Seatbid array from response has empty item',
- emptyResponse: 'Response is empty',
- hasEmptySeatbidArray: 'Response has empty seatbid array',
- hasNoArrayOfBids: 'Seatbid from response has no array of bid objects - '
-};
-export const spec = {
- code: BIDDER_CODE,
- 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: function(bid) {
- return !!bid.params.uid;
- },
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} validBidRequests - an array of bids
- * @param {bidderRequest} - bidder request object
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: function(validBidRequests, bidderRequest) {
- const auids = [];
- const bidsMap = {};
- const slotsMapByUid = {};
- const sizeMap = {};
- const bids = validBidRequests || [];
- let priceType = 'net';
- let reqId;
-
- bids.forEach(bid => {
- if (bid.params.priceType === 'gross') {
- priceType = 'gross';
- }
- reqId = bid.bidderRequestId;
- const {params: {uid}, adUnitCode} = bid;
- auids.push(uid);
- const sizesId = utils.parseSizesInput(bid.sizes);
-
- if (!slotsMapByUid[uid]) {
- slotsMapByUid[uid] = {};
- }
- const slotsMap = slotsMapByUid[uid];
- if (!slotsMap[adUnitCode]) {
- slotsMap[adUnitCode] = {adUnitCode, bids: [bid], parents: []};
- } else {
- slotsMap[adUnitCode].bids.push(bid);
- }
- const slot = slotsMap[adUnitCode];
-
- sizesId.forEach((sizeId) => {
- sizeMap[sizeId] = true;
- if (!bidsMap[uid]) {
- bidsMap[uid] = {};
- }
-
- if (!bidsMap[uid][sizeId]) {
- bidsMap[uid][sizeId] = [slot];
- } else {
- bidsMap[uid][sizeId].push(slot);
- }
- slot.parents.push({parent: bidsMap[uid], key: sizeId, uid});
- });
- });
-
- const payload = {
- pt: priceType,
- auids: auids.join(','),
- sizes: utils.getKeys(sizeMap).join(','),
- r: reqId,
- wrapperType: 'Prebid_js',
- wrapperVersion: '$prebid.version$'
- };
-
- if (bidderRequest) {
- if (bidderRequest.refererInfo && bidderRequest.refererInfo.referer) {
- payload.u = bidderRequest.refererInfo.referer;
- }
- if (bidderRequest.timeout) {
- payload.wtimeout = bidderRequest.timeout;
- }
- if (bidderRequest.gdprConsent) {
- if (bidderRequest.gdprConsent.consentString) {
- payload.gdpr_consent = bidderRequest.gdprConsent.consentString;
- }
- payload.gdpr_applies =
- (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean')
- ? Number(bidderRequest.gdprConsent.gdprApplies) : 1;
- }
- }
-
- return {
- method: 'GET',
- url: ENDPOINT_URL,
- data: utils.parseQueryStringParameters(payload).replace(/\&$/, ''),
- bidsMap: bidsMap,
- };
- },
- /**
- * Unpack the response from the server into a list of bids.
- *
- * @param {*} serverResponse A successful response from the server.
- * @param {*} bidRequest
- * @return {Bid[]} An array of bids which were nested inside the server.
- */
- interpretResponse: function(serverResponse, bidRequest, RendererConst = Renderer) {
- serverResponse = serverResponse && serverResponse.body;
- const bidResponses = [];
- const bidsMap = bidRequest.bidsMap;
- const priceType = bidRequest.data.pt;
-
- let errorMessage;
-
- if (!serverResponse) errorMessage = LOG_ERROR_MESS.emptyResponse;
- else if (serverResponse.seatbid && !serverResponse.seatbid.length) {
- errorMessage = LOG_ERROR_MESS.hasEmptySeatbidArray;
- }
-
- if (!errorMessage && serverResponse.seatbid) {
- serverResponse.seatbid.forEach(respItem => {
- _addBidResponse(_getBidFromResponse(respItem), bidsMap, priceType, bidResponses, RendererConst);
- });
- }
- if (errorMessage) utils.logError(errorMessage);
- return bidResponses;
- },
- getUserSyncs: function(syncOptions) {
- if (syncOptions.pixelEnabled) {
- return [{
- type: 'image',
- url: ADAPTER_SYNC_URL
- }];
- }
- }
-}
-
-function _getBidFromResponse(respItem) {
- if (!respItem) {
- utils.logError(LOG_ERROR_MESS.emptySeatbid);
- } else if (!respItem.bid) {
- utils.logError(LOG_ERROR_MESS.hasNoArrayOfBids + JSON.stringify(respItem));
- } else if (!respItem.bid[0]) {
- utils.logError(LOG_ERROR_MESS.noBid);
- }
- return respItem && respItem.bid && respItem.bid[0];
-}
-
-function _addBidResponse(serverBid, bidsMap, priceType, bidResponses, RendererConst) {
- if (!serverBid) return;
- let errorMessage;
- if (!serverBid.auid) errorMessage = LOG_ERROR_MESS.noAuid + JSON.stringify(serverBid);
- if (!serverBid.adm) errorMessage = LOG_ERROR_MESS.noAdm + JSON.stringify(serverBid);
- else {
- const awaitingBids = bidsMap[serverBid.auid];
- if (awaitingBids) {
- const sizeId = `${serverBid.w}x${serverBid.h}`;
- if (awaitingBids[sizeId]) {
- const slot = awaitingBids[sizeId][0];
-
- const bid = slot.bids.shift();
- const bidResponse = {
- requestId: bid.bidId, // bid.bidderRequestId,
- bidderCode: spec.code,
- cpm: serverBid.price,
- width: serverBid.w,
- height: serverBid.h,
- creativeId: serverBid.auid, // bid.bidId,
- currency: 'TRY',
- netRevenue: priceType !== 'gross',
- ttl: TIME_TO_LIVE,
- dealId: serverBid.dealid
- };
- if (serverBid.content_type === 'video') {
- bidResponse.vastXml = serverBid.adm;
- bidResponse.mediaType = VIDEO;
- bidResponse.adResponse = {
- content: bidResponse.vastXml
- };
- if (!bid.renderer && (!bid.mediaTypes || !bid.mediaTypes.video || bid.mediaTypes.video.context === 'outstream')) {
- bidResponse.renderer = createRenderer(bidResponse, {
- id: bid.bidId,
- url: RENDERER_URL
- }, RendererConst);
- }
- } else {
- bidResponse.ad = serverBid.adm;
- bidResponse.mediaType = BANNER;
- }
-
- bidResponses.push(bidResponse);
-
- if (!slot.bids.length) {
- slot.parents.forEach(({parent, key, uid}) => {
- const index = parent[key].indexOf(slot);
- if (index > -1) {
- parent[key].splice(index, 1);
- }
- if (!parent[key].length) {
- delete parent[key];
- if (!utils.getKeys(parent).length) {
- delete bidsMap[uid];
- }
- }
- });
- }
- }
- } else {
- errorMessage = LOG_ERROR_MESS.noPlacementCode + serverBid.auid;
- }
- }
- if (errorMessage) {
- utils.logError(errorMessage);
- }
-}
-
-function outstreamRender (bid) {
- bid.renderer.push(() => {
- window.ANOutstreamVideo.renderAd({
- targetId: bid.adUnitCode,
- adResponse: bid.adResponse
- });
- });
-}
-
-function createRenderer (bid, rendererParams, RendererConst) {
- const rendererInst = RendererConst.install({
- id: rendererParams.id,
- url: rendererParams.url,
- loaded: false
- });
-
- try {
- rendererInst.setRender(outstreamRender);
- } catch (err) {
- utils.logWarn('Prebid Error calling setRender on renderer', err);
- }
-
- return rendererInst;
-}
-
-registerBidder(spec);
diff --git a/modules/ucfunnelBidAdapter.js b/modules/ucfunnelBidAdapter.js
index 734aba97789..69cbbc697fc 100644
--- a/modules/ucfunnelBidAdapter.js
+++ b/modules/ucfunnelBidAdapter.js
@@ -8,6 +8,7 @@ const COOKIE_NAME = 'ucf_uid';
const VER = 'ADGENT_PREBID-2018011501';
const BIDDER_CODE = 'ucfunnel';
const GVLID = 607;
+const CURRENCY = 'USD';
const VIDEO_CONTEXT = {
INSTREAM: 0,
OUSTREAM: 2
@@ -210,12 +211,41 @@ function getSupplyChain(schain) {
return supplyChain;
}
+function getMediaType(mediaTypes) {
+ if (mediaTypes != null && mediaTypes.banner) {
+ return 'banner';
+ } else if (mediaTypes != null && mediaTypes.video) {
+ return 'video';
+ } else if (mediaTypes != null && mediaTypes.native) {
+ return 'native'
+ }
+ return 'banner';
+}
+
+function getFloor(bid, size, mediaTypes) {
+ if (bid.params.bidfloor) {
+ return bid.params.bidfloor;
+ }
+ if (typeof bid.getFloor === 'function') {
+ var bidFloor = bid.getFloor({
+ currency: CURRENCY,
+ mediaType: getMediaType(mediaTypes),
+ size: (size) ? [ size[0], size[1] ] : '*',
+ });
+ if (bidFloor.currency === CURRENCY) {
+ return bidFloor.floor;
+ }
+ }
+ return undefined;
+}
+
function getRequestData(bid, bidderRequest) {
const size = parseSizes(bid);
const language = navigator.language;
const dnt = (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0;
const userIdTdid = (bid.userId && bid.userId.tdid) ? bid.userId.tdid : '';
const supplyChain = getSupplyChain(bid.schain);
+ const bidFloor = getFloor(bid, size, bid.mediaTypes);
// general bid data
let bidData = {
ver: VER,
@@ -225,9 +255,13 @@ function getRequestData(bid, bidderRequest) {
dnt: dnt,
adid: bid.params.adid,
tdid: userIdTdid,
- schain: supplyChain,
- fp: bid.params.bidfloor
+ schain: supplyChain
};
+
+ if (bidFloor) {
+ bidData.fp = bidFloor;
+ }
+
addUserId(bidData, bid.userId);
try {
bidData.host = window.top.location.hostname;
@@ -303,14 +337,6 @@ function addUserId(bidData, userId) {
bidData['eids'] = '';
utils._each(userId, (userIdObjectOrValue, userIdProviderKey) => {
switch (userIdProviderKey) {
- case 'sharedid':
- if (userIdObjectOrValue.id) {
- bidData[userIdProviderKey + '_id'] = userIdObjectOrValue.id;
- }
- if (userIdObjectOrValue.third) {
- bidData[userIdProviderKey + '_third'] = userIdObjectOrValue.third;
- }
- break;
case 'haloId':
if (userIdObjectOrValue.haloId) {
bidData[userIdProviderKey + 'haloId'] = userIdObjectOrValue.haloId;
diff --git a/modules/underdogmediaBidAdapter.js b/modules/underdogmediaBidAdapter.js
index 8368077a627..6268774bc12 100644
--- a/modules/underdogmediaBidAdapter.js
+++ b/modules/underdogmediaBidAdapter.js
@@ -120,6 +120,9 @@ export const spec = {
currency: 'USD',
netRevenue: false,
ttl: mid.ttl || 60,
+ meta: {
+ advertiserDomains: mid.advertiser_domains || []
+ }
};
if (bidResponse.cpm <= 0) {
diff --git a/modules/unicornBidAdapter.js b/modules/unicornBidAdapter.js
deleted file mode 100644
index 2d4b5b53966..00000000000
--- a/modules/unicornBidAdapter.js
+++ /dev/null
@@ -1,160 +0,0 @@
-import * as utils from '../src/utils.js';
-import { BANNER } from '../src/mediaTypes.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { getStorageManager } from '../src/storageManager.js';
-
-const storage = getStorageManager();
-const BIDDER_CODE = 'unicorn';
-const UNICORN_ENDPOINT = 'https://ds.uncn.jp/pb/0/bid.json';
-const UNICORN_DEFAULT_CURRENCY = 'JPY';
-const UNICORN_PB_COOKIE_KEY = '__pb_unicorn_aud';
-const UNICORN_PB_VERSION = '1.0';
-
-/**
- * Placement ID and Account ID are required.
- * @param {BidRequest} bidRequest
- * @returns {boolean}
- */
-const isBidRequestValid = bidRequest => {
- return !!bidRequest.adUnitCode && !!bidRequest.params.accountId;
-};
-
-/**
- * @param {Array} validBidRequests
- * @param {any} bidderRequest
- * @returns {ServerRequest}
- */
-export const buildRequests = (validBidRequests, bidderRequest) => {
- return {
- method: 'POST',
- url: UNICORN_ENDPOINT,
- data: buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest)
- };
-};
-
-/**
- * Transform BidRequest to OpenRTB-formatted BidRequest Object
- * @param {Array} validBidRequests
- * @param {any} bidderRequest
- * @returns {string}
- */
-function buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest) {
- utils.logInfo(
- '[UNICORN] buildOpenRtbBidRequestPayload.validBidRequests:',
- validBidRequests
- );
- utils.logInfo(
- '[UNICORN] buildOpenRtbBidRequestPayload.bidderRequest:',
- bidderRequest
- );
- const imp = validBidRequests.map(br => {
- return {
- id: br.bidId,
- banner: {
- format: makeFormat(br.sizes),
- w: br.sizes[0][0],
- h: br.sizes[0][1],
- },
- tagid: utils.deepAccess(br, 'params.placementId') || br.adUnitCode,
- secure: 1,
- bidfloor: parseFloat(utils.deepAccess(br, 'params.bidfloorCpm') || 0)
- };
- });
- const request = {
- id: bidderRequest.auctionId,
- at: 1,
- imp,
- cur: UNICORN_DEFAULT_CURRENCY,
- site: {
- id: utils.deepAccess(validBidRequests[0], 'params.mediaId') || '',
- publisher: {
- id: utils.deepAccess(validBidRequests[0], 'params.publisherId') || 0
- },
- domain: window.location.hostname,
- page: window.location.href,
- ref: bidderRequest.refererInfo.referer
- },
- device: {
- language: navigator.language,
- ua: navigator.userAgent
- },
- user: {
- id: getUid()
- },
- bcat: utils.deepAccess(validBidRequests[0], 'params.bcat') || [],
- source: {
- ext: {
- stype: 'prebid_uncn',
- bidder: BIDDER_CODE,
- prebid_version: UNICORN_PB_VERSION
- }
- },
- ext: {
- accountId: utils.deepAccess(validBidRequests[0], 'params.accountId')
- }
- };
- utils.logInfo('[UNICORN] OpenRTB Formatted Request:', request);
- return JSON.stringify(request);
-}
-
-const interpretResponse = (serverResponse, request) => {
- utils.logInfo('[UNICORN] interpretResponse.serverResponse:', serverResponse);
- utils.logInfo('[UNICORN] interpretResponse.request:', request);
- const res = serverResponse.body;
- var bids = []
- if (res) {
- res.seatbid.forEach(sb => {
- sb.bid.forEach(b => {
- bids.push({
- requestId: b.impid,
- cpm: b.price || 0,
- width: b.w,
- height: b.h,
- ad: b.adm,
- ttl: 1000,
- creativeId: b.crid,
- netRevenue: false,
- currency: res.cur
- })
- })
- });
- }
- utils.logInfo('[UNICORN] interpretResponse bids:', bids);
- return bids;
-};
-
-/**
- * Get or Create Uid for First Party Cookie
- */
-const getUid = () => {
- const ck = storage.getCookie(UNICORN_PB_COOKIE_KEY);
- if (ck) {
- return JSON.parse(ck)['uid'];
- } else {
- const newCk = {
- uid: utils.generateUUID()
- };
- const expireIn = new Date(Date.now() + 24 * 60 * 60 * 10000).toUTCString();
- storage.setCookie(UNICORN_PB_COOKIE_KEY, JSON.stringify(newCk), expireIn);
- return newCk.uid;
- }
-};
-
-/**
- * Make imp.banner.format
- * @param {Array} arr
- */
-const makeFormat = arr => arr.map((s) => {
- return { w: s[0], h: s[1] };
-});
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['uncn'],
- supportedMediaTypes: [BANNER],
- isBidRequestValid,
- buildRequests,
- interpretResponse,
-};
-
-registerBidder(spec);
diff --git a/modules/unrulyBidAdapter.js b/modules/unrulyBidAdapter.js
index 36a156d5c66..d04192acf15 100644
--- a/modules/unrulyBidAdapter.js
+++ b/modules/unrulyBidAdapter.js
@@ -1,137 +1,225 @@
import * as utils from '../src/utils.js'
-import { Renderer } from '../src/Renderer.js'
-import { registerBidder } from '../src/adapters/bidderFactory.js'
-import { VIDEO } from '../src/mediaTypes.js'
+import {Renderer} from '../src/Renderer.js'
+import {registerBidder} from '../src/adapters/bidderFactory.js'
+import {VIDEO, BANNER} from '../src/mediaTypes.js'
-function configureUniversalTag (exchangeRenderer) {
- if (!exchangeRenderer.config) throw new Error('UnrulyBidAdapter: Missing renderer config.')
- if (!exchangeRenderer.config.siteId) throw new Error('UnrulyBidAdapter: Missing renderer siteId.')
+function configureUniversalTag(exchangeRenderer, requestId) {
+ 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.config.siteId;
+ parent.window.unruly['native'].adSlotId = requestId;
parent.window.unruly['native'].supplyMode = 'prebid';
}
-function configureRendererQueue () {
+function configureRendererQueue() {
parent.window.unruly['native'].prebid = parent.window.unruly['native'].prebid || {};
parent.window.unruly['native'].prebid.uq = parent.window.unruly['native'].prebid.uq || [];
}
-function notifyRenderer (bidResponseBid) {
+function notifyRenderer(bidResponseBid) {
parent.window.unruly['native'].prebid.uq.push(['render', bidResponseBid]);
}
-const serverResponseToBid = (bid, rendererInstance) => ({
- requestId: bid.bidId,
- cpm: bid.cpm,
- width: bid.width,
- height: bid.height,
- vastUrl: bid.vastUrl,
- netRevenue: true,
- creativeId: bid.bidId,
- ttl: 360,
- meta: { advertiserDomains: bid && bid.adomain ? bid.adomain : [] },
- currency: 'USD',
- renderer: rendererInstance,
- mediaType: VIDEO
-});
-
-const buildPrebidResponseAndInstallRenderer = bids =>
- bids
- .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();
-
- const rendererInstance = Renderer.install(Object.assign({}, exchangeRenderer, { callback: () => {} }));
- return { rendererInstance, serverBid };
- })
- .map(
- ({rendererInstance, serverBid}) => {
- const prebidBid = serverResponseToBid(serverBid, rendererInstance);
-
- const rendererConfig = Object.assign(
- {},
- prebidBid,
- {
- renderer: rendererInstance,
- adUnitCode: serverBid.ext.adUnitCode
- }
- );
-
- rendererInstance.setRender(() => { notifyRenderer(rendererConfig) });
-
- return prebidBid;
+const addBidFloorInfo = (validBid) => {
+ Object.keys(validBid.mediaTypes).forEach((key) => {
+ let floor;
+ if (typeof validBid.getFloor === 'function') {
+ floor = validBid.getFloor({
+ currency: 'USD',
+ mediaType: key,
+ size: '*'
+ }).floor || 0;
+ } else {
+ floor = validBid.params.floor || 0;
+ }
+
+ validBid.mediaTypes[key].floor = floor;
+ });
+};
+
+const RemoveDuplicateSizes = (validBid) => {
+ let bannerMediaType = utils.deepAccess(validBid, 'mediaTypes.banner');
+ if (bannerMediaType) {
+ let seenSizes = {};
+ let newSizesArray = [];
+ bannerMediaType.sizes.forEach((size) => {
+ if (!seenSizes[size.toString()]) {
+ seenSizes[size.toString()] = true;
+ newSizesArray.push(size);
}
- );
+ });
-export const adapter = {
- code: 'unruly',
- supportedMediaTypes: [ VIDEO ],
- isBidRequestValid: function(bid) {
- if (!bid) return false;
+ bannerMediaType.sizes = newSizesArray;
+ }
+};
- const context = utils.deepAccess(bid, 'mediaTypes.video.context');
+const getRequests = (conf, validBidRequests, bidderRequest) => {
+ const {bids, bidderRequestId, auctionId, bidderCode, ...bidderRequestData} = bidderRequest;
+ const invalidBidsCount = bidderRequest.bids.length - validBidRequests.length;
+ let requestBySiteId = {};
- return bid.mediaType === 'video' || context === 'outstream';
- },
+ validBidRequests.forEach((validBid) => {
+ const currSiteId = validBid.params.siteId;
+ addBidFloorInfo(validBid);
+ RemoveDuplicateSizes(validBid);
+ requestBySiteId[currSiteId] = requestBySiteId[currSiteId] || [];
+ requestBySiteId[currSiteId].push(validBid);
+ });
- buildRequests: function(validBidRequests, bidderRequest) {
- const url = 'https://targeting.unrulymedia.com/prebid';
- const method = 'POST';
- const data = {
- bidRequests: validBidRequests,
- bidderRequest
- };
- const options = { contentType: 'text/plain' };
+ let request = [];
- return {
- url,
- method,
- data,
- options
+ Object.keys(requestBySiteId).forEach((key) => {
+ let data = {
+ bidderRequest: Object.assign({}, {bids: requestBySiteId[key], invalidBidsCount, ...bidderRequestData})
};
+
+ request.push(Object.assign({}, {data, ...conf}));
+ });
+
+ return request;
+};
+
+const handleBidResponseByMediaType = (bids) => {
+ let bidResponses = [];
+
+ bids.forEach((bid) => {
+ let parsedBidResponse;
+ let bidMediaType = utils.deepAccess(bid, 'meta.mediaType');
+ if (bidMediaType && bidMediaType.toLowerCase() === 'banner') {
+ bid.mediaType = BANNER;
+ parsedBidResponse = handleBannerBid(bid);
+ } else if (bidMediaType && bidMediaType.toLowerCase() === 'video') {
+ let context = utils.deepAccess(bid, 'meta.videoContext');
+ bid.mediaType = VIDEO;
+ if (context === 'instream') {
+ parsedBidResponse = handleInStreamBid(bid);
+ } else if (context === 'outstream') {
+ parsedBidResponse = handleOutStreamBid(bid);
+ }
+ }
+
+ if (parsedBidResponse) {
+ bidResponses.push(parsedBidResponse);
+ }
+ });
+
+ return bidResponses;
+};
+
+const handleBannerBid = (bid) => {
+ if (!bid.ad) {
+ utils.logError(new Error('UnrulyBidAdapter: Missing ad config.'));
+ return;
+ }
+
+ return bid;
+};
+
+const handleInStreamBid = (bid) => {
+ if (!(bid.vastUrl || bid.vastXml)) {
+ utils.logError(new Error('UnrulyBidAdapter: Missing vastUrl or vastXml config.'));
+ return;
+ }
+
+ return bid;
+};
+
+const handleOutStreamBid = (bid) => {
+ const hasConfig = !!utils.deepAccess(bid, 'ext.renderer.config');
+ const hasSiteId = !!utils.deepAccess(bid, 'ext.renderer.config.siteId');
+
+ if (!hasConfig) {
+ utils.logError(new Error('UnrulyBidAdapter: Missing renderer config.'));
+ return;
+ }
+ if (!hasSiteId) {
+ utils.logError(new Error('UnrulyBidAdapter: Missing renderer siteId.'));
+ return;
+ }
+
+ const exchangeRenderer = utils.deepAccess(bid, 'ext.renderer');
+
+ configureUniversalTag(exchangeRenderer, bid.requestId);
+ configureRendererQueue();
+
+ const rendererInstance = Renderer.install(Object.assign({}, exchangeRenderer));
+
+ const rendererConfig = Object.assign(
+ {},
+ bid,
+ {
+ renderer: rendererInstance,
+ adUnitCode: utils.deepAccess(bid, 'ext.adUnitCode')
+ }
+ );
+
+ rendererInstance.setRender(() => {
+ notifyRenderer(rendererConfig)
+ });
+
+ bid.renderer = bid.renderer || rendererInstance;
+ return bid;
+};
+
+const isMediaTypesValid = (bid) => {
+ const mediaTypeVideoData = utils.deepAccess(bid, 'mediaTypes.video');
+ const mediaTypeBannerData = utils.deepAccess(bid, 'mediaTypes.banner');
+ let isValid = !!(mediaTypeVideoData || mediaTypeBannerData);
+ if (isValid && mediaTypeVideoData) {
+ isValid = isVideoMediaTypeValid(mediaTypeVideoData);
+ }
+ if (isValid && mediaTypeBannerData) {
+ isValid = isBannerMediaTypeValid(mediaTypeBannerData);
+ }
+ return isValid;
+};
+
+const isVideoMediaTypeValid = (mediaTypeVideoData) => {
+ if (!mediaTypeVideoData.context) {
+ return false;
+ }
+
+ const supportedContexts = ['outstream', 'instream'];
+ return supportedContexts.indexOf(mediaTypeVideoData.context) !== -1;
+};
+
+const isBannerMediaTypeValid = (mediaTypeBannerData) => {
+ return mediaTypeBannerData.sizes;
+};
+
+export const adapter = {
+ code: 'unruly',
+ supportedMediaTypes: [VIDEO, BANNER],
+ isBidRequestValid: function (bid) {
+ let siteId = utils.deepAccess(bid, 'params.siteId');
+ let isBidValid = siteId && isMediaTypesValid(bid);
+ return !!isBidValid;
+ },
+
+ buildRequests: function (validBidRequests, bidderRequest) {
+ let endPoint = 'https://targeting.unrulymedia.com/unruly_prebid';
+ if (validBidRequests[0]) {
+ endPoint = utils.deepAccess(validBidRequests[0], 'params.endpoint') || endPoint;
+ }
+
+ const url = endPoint;
+ const method = 'POST';
+ const options = {contentType: 'application/json'};
+ return getRequests({url, method, options}, validBidRequests, bidderRequest);
},
- interpretResponse: function(serverResponse = {}) {
+ interpretResponse: function (serverResponse = {}) {
const serverResponseBody = serverResponse.body;
+
const noBidsResponse = [];
const isInvalidResponse = !serverResponseBody || !serverResponseBody.bids;
return isInvalidResponse
? noBidsResponse
- : buildPrebidResponseAndInstallRenderer(serverResponseBody.bids);
- },
-
- getUserSyncs: function(syncOptions, response, gdprConsent) {
- let params = '';
- if (gdprConsent && 'gdprApplies' in gdprConsent) {
- if (gdprConsent.gdprApplies && typeof gdprConsent.consentString === 'string') {
- params += `?gdpr=1&gdpr_consent=${gdprConsent.consentString}`;
- } else {
- params += `?gdpr=0`;
- }
- }
-
- const syncs = []
- if (syncOptions.iframeEnabled) {
- syncs.push({
- type: 'iframe',
- url: 'https://video.unrulymedia.com/iframes/third-party-iframes.html' + params
- });
- }
- return syncs;
+ : handleBidResponseByMediaType(serverResponseBody.bids);
}
};
diff --git a/modules/unrulyBidAdapter.md b/modules/unrulyBidAdapter.md
index fc3c6c264be..5bfa09bb646 100644
--- a/modules/unrulyBidAdapter.md
+++ b/modules/unrulyBidAdapter.md
@@ -2,7 +2,7 @@
**Module Name**: Unruly Bid Adapter
**Module Type**: Bidder Adapter
-**Maintainer**: prodev@unrulymedia.com
+**Maintainer**: prebidsupport@unrulygroup.com
# Description
@@ -11,21 +11,78 @@ Module that connects to UnrulyX for bids.
# Test Parameters
```js
- const adUnits = [{
- code: 'ad-slot',
- sizes: [[728, 90], [300, 250]],
- mediaTypes: {
- video: {
- context: 'outstream'
- }
- },
- bids: [{
- bidder: 'unruly',
- params: {
- targetingUUID: '6f15e139-5f18-49a1-b52f-87e5e69ee65e',
- siteId: 1081534
- }
- }
- ]
- }];
+const adUnits =
+ [
+ {
+ "code": "outstream-ad",
+ "mediaTypes": {
+ "video": {
+ "context": "outstream",
+ "playerSize": [[640, 480]]
+ }
+ },
+ "bids": [
+ {
+ "bidder": "unruly",
+ "params": {
+ "siteId": 1081534
+ }
+ }
+ ]
+ },
+ {
+ "code": "unmissable-ad",
+ "mediaTypes": {
+ "video": {
+ "context": "outstream",
+ "playerSize": [[640, 480]]
+ }
+ },
+ "bids": [
+ {
+ "bidder": "unruly",
+ "params": {
+ "siteId": 1081534,
+ "featureOverrides": {
+ "canRunUnmissable": true
+ }
+ }
+ }
+ ]
+ },
+ {
+ "code": "banner-ad",
+ "mediaTypes": {
+ "banner": {
+ "sizes": [[300, 250]]
+ }
+ },
+ "bids": [
+ {
+ "bidder": "unruly",
+ "params": {
+ "siteId": 1081534
+ }
+ }
+ ]
+ },
+ {
+ "code": "instream-ad",
+ "mediaTypes": {
+ "video": {
+ "context": "instream",
+ "mimes": ["video/mp4"],
+ "playerSize": [[640, 480]]
+ }
+ },
+ "bids": [
+ {
+ "bidder": "unruly",
+ "params": {
+ "siteId": 1081534
+ }
+ }
+ ]
+ }
+ ];
```
diff --git a/modules/userId/eids.js b/modules/userId/eids.js
index 4012079ab6e..e11eb3edb68 100644
--- a/modules/userId/eids.js
+++ b/modules/userId/eids.js
@@ -134,20 +134,6 @@ const USER_IDS_CONFIG = {
atype: 1
},
- // sharedid
- 'sharedid': {
- source: 'sharedid.org',
- atype: 1,
- getValue: function(data) {
- return data.id;
- },
- getUidExt: function(data) {
- return (data && data.third) ? {
- third: data.third
- } : undefined;
- }
- },
-
// zeotapIdPlus
'IDP': {
source: 'zeotap.com',
@@ -217,10 +203,24 @@ const USER_IDS_CONFIG = {
source: 'deepintent.com',
atype: 3
},
+ // Akamai Data Activation Platform (DAP)
+ 'dapId': {
+ source: 'akamai.com',
+ atype: 1
+ },
// Admixer Id
'admixerId': {
source: 'admixer.net',
atype: 3
+ },
+ // Adtelligent Id
+ 'adtelligentId': {
+ source: 'adtelligent.com',
+ atype: 3
+ },
+ amxId: {
+ source: 'amxrtb.com',
+ atype: 1,
}
};
diff --git a/modules/userId/eids.md b/modules/userId/eids.md
index 32aa6b3c0d9..279a5a0cb49 100644
--- a/modules/userId/eids.md
+++ b/modules/userId/eids.md
@@ -108,17 +108,6 @@ userIdAsEids = [
}]
},
- {
- source: 'sharedid.org',
- uids: [{
- id: 'some-random-id-value',
- atype: 1,
- ext: {
- third: 'some-random-id-value'
- }
- }]
- },
-
{
source: 'zeotap.com',
uids: [{
@@ -193,6 +182,13 @@ userIdAsEids = [
atype: 3
}]
},
+ {
+ source: 'akamai.com',
+ uids: [{
+ id: 'some-random-id-value',
+ atype: 1
+ }]
+ },
{
source: 'deepintent.com',
uids: [{
diff --git a/modules/userId/index.js b/modules/userId/index.js
index 3f235d15dd1..a6a824fe89e 100644
--- a/modules/userId/index.js
+++ b/modules/userId/index.js
@@ -613,6 +613,11 @@ function refreshUserIds(options, callback) {
utils.logInfo(`${MODULE_NAME} - refreshing ${submodule.submodule.name}`);
populateSubmoduleId(submodule, consentData, storedConsentData, true);
+ updateInitializedSubmodules(submodule);
+
+ if (initializedSubmodules.length) {
+ setPrebidServerEidPermissions(initializedSubmodules);
+ }
if (utils.isFn(submodule.callback)) {
callbackSubmodules.push(submodule);
@@ -711,6 +716,21 @@ function initSubmodules(submodules, consentData) {
}, []);
}
+function updateInitializedSubmodules(submodule) {
+ let updated = false;
+ for (let i = 0; i < initializedSubmodules.length; i++) {
+ if (submodule.config.name.toLowerCase() === initializedSubmodules[i].config.name.toLowerCase()) {
+ updated = true;
+ initializedSubmodules[i] = submodule;
+ break;
+ }
+ }
+
+ if (!updated) {
+ initializedSubmodules.push(submodule);
+ }
+}
+
/**
* list of submodule configurations with valid 'storage' or 'value' obj definitions
* * storage config: contains values for storing/retrieving User ID data in browser storage
@@ -758,7 +778,8 @@ function updateSubmodules() {
// find submodule and the matching configuration, if found create and append a SubmoduleContainer
submodules = addedSubmodules.map(i => {
- const submoduleConfig = find(configs, j => j.name && j.name.toLowerCase() === i.name.toLowerCase());
+ const submoduleConfig = find(configs, j => j.name && (j.name.toLowerCase() === i.name.toLowerCase() ||
+ (i.aliasName && j.name.toLowerCase() === i.aliasName.toLowerCase())));
if (submoduleConfig && i.name !== submoduleConfig.name) submoduleConfig.name = i.name;
i.findRootDomain = findRootDomain;
return submoduleConfig ? {
diff --git a/modules/userId/userId.md b/modules/userId/userId.md
index 5cf4a6c2128..1c7f854f725 100644
--- a/modules/userId/userId.md
+++ b/modules/userId/userId.md
@@ -50,7 +50,17 @@ pbjs.setConfig({
// Replace partner with comma-separated (if more than one) Parrable Partner Client ID(s) for Parrable-aware bid adapters in use
partner: "30182847-e426-4ff9-b2b5-9ca1324ea09b"
}
- }, {
+ },{
+ name: 'akamaiDAPId',
+ params: {
+ apiHostname: '',
+ domain: 'your-domain.com',
+ type: 'email' | 'mobile' | ... | 'dap-signature:1.0.0',
+ identity: ‘your@email.com’ | ‘6175551234' | ...,
+ apiVersion: 'v1' | 'x1',
+ attributes: '{ "cohorts": [ "3:14400", "5:14400", "7:0" ],"first_name": "...","last_name": "..." }'
+ }
+ },{
name: 'identityLink',
params: {
pid: '999', // Set your real identityLink placement ID here
@@ -71,16 +81,6 @@ pbjs.setConfig({
name: '_li_pbid',
expires: 60
}
- }, {
- name: 'sharedId',
- params: {
- syncTime: 60 // in seconds, default is 24 hours
- },
- storage: {
- type: 'cookie',
- name: 'sharedid',
- expires: 28
- }
}, {
name: 'criteo',
storage: { // It is best not to specify this parameter since the module needs to be called as many times as possible
@@ -101,7 +101,8 @@ pbjs.setConfig({
vendor:'sdfg',
sv_cid:'dfg',
sv_pubid:'xcv',
- sv_domain:'zxv'
+ sv_domain:'zxv',
+ refreshInSeconds: 10 // Refreshes the id based on this configuration, else by default every 7 days
},
storage: {
type: "cookie",
@@ -128,6 +129,12 @@ pbjs.setConfig({
params: {
token: "Registered token or default sharedid.org token" // Default sharedid.org token: "A3dHTSoNUMjjERBLlrvJSelNnwWUCwVQhZ5tNQ+sll7y+LkPPVZXtB77u2y7CweRIxiYaGwGXNlW1/dFp8VMEgIAAAB+eyJvcmlnaW4iOiJodHRwczovL3NoYXJlZGlkLm9yZzo0NDMiLCJmZWF0dXJlIjoiSW50ZXJlc3RDb2hvcnRBUEkiLCJleHBpcnkiOjE2MjYyMjA3OTksImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9"
}
+ },{
+ name: 'quantcastId',
+ storage: {
+ type: 'cookie',
+ expires : 30
+ }
}],
syncDelay: 5000,
auctionDelay: 1000
@@ -218,7 +225,8 @@ pbjs.setConfig({
vendor:'sdfg',
sv_cid:'dfg',
sv_pubid:'xcv',
- sv_domain:'zxv'
+ sv_domain:'zxv',
+ refreshInSeconds: 10 // Refreshes the id based on this configuration, else by default every 7 days
},
storage: {
type: "html5",
diff --git a/modules/vdoaiBidAdapter.js b/modules/vdoaiBidAdapter.js
index 92d665887a5..4bf5a27c002 100644
--- a/modules/vdoaiBidAdapter.js
+++ b/modules/vdoaiBidAdapter.js
@@ -98,8 +98,14 @@ export const spec = {
} else {
bidResponse.ad = adCreative;
}
+ if (response.adDomain) {
+ bidResponse.meta = {
+ advertiserDomains: response.adDomain
+ }
+ }
bidResponses.push(bidResponse);
}
+
return bidResponses;
},
diff --git a/modules/viBidAdapter.js b/modules/viBidAdapter.js
deleted file mode 100644
index 4a09a2d2fc1..00000000000
--- a/modules/viBidAdapter.js
+++ /dev/null
@@ -1,393 +0,0 @@
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import * as mediaTypes from '../src/mediaTypes.js';
-
-export function get(path, obj, notFound) {
- path = typeof path === 'string' ? path.split('.') : path;
-
- while (path.length) {
- const [key] = path;
- if (!(obj instanceof Object) || !(key in obj)) return notFound;
- obj = obj[key];
- path = path.slice(1);
- }
-
- return obj;
-}
-
-export function merge(a, b, fn = a => a) {
- const res = {};
-
- for (const key in a) {
- if (key in b) {
- res[key] = fn(a[key], b[key]);
- } else {
- res[key] = a[key];
- }
- }
-
- for (const key in b) {
- if (!(key in a)) res[key] = b[key];
- }
-
- return res;
-}
-
-export function ratioToPercentageCeil(x) {
- return Math.ceil(x * 100);
-}
-
-export function getDocumentHeight(curDocument = document) {
- return Math.max(
- get('body.clientHeight', curDocument, 0),
- get('body.scrollHeight', curDocument, 0),
- get('body.offsetHeight', curDocument, 0),
- get('documentElement.clientHeight', curDocument, 0),
- get('documentElement.scrollHeight', curDocument, 0),
- get('documentElement.offsetHeight', curDocument, 0)
- );
-}
-
-export function getOffset(element) {
- const rect = element.getBoundingClientRect();
- const elementWindow = getElementWindow(element);
- if (!elementWindow) throw new Error('cannot get element window');
- const scrollLeft =
- elementWindow.pageXOffset || get('documentElement.scrollLeft', document, 0);
- const scrollTop =
- elementWindow.pageYOffset || get('documentElement.scrollTop', document, 0);
- return {
- top: rect.top + scrollTop,
- right: rect.right + scrollLeft,
- bottom: rect.bottom + scrollTop,
- left: rect.left + scrollLeft
- };
-}
-
-var IframeType;
-
-(function(IframeType) {
- IframeType['safeframe'] = 'safeframe';
- IframeType['friendly'] = 'friendly';
- IframeType['nonfriendly'] = 'nonfriendly';
-})(IframeType || (IframeType = {}));
-
-export function getWindowParents(curWindow = window) {
- const parents = [];
-
- while (curWindow && curWindow.parent && curWindow !== curWindow.parent) {
- parents.push(curWindow.parent);
- curWindow = curWindow.parent;
- }
-
- return parents;
-}
-
-export function getTopmostReachableWindow(curWindow = window) {
- const parents = getWindowParents(curWindow);
- return parents.length ? parents[parents.length - 1] : curWindow;
-}
-
-export function topDocumentIsReachable(curWindow = window) {
- if (!isInsideIframe(curWindow)) return true;
- const windowParents = getWindowParents(curWindow);
-
- try {
- const topWindow = windowParents[windowParents.length - 1];
-
- return topWindow === curWindow.top && !!curWindow.top.document;
- } catch (e) {
- return false;
- }
-}
-
-export function isInsideIframe(curWindow = window) {
- return curWindow !== curWindow.top;
-}
-
-export function isInsideSafeframe(curWindow = window) {
- return !topDocumentIsReachable(curWindow) && !!curWindow.$sf;
-}
-
-export function isInsideFriendlyIframe(curWindow = window) {
- return isInsideIframe(curWindow) && topDocumentIsReachable(curWindow);
-}
-
-export function getIframeType(curWindow = window) {
- if (!isInsideIframe(curWindow)) return;
- if (isInsideSafeframe(curWindow)) return IframeType.safeframe;
- if (isInsideFriendlyIframe(curWindow)) return IframeType.friendly;
- return IframeType.nonfriendly;
-}
-
-function getElementWindow(element) {
- return element.ownerDocument
- ? element.ownerDocument.defaultView
- : element.defaultView;
-}
-
-const NO_CUTS = {
- top: 0,
- right: 0,
- bottom: 0,
- left: 0
-};
-
-export function getRectCuts(rect, vh, vw, vCuts = NO_CUTS) {
- let { top, left } = rect;
- const { bottom, right } = rect;
- top = top + vCuts.top;
- left = left + vCuts.left;
- vh = vh + vCuts.bottom;
- vw = vw + vCuts.right;
- return {
- bottom: Math.min(0, vh - bottom),
- left: Math.min(0, left),
- right: Math.min(0, vw - right),
- top: Math.min(0, top)
- };
-}
-
-export function getFrameElements(curWindow = window) {
- const frameElements = [];
-
- while (curWindow && curWindow.frameElement) {
- frameElements.unshift(curWindow.frameElement);
- curWindow =
- curWindow.frameElement.ownerDocument &&
- curWindow.frameElement.ownerDocument.defaultView;
- }
-
- return frameElements;
-}
-
-export function getElementCuts(element, vCuts) {
- const window = getElementWindow(element);
- return getRectCuts(
- element.getBoundingClientRect(),
- window ? window.innerHeight : 0,
- window ? window.innerWidth : 0,
- vCuts
- );
-}
-
-export function area(width, height, areaCuts = NO_CUTS) {
- const { top, right, bottom, left } = areaCuts;
- return Math.max(0, (width + left + right) * (height + top + bottom));
-}
-
-export function getInViewRatio(element) {
- const elements = [...getFrameElements(getElementWindow(element)), element];
- const vCuts = elements.reduce(
- (vCuts, element) => getElementCuts(element, vCuts),
- NO_CUTS
- );
- return (
- area(element.offsetWidth || 1, element.offsetHeight || 1, vCuts) /
- area(element.offsetWidth || 1, element.offsetHeight || 1)
- );
-}
-
-export function getInViewRatioInsideTopFrame(element) {
- const elements = [...getFrameElements().slice(1), element];
- const vCuts = elements.reduce(
- (vCuts, element) => getElementCuts(element, vCuts),
- NO_CUTS
- );
- return (
- area(element.offsetWidth, element.offsetHeight, vCuts) /
- area(element.offsetWidth, element.offsetHeight)
- );
-}
-
-export function getMayBecomeVisible(element) {
- return !isInsideIframe() || !!getInViewRatioInsideTopFrame(element);
-}
-
-export function getInViewPercentage(element) {
- return ratioToPercentageCeil(getInViewRatio(element));
-}
-
-export function getOffsetTopDocument(element) {
- return [...getFrameElements(getElementWindow(element)), element].reduce(
- (acc, elem) => merge(acc, getOffset(elem), (a, b) => a + b),
- {
- top: 0,
- right: 0,
- bottom: 0,
- left: 0
- }
- );
-}
-
-export function getOffsetTopDocumentPercentage(element) {
- const elementWindow = getElementWindow(element);
- if (!elementWindow) throw new Error('cannot get element window');
- if (!topDocumentIsReachable(elementWindow)) {
- throw new Error("top window isn't reachable");
- }
- const topWindow = getTopmostReachableWindow(elementWindow);
- const documentHeight = getDocumentHeight(topWindow.document);
- return ratioToPercentageCeil(
- getOffsetTopDocument(element).top / documentHeight
- );
-}
-
-export function getOffsetToView(element) {
- const elemWindow = getElementWindow(element);
- if (!elemWindow) throw new Error('cannot get element window');
- const topWindow = getTopmostReachableWindow(elemWindow);
- const { top, bottom } = getOffsetTopDocument(element);
- const topWindowHeight = topWindow.innerHeight;
-
- if (bottom < topWindow.scrollY) return bottom - topWindow.scrollY;
-
- if (top > topWindow.scrollY + topWindowHeight) {
- return top - topWindow.scrollY - topWindowHeight;
- }
-
- return 0;
-}
-
-export function getOffsetToViewPercentage(element) {
- return ratioToPercentageCeil(
- getOffsetToView(element) /
- getDocumentHeight(
- getTopmostReachableWindow(getElementWindow(element)).document
- )
- );
-}
-
-export function getViewabilityDescription(element) {
- let iframeType;
- try {
- if (!element) {
- return {
- error: 'no element'
- };
- }
- iframeType = getIframeType(getElementWindow(element));
- if (!iframeType || iframeType === IframeType.friendly) {
- const inViewPercentage = getInViewPercentage(element);
- return {
- inView: inViewPercentage,
- hidden: !inViewPercentage && !getMayBecomeVisible(element),
- offsetTop: getOffsetTopDocumentPercentage(element),
- offsetView: getOffsetToViewPercentage(element),
- iframeType
- };
- }
- return {
- iframeType
- };
- } catch (error) {
- return {
- iframeType,
- error: error.message
- };
- }
-}
-
-export function mergeArrays(hashFn, ...args) {
- const seen = {};
- const merged = [];
- args.forEach(sizes => {
- sizes.forEach(size => {
- const key = hashFn(size);
- if (!(key in seen)) {
- seen[key] = true;
- merged.push(size);
- }
- });
- });
- return merged;
-}
-
-export function documentFocus(doc) {
- return typeof doc.hasFocus === 'function' ? +doc.hasFocus() : undefined;
-}
-
-const spec = {
- code: 'vi',
- supportedMediaTypes: [mediaTypes.VIDEO, mediaTypes.BANNER],
-
- isBidRequestValid({ adUnitCode, params: { pubId, lang, cat } = {} }) {
- return [pubId, lang, cat].every(x => typeof x === 'string');
- },
-
- /**
- *
- * @param bidRequests
- * @param bidderRequest
- * @return {
- * {method: string,
- * data: {
- imps: {
- bidId: string,
- adUnitCode: string,
- sizes: [[number, number]],
- pubId: string,
- lang: string,
- cat: string,
- iframeType: string | undefined,
- error: string | null,
- inView: number,
- offsetTop: number,
- offsetView: number,
- hidden: boolean,
- bidFloor: number
- }[],
- refererInfo: {
- referer: string
- reachedTop: boolean,
- numIframes: number,
- stack: string[]
- canonicalUrl: string
- }
- },
- * options: {withCredentials: boolean, contentType: string}, url: string}}
- */
- buildRequests(bidRequests, bidderRequest) {
- return {
- method: 'POST',
- url: 'https://pb.vi-serve.com/prebid/bid',
- data: {
- refererInfo: bidderRequest.refererInfo,
- imps: bidRequests.map(
- ({ bidId, adUnitCode, sizes, params, mediaTypes }) => {
- const slot = document.getElementById(adUnitCode);
- const bannerSizes = get('banner.sizes', mediaTypes);
- const playerSize = get('video.playerSize', mediaTypes);
-
- const sizesToMerge = [];
- if (!params.useSizes) {
- if (sizes) sizesToMerge.push(sizes);
- if (bannerSizes) sizesToMerge.push(bannerSizes);
- if (playerSize) sizesToMerge.push(playerSize);
- } else if (params.useSizes === 'banner' && bannerSizes) {
- sizesToMerge.push(bannerSizes);
- } else if (params.useSizes === 'video' && playerSize) {
- sizesToMerge.push(playerSize);
- }
- return {
- bidId,
- adUnitCode,
- sizes: mergeArrays(x => x.join(','), ...sizesToMerge),
- ...getViewabilityDescription(slot),
- ...params
- };
- }
- ),
- focus: documentFocus(document)
- },
- options: {
- contentType: 'application/json',
- withCredentials: true
- }
- };
- },
-
- interpretResponse({ body }) {
- return body;
- }
-};
-registerBidder(spec);
diff --git a/modules/vidazooBidAdapter.js b/modules/vidazooBidAdapter.js
index 7fc6e3a5395..3fb94870d3f 100644
--- a/modules/vidazooBidAdapter.js
+++ b/modules/vidazooBidAdapter.js
@@ -149,7 +149,7 @@ function interpretResponse(serverResponse, request) {
try {
results.forEach(result => {
- const { creativeId, ad, price, exp, width, height, currency } = result;
+ const { creativeId, ad, price, exp, width, height, currency, advertiserDomains } = result;
if (!ad || !price) {
return;
}
@@ -162,7 +162,10 @@ function interpretResponse(serverResponse, request) {
currency: currency || CURRENCY,
netRevenue: true,
ttl: exp || TTL_SECONDS,
- ad: ad
+ ad: ad,
+ meta: {
+ advertiserDomains: advertiserDomains || []
+ }
})
});
return output;
@@ -266,8 +269,8 @@ export function tryParseJSON(value) {
export const spec = {
code: BIDDER_CODE,
- gvlid: GVLID,
version: BIDDER_VERSION,
+ gvlid: GVLID,
supportedMediaTypes: [BANNER],
isBidRequestValid,
buildRequests,
diff --git a/modules/vidazooBidAdapter.md b/modules/vidazooBidAdapter.md
index df7700cb05a..c8fd5956d2a 100644
--- a/modules/vidazooBidAdapter.md
+++ b/modules/vidazooBidAdapter.md
@@ -20,7 +20,7 @@ var adUnits = [
{
bidder: 'vidazoo',
params: {
- cId: '5a1c419d95fce900044c334e',
+ cId: '562524b21b1c1f08117fc7f9',
pId: '59ac17c192832d0011283fe3',
bidFloor: 0.0001,
ext: {
diff --git a/modules/videoNowBidAdapter.js b/modules/videoNowBidAdapter.js
deleted file mode 100644
index b391af08d49..00000000000
--- a/modules/videoNowBidAdapter.js
+++ /dev/null
@@ -1,187 +0,0 @@
-import * as utils from '../src/utils.js'
-import { registerBidder } from '../src/adapters/bidderFactory.js'
-import { BANNER } from '../src/mediaTypes.js'
-import { loadExternalScript } from '../src/adloader.js'
-
-const RTB_URL = 'https://bidder.videonow.ru/prebid'
-
-const BIDDER_CODE = 'videonow'
-const TTL_SECONDS = 60 * 5
-
-function isBidRequestValid(bid) {
- return !!(bid && bid.params && bid.params.pId)
-}
-
-function buildRequest(bid, bidderRequest) {
- const { refererInfo } = bidderRequest
- const { ext, bidId, params, code, sizes } = bid
- const { pId, bidFloor, cur, placementId, url: rtbUrl } = params || {}
-
- let url = rtbUrl || RTB_URL
- url = `${url}${~url.indexOf('?') ? '&' : '?'}profile_id=${pId}`
-
- const dto = {
- method: 'POST',
- url,
- data: {
- id: bidId,
- cpm: bidFloor,
- code,
- sizes,
- cur: cur || 'RUB',
- placementId,
- ref: refererInfo && refererInfo.referer,
- },
- }
-
- ext && Object.keys(ext).forEach(key => {
- dto.data[`ext_${key}`] = ext[key]
- })
-
- return dto
-}
-
-function buildRequests(validBidRequests, bidderRequest) {
- utils.logInfo(`${BIDDER_CODE}. buildRequests`)
- const requests = []
- validBidRequests.forEach(validBidRequest => {
- const request = buildRequest(validBidRequest, bidderRequest)
- request && requests.push(request)
- })
- return requests
-}
-
-function interpretResponse(serverResponse, bidRequest) {
- if (!serverResponse || !serverResponse.body) {
- return []
- }
- const { id: bidId } = (bidRequest && bidRequest.data) || {}
- if (!bidId) return []
-
- const { seatbid, cur, ext } = serverResponse.body
- if (!seatbid || !seatbid.length) return []
-
- const { placementId } = ext || {}
- if (!placementId) return []
-
- const bids = []
- seatbid.forEach(sb => {
- const { bid } = sb
- bid && bid.length && bid.forEach(b => {
- const res = createResponseBid(b, bidId, cur, placementId)
- res && bids.push(res)
- })
- })
-
- return bids
-}
-
-function createResponseBid(bidInfo, bidId, cur, placementId) {
- const { id, nurl, code, price, crid, ext, ttl, netRevenue, w, h, adm } = bidInfo
-
- if (!id || !price || !adm) {
- return null
- }
-
- const { init: initPath, module, format } = ext || {}
- if (!initPath) {
- utils.logError(`vnInitModulePath is not defined`)
- return null
- }
-
- const { log, min } = module || {}
-
- if (!min && !log) {
- utils.logError('module\'s paths are not defined')
- return null
- }
-
- return {
- requestId: bidId,
- cpm: price,
- width: w,
- height: h,
- creativeId: crid,
- currency: cur || 'RUB',
- netRevenue: netRevenue !== undefined ? netRevenue : true,
- ttl: ttl || TTL_SECONDS,
- ad: code,
- nurl,
- renderer: {
- url: min || log,
- render: function() {
- const d = window.document
- const el = placementId && d.getElementById(placementId)
- if (el) {
- const pId = 1
- // prepare data for vn_init script
- const profileData = {
- module,
- dataXml: adm,
- }
-
- format && (profileData.format = format)
-
- // add init data for vn_init on the page
- const videonow = window.videonow = window.videonow || {}
- const init = videonow.init = window.videonow.init || {}
- init[pId] = profileData
-
- // add vn_init js on the page
- loadExternalScript(`${initPath}${~initPath.indexOf('?') ? '&' : '?'}profileId=${pId}`, 'outstream')
- } else {
- utils.logError(`bidAdapter ${BIDDER_CODE}: ${placementId} not found`)
- }
- }
- }
- }
-}
-
-function getUserSyncs(syncOptions, serverResponses) {
- const syncs = []
-
- if (!serverResponses || !serverResponses.length) return syncs
-
- serverResponses.forEach(response => {
- const { ext } = (response && response.body) || {}
- const { pixels, iframes } = ext || {}
-
- if (syncOptions.iframeEnabled && iframes && iframes.length) {
- iframes.forEach(i => syncs.push({
- type: 'iframe',
- url: i,
- }),
- )
- }
-
- if (syncOptions.pixelEnabled && pixels && pixels.length) {
- pixels.forEach(p => syncs.push({
- type: 'image',
- url: p,
- }),
- )
- }
- })
-
- utils.logInfo(`${BIDDER_CODE} getUserSyncs() syncs=${syncs.length}`)
- return syncs
-}
-
-function onBidWon(bid) {
- const { nurl } = bid || {}
- if (nurl) {
- utils.triggerPixel(utils.replaceAuctionPrice(nurl, bid.cpm));
- }
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [BANNER],
- isBidRequestValid,
- buildRequests,
- interpretResponse,
- getUserSyncs,
- onBidWon
-}
-
-registerBidder(spec)
diff --git a/modules/videobyteBidAdapter.js b/modules/videobyteBidAdapter.js
new file mode 100644
index 00000000000..076329d1c8b
--- /dev/null
+++ b/modules/videobyteBidAdapter.js
@@ -0,0 +1,311 @@
+import {registerBidder} from '../src/adapters/bidderFactory.js';
+import * as utils from '../src/utils.js';
+import {VIDEO} from '../src/mediaTypes.js';
+
+const BIDDER_CODE = 'videobyte';
+const DEFAULT_BID_TTL = 300;
+const DEFAULT_CURRENCY = 'USD';
+const DEFAULT_NET_REVENUE = true;
+const VIDEO_ORTB_PARAMS = [
+ 'mimes',
+ 'minduration',
+ 'maxduration',
+ 'placement',
+ 'protocols',
+ 'startdelay',
+ 'skip',
+ 'skipafter',
+ 'minbitrate',
+ 'maxbitrate',
+ 'delivery',
+ 'playbackmethod',
+ 'api',
+ 'linearity'
+];
+
+export const spec = {
+ code: BIDDER_CODE,
+ supportedMediaTypes: [VIDEO],
+ VERSION: '1.0.0',
+ ENDPOINT: 'https://x.videobyte.com/ortb/',
+
+ /**
+ * Determines whether or not the given bid request is valid.
+ *
+ * @param {BidRequest} bidRequest The bid params to validate.
+ * @return boolean True if this is a valid bid, and false otherwise.
+ */
+ isBidRequestValid: function (bidRequest) {
+ return validateVideo(bidRequest);
+ },
+
+ /**
+ * Make a server request from the list of BidRequests.
+ *
+ * @param bidRequests - an array of bid requests
+ * @param bidderRequest
+ * @return ServerRequest Info describing the request to the server.
+ */
+ buildRequests: function (bidRequests, bidderRequest) {
+ if (!bidRequests) {
+ return;
+ }
+ return bidRequests.map(bidRequest => {
+ const {params} = bidRequest;
+ let pubId = params.pubId;
+ if (bidRequest.params.video && bidRequest.params.video.e2etest) {
+ utils.logMessage('E2E test mode enabled');
+ pubId = 'e2etest'
+ }
+ return {
+ method: 'POST',
+ url: spec.ENDPOINT + pubId,
+ data: JSON.stringify(buildRequestData(bidRequest, bidderRequest)),
+ }
+ });
+ },
+
+ /**
+ * Unpack the response from the server into a list of bids.
+ *
+ * @param {ServerResponse} serverResponse A successful response from the server.
+ * @param bidRequest
+ * @return {Bid[]} An array of bids which were nested inside the server.
+ */
+ interpretResponse: function (serverResponse) {
+ const bidResponses = [];
+ const response = (serverResponse || {}).body;
+ // one seat with (optional) bids for each impression
+ if (response && response.seatbid && response.seatbid.length === 1 && response.seatbid[0].bid && response.seatbid[0].bid.length === 1) {
+ const bid = response.seatbid[0].bid[0]
+ if (bid.adm && bid.price) {
+ let bidResponse = {
+ requestId: response.id,
+ bidderCode: spec.code,
+ cpm: bid.price,
+ width: bid.w,
+ height: bid.h,
+ ttl: DEFAULT_BID_TTL,
+ creativeId: bid.crid,
+ netRevenue: DEFAULT_NET_REVENUE,
+ currency: DEFAULT_CURRENCY,
+ mediaType: 'video',
+ vastXml: bid.adm,
+ meta: {
+ advertiserDomains: bid.adomain
+ }
+ };
+ bidResponses.push(bidResponse)
+ }
+ } else {
+ utils.logError('invalid server response received');
+ }
+ return bidResponses;
+ },
+
+ /**
+ * 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: function(syncOptions, serverResponses) {
+ let syncs = [];
+
+ if (!syncOptions.iframeEnabled && !syncOptions.pixelEnabled) {
+ return syncs;
+ }
+
+ serverResponses.forEach(resp => {
+ const userSync = utils.deepAccess(resp, 'body.ext.usersync');
+ if (userSync) {
+ let syncDetails = [];
+ Object.keys(userSync).forEach(key => {
+ const value = userSync[key];
+ if (value.syncs && value.syncs.length) {
+ syncDetails = syncDetails.concat(value.syncs);
+ }
+ });
+ syncDetails.forEach(syncDetails => {
+ syncs.push({
+ type: syncDetails.type === 'iframe' ? 'iframe' : 'image',
+ url: syncDetails.url
+ });
+ });
+
+ // if iframe is enabled return only iframe (videobyte)
+ // if iframe is disabled, we can proceed to pixels if any
+ if (syncOptions.iframeEnabled) {
+ syncs = syncs.filter(s => s.type === 'iframe')
+ } else if (syncOptions.pixelEnabled) {
+ syncs = syncs.filter(s => s.type === 'image')
+ }
+ }
+ });
+ return syncs;
+ }
+
+}
+
+// BUILD REQUESTS: VIDEO
+function buildRequestData(bidRequest, bidderRequest) {
+ const {params} = bidRequest;
+
+ const videoAdUnit = utils.deepAccess(bidRequest, 'mediaTypes.video', {});
+ const videoBidderParams = utils.deepAccess(bidRequest, 'params.video', {});
+
+ const videoParams = {
+ ...videoAdUnit,
+ ...videoBidderParams // Bidder Specific overrides
+ };
+
+ if (bidRequest.params.video && bidRequest.params.video.e2etest) {
+ videoParams.playerSize = [[640, 480]]
+ videoParams.conext = 'instream'
+ }
+
+ const video = {
+ w: parseInt(videoParams.playerSize[0][0], 10),
+ h: parseInt(videoParams.playerSize[0][1], 10),
+ }
+
+ // Obtain all ORTB params related video from Ad Unit
+ VIDEO_ORTB_PARAMS.forEach((param) => {
+ if (videoParams.hasOwnProperty(param)) {
+ video[param] = videoParams[param];
+ }
+ });
+
+ // Placement Inference Rules:
+ // - If no placement is defined then default to 1 (In Stream)
+ video.placement = video.placement || 2;
+
+ // - If product is instream (for instream context) then override placement to 1
+ if (params.context === 'instream') {
+ video.startdelay = video.startdelay || 0;
+ video.placement = 1;
+ }
+
+ // bid floor
+ const bidFloorRequest = {
+ currency: bidRequest.params.cur || 'USD',
+ mediaType: 'video',
+ size: '*'
+ };
+ let floorData = bidRequest.params
+ if (utils.isFn(bidRequest.getFloor)) {
+ floorData = bidRequest.getFloor(bidFloorRequest);
+ } else {
+ if (params.bidfloor) {
+ floorData = {floor: params.bidfloor, currency: params.currency || 'USD'};
+ }
+ }
+
+ const openrtbRequest = {
+ id: bidRequest.bidId,
+ imp: [
+ {
+ id: '1',
+ video: video,
+ secure: isSecure() ? 1 : 0,
+ bidfloor: floorData.floor,
+ bidfloorcur: floorData.currency
+ }
+ ],
+ site: {
+ domain: window.location.hostname,
+ page: window.location.href,
+ ref: bidRequest.refererInfo ? bidRequest.refererInfo.referer || null : null
+ },
+ ext: {
+ hb: 1,
+ prebidver: '$prebid.version$',
+ adapterver: spec.VERSION,
+ },
+ };
+
+ // content
+ if (videoParams.content && utils.isPlainObject(videoParams.content)) {
+ openrtbRequest.site.content = {};
+ const contentStringKeys = ['id', 'title', 'series', 'season', 'genre', 'contentrating', 'language'];
+ const contentNumberkeys = ['episode', 'prodq', 'context', 'livestream', 'len'];
+ const contentArrayKeys = ['cat'];
+ const contentObjectKeys = ['ext'];
+ for (const contentKey in videoBidderParams.content) {
+ if (
+ (contentStringKeys.indexOf(contentKey) > -1 && utils.isStr(videoParams.content[contentKey])) ||
+ (contentNumberkeys.indexOf(contentKey) > -1 && utils.isNumber(videoParams.content[contentKey])) ||
+ (contentObjectKeys.indexOf(contentKey) > -1 && utils.isPlainObject(videoParams.content[contentKey])) ||
+ (contentArrayKeys.indexOf(contentKey) > -1 && utils.isArray(videoParams.content[contentKey]) &&
+ videoParams.content[contentKey].every(catStr => utils.isStr(catStr)))) {
+ openrtbRequest.site.content[contentKey] = videoParams.content[contentKey];
+ } else {
+ utils.logMessage('videobyte bid adapter validation error: ', contentKey, ' is either not supported is OpenRTB V2.5 or value is undefined');
+ }
+ }
+ }
+
+ // adding schain object
+ if (bidRequest.schain) {
+ utils.deepSetValue(openrtbRequest, 'source.ext.schain', bidRequest.schain);
+ openrtbRequest.source.ext.schain.nodes[0].rid = openrtbRequest.id;
+ }
+
+ // Attaching GDPR Consent Params
+ if (bidderRequest.gdprConsent) {
+ utils.deepSetValue(openrtbRequest, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
+ utils.deepSetValue(openrtbRequest, 'regs.ext.gdpr', (bidderRequest.gdprConsent.gdprApplies ? 1 : 0));
+ }
+
+ // CCPA
+ if (bidderRequest.uspConsent) {
+ utils.deepSetValue(openrtbRequest, 'regs.ext.us_privacy', bidderRequest.uspConsent);
+ }
+ return openrtbRequest;
+}
+
+function validateVideo(bidRequest) {
+ if (!bidRequest.params) {
+ return false;
+ }
+
+ if (!bidRequest.params.pubId) {
+ utils.logError('failed validation: publisher id not declared');
+ return false;
+ }
+
+ const videoAdUnit = utils.deepAccess(bidRequest, 'mediaTypes.video', {});
+ const videoBidderParams = utils.deepAccess(bidRequest, 'params.video', {});
+
+ if (videoBidderParams && videoBidderParams.e2etest) {
+ return true;
+ }
+
+ const videoParams = {
+ ...videoAdUnit,
+ ...videoBidderParams // Bidder Specific overrides
+ };
+
+ if (!videoParams.context) {
+ utils.logError('failed validation: context id not declared');
+ return false;
+ }
+ if (videoParams.context !== 'instream') {
+ utils.logError('failed validation: only context instream is supported ');
+ return false;
+ }
+
+ if (typeof videoParams.playerSize === 'undefined' || !Array.isArray(videoParams.playerSize) || !Array.isArray(videoParams.playerSize[0])) {
+ utils.logError('failed validation: player size not declared or is not in format [[w,h]]');
+ return false;
+ }
+
+ return true;
+}
+
+function isSecure() {
+ return document.location.protocol === 'https:';
+}
+
+registerBidder(spec);
diff --git a/modules/videobyteBidAdapter.md b/modules/videobyteBidAdapter.md
new file mode 100644
index 00000000000..fc2b0bce4b5
--- /dev/null
+++ b/modules/videobyteBidAdapter.md
@@ -0,0 +1,78 @@
+# Overview
+
+```
+Module Name: VideoByte Bidder Adapter
+Module Type: Bidder Adapter
+Maintainer: prebid@videobyte.com
+```
+
+# Description
+
+Module that connects to VideoByte's demand sources
+
+*Note:* The Video SSP ad server will respond with an VAST XML to load into your defined player.
+
+## Instream Video adUnit using mediaTypes.video
+*Note:* By default, the adapter will read the mandatory parameters from mediaTypes.video.
+*Note:* The Video SSP ad server will respond with an VAST XML to load into your defined player.
+```
+ var adUnits = [
+ {
+ code: 'video1',
+ mediaTypes: {
+ video: {
+ context: 'instream',
+ playerSize: [640, 480],
+ mimes: ['video/mp4', 'application/javascript'],
+ protocols: [2,5],
+ api: [2],
+ position: 1,
+ delivery: [2],
+ minduration: 10,
+ maxduration: 30,
+ placement: 1,
+ playbackmethod: [1,5],
+ protocols: [2,5],
+ api: [2],
+ }
+ },
+ bids: [
+ {
+ bidder: 'videobyte',
+ params: {
+ bidfloor: 0.5,
+ pubId: 'e2etest'
+ }
+ }
+ ]
+ }
+ ]
+```
+
+# End To End testing mode
+By passing bid.params.video.e2etest = true you will be able to receive a test creative
+
+```
+var adUnits = [
+ {
+ code: 'video-1',
+ mediaTypes: {
+ video: {
+ context: "instream",
+ playerSize: [[640, 480]],
+ mimes: ['video/mp4'],
+ }
+ },
+ bids: [
+ {
+ bidder: 'videobyte',
+ params: {
+ video: {
+ e2etest: true
+ }
+ }
+ }
+ ]
+ }
+]
+```
diff --git a/modules/videofyBidAdapter.js b/modules/videofyBidAdapter.js
deleted file mode 100644
index 11bc21303fd..00000000000
--- a/modules/videofyBidAdapter.js
+++ /dev/null
@@ -1,300 +0,0 @@
-import { VIDEO } from '../src/mediaTypes.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { Renderer } from '../src/Renderer.js';
-import * as utils from '../src/utils.js';
-
-const BIDDER_CODE = 'videofy';
-const TTL = 600;
-
-function avRenderer(bid) {
- bid.renderer.push(function() {
- let eventCallback = bid && bid.renderer && bid.renderer.handleVideoEvent ? bid.renderer.handleVideoEvent : null;
- window.aniviewRenderer.renderAd({
- id: bid.adUnitCode + '_' + bid.adId,
- debug: window.location.href.indexOf('pbjsDebug') >= 0,
- placement: bid.adUnitCode,
- width: bid.width,
- height: bid.height,
- vastUrl: bid.vastUrl,
- vastXml: bid.vastXml,
- config: bid.params[0].rendererConfig,
- eventsCallback: eventCallback,
- bid: bid
- });
- });
-}
-
-function newRenderer(bidRequest) {
- const renderer = Renderer.install({
- url: 'https://player.srv-mars.com/script/6.1/prebidRenderer.js',
- config: {},
- loaded: false,
- });
-
- try {
- renderer.setRender(avRenderer);
- } catch (err) {
- }
-
- return renderer;
-}
-
-function isBidRequestValid(bid) {
- if (!bid.params || !bid.params.AV_PUBLISHERID || !bid.params.AV_CHANNELID) { return false; }
-
- return true;
-}
-let irc = 0;
-function buildRequests(validBidRequests, bidderRequest) {
- let bidRequests = [];
-
- for (let i = 0; i < validBidRequests.length; i++) {
- let bidRequest = validBidRequests[i];
- var sizes = [[640, 480]];
-
- if (bidRequest.mediaTypes && bidRequest.mediaTypes.video && bidRequest.mediaTypes.video.playerSize) {
- sizes = bidRequest.mediaTypes.video.playerSize;
- } else {
- if (bidRequest.sizes) {
- sizes = bidRequest.sizes;
- }
- }
- if (sizes.length === 2 && typeof sizes[0] === 'number') {
- sizes = [[sizes[0], sizes[1]]];
- }
-
- for (let j = 0; j < sizes.length; j++) {
- let size = sizes[j];
- let playerWidth;
- let playerHeight;
-
- if (size && size.length == 2) {
- playerWidth = size[0];
- playerHeight = size[1];
- } else {
- playerWidth = 640;
- playerHeight = 480;
- }
-
- let s2sParams = {};
-
- for (var attrname in bidRequest.params) {
- if (bidRequest.params.hasOwnProperty(attrname) && attrname.indexOf('AV_') == 0) {
- s2sParams[attrname] = bidRequest.params[attrname];
- }
- };
-
- if (s2sParams.AV_APPPKGNAME && !s2sParams.AV_URL) { s2sParams.AV_URL = s2sParams.AV_APPPKGNAME; }
- if (!s2sParams.AV_IDFA && !s2sParams.AV_URL) {
- if (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer) {
- s2sParams.AV_URL = bidderRequest.refererInfo.referer;
- } else {
- s2sParams.AV_URL = window.location.href;
- }
- }
- if (s2sParams.AV_IDFA && !s2sParams.AV_AID) { s2sParams.AV_AID = s2sParams.AV_IDFA; }
- if (s2sParams.AV_AID && !s2sParams.AV_IDFA) { s2sParams.AV_IDFA = s2sParams.AV_AID; }
-
- s2sParams.cb = Math.floor(Math.random() * 999999999);
- s2sParams.AV_WIDTH = playerWidth;
- s2sParams.AV_HEIGHT = playerHeight;
- s2sParams.bidWidth = playerWidth;
- s2sParams.bidHeight = playerHeight;
- s2sParams.bidId = bidRequest.bidId;
- s2sParams.pbjs = 1;
- s2sParams.tgt = 10;
- s2sParams.s2s = '1';
- s2sParams.irc = irc;
- irc++;
- s2sParams.wpm = 1;
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- if (bidderRequest.gdprConsent.gdprApplies) {
- s2sParams.AV_GDPR = 1;
- s2sParams.AV_CONSENT = bidderRequest.gdprConsent.consentString;
- }
- }
- if (bidderRequest && bidderRequest.uspConsent) {
- s2sParams.AV_CCPA = bidderRequest.uspConsent;
- }
-
- let serverDomain = (bidRequest.params && bidRequest.params.serverDomain) ? bidRequest.params.serverDomain : 'servx.srv-mars.com';
- let servingUrl = 'https://' + serverDomain + '/api/adserver/vast3/';
-
- bidRequests.push({
- method: 'GET',
- url: servingUrl,
- data: s2sParams,
- bidRequest
- });
- }
- }
-
- return bidRequests;
-}
-function getCpmData(xml) {
- let ret = {cpm: 0, currency: 'USD'};
- if (xml) {
- let ext = xml.getElementsByTagName('Extensions');
- if (ext && ext.length > 0) {
- ext = ext[0].getElementsByTagName('Extension');
- if (ext && ext.length > 0) {
- for (var i = 0; i < ext.length; i++) {
- if (ext[i].getAttribute('type') == 'ANIVIEW') {
- let price = ext[i].getElementsByTagName('Cpm');
- if (price && price.length == 1) {
- ret.cpm = price[0].textContent;
- }
- break;
- }
- }
- }
- }
- }
- return ret;
-}
-function interpretResponse(serverResponse, bidRequest) {
- let bidResponses = [];
- if (serverResponse && serverResponse.body) {
- if (serverResponse.error) {
- return bidResponses;
- } else {
- try {
- let bidResponse = {};
- if (bidRequest && bidRequest.data && bidRequest.data.bidId && bidRequest.data.bidId !== '') {
- let xmlStr = serverResponse.body;
- let xml = new window.DOMParser().parseFromString(xmlStr, 'text/xml');
- if (xml && xml.getElementsByTagName('parsererror').length == 0) {
- let cpmData = getCpmData(xml);
- if (cpmData && cpmData.cpm > 0) {
- bidResponse.requestId = bidRequest.data.bidId;
- bidResponse.bidderCode = BIDDER_CODE;
- bidResponse.ad = '';
- bidResponse.cpm = cpmData.cpm;
- bidResponse.width = bidRequest.data.AV_WIDTH;
- bidResponse.height = bidRequest.data.AV_HEIGHT;
- bidResponse.ttl = TTL;
- bidResponse.creativeId = xml.getElementsByTagName('Ad') && xml.getElementsByTagName('Ad')[0] && xml.getElementsByTagName('Ad')[0].getAttribute('id') ? xml.getElementsByTagName('Ad')[0].getAttribute('id') : 'creativeId';
- bidResponse.currency = cpmData.currency;
- bidResponse.netRevenue = true;
- var blob = new Blob([xmlStr], {
- type: 'application/xml'
- });
- bidResponse.vastUrl = window.URL.createObjectURL(blob);
- bidResponse.vastXml = xmlStr;
- bidResponse.mediaType = VIDEO;
- if (bidRequest.bidRequest && bidRequest.bidRequest.mediaTypes && bidRequest.bidRequest.mediaTypes.video && bidRequest.bidRequest.mediaTypes.video.context === 'outstream') { bidResponse.renderer = newRenderer(bidRequest); }
-
- bidResponses.push(bidResponse);
- }
- } else {}
- } else {}
- } catch (e) {}
- }
- } else {}
-
- return bidResponses;
-}
-
-function getSyncData(xml, options) {
- let ret = [];
- if (xml) {
- let ext = xml.getElementsByTagName('Extensions');
- if (ext && ext.length > 0) {
- ext = ext[0].getElementsByTagName('Extension');
- if (ext && ext.length > 0) {
- for (var i = 0; i < ext.length; i++) {
- if (ext[i].getAttribute('type') == 'ANIVIEW') {
- let syncs = ext[i].getElementsByTagName('AdServingSync');
- if (syncs && syncs.length == 1) {
- try {
- let data = JSON.parse(syncs[0].textContent);
- if (data && data.trackers && data.trackers.length) {
- data = data.trackers;
- for (var j = 0; j < data.length; j++) {
- if (typeof data[j] === 'object' && typeof data[j].url === 'string' && data[j].e === 'inventory') {
- if (data[j].t == 1 && options.pixelEnabled) {
- ret.push({url: data[j].url, type: 'image'});
- } else {
- if (data[j].t == 3 && options.iframeEnabled) {
- ret.push({url: data[j].url, type: 'iframe'});
- }
- }
- }
- }
- }
- } catch (e) {}
- }
- break;
- }
- }
- }
- }
- }
- return ret;
-}
-
-function getUserSyncs(syncOptions, serverResponses) {
- if (serverResponses && serverResponses[0] && serverResponses[0].body) {
- if (serverResponses.error) {
- return [];
- } else {
- try {
- let xmlStr = serverResponses[0].body;
- let xml = new window.DOMParser().parseFromString(xmlStr, 'text/xml');
- if (xml && xml.getElementsByTagName('parsererror').length == 0) {
- let syncData = getSyncData(xml, syncOptions);
- return syncData;
- }
- } catch (e) {}
- }
- }
-}
-
-function onBidWon(bid) {
- sendbeacon(bid, 17);
-}
-
-function onTimeout(bid) {
- sendbeacon(bid, 19);
-}
-
-function onSetTargeting(bid) {
- sendbeacon(bid, 20);
-}
-
-function sendbeacon(bid, type) {
- const bidCopy = {
- bidder: bid.bidder,
- cpm: bid.cpm,
- originalCpm: bid.originalCpm,
- currency: bid.currency,
- originalCurrency: bid.originalCurrency,
- timeToRespond: bid.timeToRespond,
- statusMessage: bid.statusMessage,
- width: bid.width,
- height: bid.height,
- size: bid.size,
- params: bid.params,
- status: bid.status,
- adserverTargeting: bid.adserverTargeting,
- ttl: bid.ttl
- };
- const bidString = JSON.stringify(bidCopy);
- const encodedBuf = window.btoa(bidString);
- utils.triggerPixel('https://beacon.videofy.io/notification/rtb/beacon/?bt=' + type + '&bid=hcwqso&hb_j=' + encodedBuf, null);
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: [VIDEO],
- isBidRequestValid,
- buildRequests,
- interpretResponse,
- getUserSyncs,
- onBidWon,
- onTimeout,
- onSetTargeting
-};
-
-registerBidder(spec);
diff --git a/modules/videoreachBidAdapter.js b/modules/videoreachBidAdapter.js
index 710920c54fc..c307fc3e865 100644
--- a/modules/videoreachBidAdapter.js
+++ b/modules/videoreachBidAdapter.js
@@ -2,9 +2,11 @@ import {registerBidder} from '../src/adapters/bidderFactory.js';
const utils = require('../src/utils.js');
const BIDDER_CODE = 'videoreach';
const ENDPOINT_URL = 'https://a.videoreach.com/hb/';
+const GVLID = 547;
export const spec = {
code: BIDDER_CODE,
+ gvlid: GVLID,
supportedMediaTypes: ['banner'],
isBidRequestValid: function(bid) {
@@ -58,7 +60,10 @@ export const spec = {
ttl: bid.ttl,
ad: bid.ad,
requestId: bid.bidId,
- creativeId: bid.creativeId
+ creativeId: bid.creativeId,
+ meta: {
+ advertiserDomains: bid && bid.adomain ? bid.adomain : []
+ }
};
bidResponses.push(bidResponse);
});
diff --git a/modules/viewdeosDXBidAdapter.js b/modules/viewdeosDXBidAdapter.js
index 22c16ab5b34..212759642f5 100644
--- a/modules/viewdeosDXBidAdapter.js
+++ b/modules/viewdeosDXBidAdapter.js
@@ -190,7 +190,10 @@ function createBid(bidResponse, mediaType, bidderParams) {
cpm: bidResponse.cpm,
netRevenue: true,
mediaType,
- ttl: 3600
+ ttl: 3600,
+ meta: {
+ advertiserDomains: bidResponse.adomain || []
+ }
};
if (mediaType === DISPLAY) {
diff --git a/modules/visxBidAdapter.js b/modules/visxBidAdapter.js
index 12004cc35af..7d124864bc6 100644
--- a/modules/visxBidAdapter.js
+++ b/modules/visxBidAdapter.js
@@ -5,6 +5,7 @@ import { BANNER, VIDEO } from '../src/mediaTypes.js';
import { INSTREAM as VIDEO_INSTREAM } from '../src/video.js';
const { parseSizesInput, getKeys, logError, deepAccess } = utils;
const BIDDER_CODE = 'visx';
+const GVLID = 154;
const BASE_URL = 'https://t.visx.net';
const ENDPOINT_URL = BASE_URL + '/hb';
const TIME_TO_LIVE = 360;
@@ -30,11 +31,15 @@ const currencyWhiteList = ['EUR', 'USD', 'GBP', 'PLN'];
const RE_EMPTY_OR_ONLY_COMMAS = /^,*$/;
export const spec = {
code: BIDDER_CODE,
+ gvlid: GVLID,
supportedMediaTypes: [BANNER, VIDEO],
isBidRequestValid: function(bid) {
if (_isVideoBid(bid)) {
- if (!_isValidVideoBid(bid)) {
- return false;
+ if (!_isValidVideoBid(bid, true)) {
+ // in case if video bid configuration invalid will try to send bid request for banner
+ if (!_isBannerBid(bid)) {
+ return false;
+ }
}
}
return !!bid.params.uid;
@@ -243,6 +248,10 @@ function _addBidResponse(serverBid, bidsMap, currency, bidResponses, bidsWithout
netRevenue: true,
ttl: TIME_TO_LIVE,
dealId: serverBid.dealid,
+ meta: {
+ advertiserDomains: serverBid.advertiserDomains ? serverBid.advertiserDomains : [],
+ mediaType: serverBid.mediaType
+ },
};
if (serverBid.ext && serverBid.ext.prebid) {
@@ -289,23 +298,35 @@ function _isVideoBid(bid) {
return bid.mediaType === VIDEO || deepAccess(bid, 'mediaTypes.video');
}
-function _isValidVideoBid(bid) {
+function _isBannerBid(bid) {
+ return bid.mediaType === BANNER || deepAccess(bid, 'mediaTypes.banner');
+}
+
+function _isValidVideoBid(bid, logErrors = false) {
let result = true;
const videoMediaType = deepAccess(bid, 'mediaTypes.video');
if (videoMediaType.context !== VIDEO_INSTREAM) {
- logError(LOG_ERROR_MESS.onlyVideoInstream)
+ if (logErrors) {
+ logError(LOG_ERROR_MESS.onlyVideoInstream);
+ }
result = false;
}
if (!(videoMediaType.playerSize && parseSizesInput(deepAccess(videoMediaType, 'playerSize', [])))) {
- logError(LOG_ERROR_MESS.videoMissing + 'playerSize');
+ if (logErrors) {
+ logError(LOG_ERROR_MESS.videoMissing + 'playerSize');
+ }
result = false;
}
if (!videoMediaType.mimes) {
- logError(LOG_ERROR_MESS.videoMissing + 'mimes');
+ if (logErrors) {
+ logError(LOG_ERROR_MESS.videoMissing + 'mimes');
+ }
result = false;
}
if (!videoMediaType.protocols) {
- logError(LOG_ERROR_MESS.videoMissing + 'protocols');
+ if (logErrors) {
+ logError(LOG_ERROR_MESS.videoMissing + 'protocols');
+ }
result = false;
}
return result;
@@ -323,13 +344,29 @@ function _initVideoTypes(bids) {
if (bids && bids.length) {
bids.forEach(function (bid) {
const mediaTypes = deepAccess(bid, 'mediaTypes.video', {});
- _playerSize.push(parseSizesInput(deepAccess(mediaTypes, 'playerSize', [])).join('|'));
- _protocols.push(deepAccess(mediaTypes, 'protocols', []).join('|'));
- _api.push(deepAccess(mediaTypes, 'api', []).join('|'));
- _mimes.push(deepAccess(mediaTypes, 'mimes', []).join('|'));
- _minduration.push(deepAccess(mediaTypes, 'minduration', null));
- _maxduration.push(deepAccess(mediaTypes, 'maxduration', null));
- _skip.push(deepAccess(mediaTypes, 'skip', null));
+ let bidPlayerSize = '';
+ let bidProtocols = '';
+ let bidApi = '';
+ let bidMimes = '';
+ let bidMinduration = null;
+ let bidMaxduration = null;
+ let bidSkip = null;
+ if (_isVideoBid(bid) && _isValidVideoBid(bid)) {
+ bidPlayerSize = parseSizesInput(deepAccess(mediaTypes, 'playerSize', [])).join('|');
+ bidProtocols = deepAccess(mediaTypes, 'protocols', []).join('|');
+ bidApi = deepAccess(mediaTypes, 'api', []).join('|');
+ bidMimes = deepAccess(mediaTypes, 'mimes', []).join('|');
+ bidMinduration = deepAccess(mediaTypes, 'minduration', null);
+ bidMaxduration = deepAccess(mediaTypes, 'maxduration', null);
+ bidSkip = deepAccess(mediaTypes, 'skip', null);
+ }
+ _playerSize.push(bidPlayerSize);
+ _protocols.push(bidProtocols);
+ _api.push(bidApi);
+ _mimes.push(bidMimes);
+ _minduration.push(bidMinduration);
+ _maxduration.push(bidMaxduration);
+ _skip.push(bidSkip);
});
}
_playerSize = _playerSize.join(',');
diff --git a/modules/vlybyBidAdapter.js b/modules/vlybyBidAdapter.js
new file mode 100644
index 00000000000..10352179044
--- /dev/null
+++ b/modules/vlybyBidAdapter.js
@@ -0,0 +1,71 @@
+import { registerBidder } from '../src/adapters/bidderFactory.js'
+
+import { BANNER, VIDEO } from '../src/mediaTypes.js'
+
+const ENDPOINT = '//prebid.vlyby.com/';
+const BIDDER_CODE = 'vlyby';
+
+export const spec = {
+ code: BIDDER_CODE,
+ supportedMediaTypes: [VIDEO, BANNER],
+
+ isBidRequestValid: function (bid) {
+ if (bid && bid.params && bid.params.publisherId) {
+ return true
+ }
+ return false
+ },
+
+ buildRequests: function (validBidRequests, bidderRequest = {}) {
+ const gdprConsent = bidderRequest.gdprConsent || {};
+ return {
+ method: 'POST',
+ url: `${ENDPOINT}`,
+ data: {
+ request: {
+ auctionId: bidderRequest.auctionId
+ },
+ gdprConsent: {
+ consentString: gdprConsent.consentString,
+ gdprApplies: gdprConsent.gdprApplies
+ },
+ bidRequests: validBidRequests.map(({ params, sizes, bidId, adUnitCode }) => ({
+ bidId,
+ adUnitCode,
+ params,
+ sizes
+ }))
+ },
+ options: {
+ withCredentials: false,
+ contentType: 'application/json'
+ },
+ validBidRequests: validBidRequests,
+ }
+ },
+ interpretResponse: function(serverResponse, bidRequest) {
+ const bidResponses = [];
+ if (serverResponse.body) {
+ const vHB = serverResponse.body.bids;
+ try {
+ let bidResponse = {
+ requestId: vHB.bid,
+ cpm: vHB.cpm,
+ width: vHB.size.width,
+ height: vHB.size.height,
+ creativeId: vHB.creative.id,
+ currency: 'EUR',
+ netRevenue: true,
+ ttl: 360,
+ ad: vHB.creative.ad,
+ meta: {
+ adomain: vHB.adomain && Array.isArray(vHB.adomain) ? vHB.adomain : []
+ }
+ };
+ bidResponses.push(bidResponse);
+ } catch (e) { }
+ }
+ return bidResponses;
+ }
+};
+registerBidder(spec);
diff --git a/modules/vlybyBidAdapter.md b/modules/vlybyBidAdapter.md
new file mode 100755
index 00000000000..41d9bbf8709
--- /dev/null
+++ b/modules/vlybyBidAdapter.md
@@ -0,0 +1,36 @@
+# Overview
+
+```
+Module Name: VLYBY Prebid Outstream
+Module Type: Bidder Adapter
+Tech-Support: prebid@vlyby.com
+Client-Support: support@vlyby.com
+```
+
+# Description
+
+VLYBY Digital GmbH provides with this VLYBY Prebid Adapter a Mediation for the Outstream Product. Please contact support@vlyby.com for additional information and access to VLYBY User Interface and Prebid IDs.
+
+# Demo Implementation
+
+In most of the cases a Publisher will use his own AdServer for delivering Creatives to a Publisher-Website. This GPT implementation is only a skeleton. You need an additional Line-Item in your AdServer, Prebid Creative, access to VLYBY UI.
+
+### GPT Implementation
+```javascript
+ var adUnits = [{
+ code: '/your-network-id/adunit',
+ mediaTypes: {
+ banner: {
+ sizes: div_1_sizes
+ }
+ },
+ bids: [{
+ bidder: 'vlyby',
+ params: {
+ publisherId: 'f363eb2b75459b34592cc4', // needed - only demo
+ siteId: 'techpreview.vlyby_prebidadapter', // needed - only demo
+ placement:'default' // optional - provided by VLYBY UI
+ }
+ }]
+ }]
+```
\ No newline at end of file
diff --git a/modules/vmgBidAdapter.js b/modules/vmgBidAdapter.js
deleted file mode 100644
index 57a812ec466..00000000000
--- a/modules/vmgBidAdapter.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-const BIDDER_CODE = 'vmg';
-const ENDPOINT = 'https://predict.vmg.nyc';
-
-export const spec = {
- code: BIDDER_CODE,
- /**
- * Determines whether or not the given bid request is valid.
- *
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: function (bidRequest) {
- if (typeof bidRequest !== 'undefined') {
- return true;
- } else {
- return false;
- }
- },
- /**
- * 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) {
- let bidRequests = [];
- let referer = window.location.href;
- try {
- referer = typeof bidderRequest.refererInfo === 'undefined'
- ? window.top.location.href
- : bidderRequest.refererInfo.referer;
- } catch (e) {}
-
- validBidRequests.forEach(function(validBidRequest) {
- bidRequests.push({
- adUnitCode: validBidRequest.adUnitCode,
- referer: referer,
- bidId: validBidRequest.bidId
- });
- });
-
- return {
- method: 'POST',
- url: ENDPOINT,
- data: JSON.stringify(bidRequests)
- };
- },
- /**
- * Unpack the response from the server into a list of bids.
- *
- * Some required bid params are not needed for this so default
- * values are used.
- *
- * @param {*} serverResponse A successful response from the server.
- * @return {Bid[]} An array of bids which were nested inside the server.
- */
- interpretResponse: function (serverResponse, bidRequest) {
- const validBids = JSON.parse(bidRequest.data);
- let bidResponses = [];
- if (typeof serverResponse.body !== 'undefined') {
- const deals = serverResponse.body;
- validBids.forEach(function(validBid) {
- if (typeof deals[validBid.adUnitCode] !== 'undefined') {
- const bidResponse = {
- requestId: validBid.bidId,
- ad: '
',
- cpm: 0.01,
- width: 0,
- height: 0,
- dealId: deals[validBid.adUnitCode],
- ttl: 300,
- creativeId: '1',
- netRevenue: '0',
- currency: 'USD'
- };
-
- bidResponses.push(bidResponse);
- }
- });
- }
-
- return bidResponses;
- }
-}
-
-registerBidder(spec);
diff --git a/modules/vrtcalBidAdapter.js b/modules/vrtcalBidAdapter.js
index ff24803f688..d23a05e23ca 100644
--- a/modules/vrtcalBidAdapter.js
+++ b/modules/vrtcalBidAdapter.js
@@ -70,6 +70,12 @@ export const spec = {
nurl: response.seatbid[0].bid[0].nurl
};
+ if (response.seatbid[0].bid[0].adomain && response.seatbid[0].bid[0].adomain.length) {
+ bidResponse.meta = {
+ advertiserDomains: response.seatbid[0].bid[0].adomain
+ };
+ }
+
bidResponses.push(bidResponse);
}
return bidResponses;
diff --git a/modules/vubleBidAdapter.js b/modules/vubleBidAdapter.js
deleted file mode 100644
index d14f24e9993..00000000000
--- a/modules/vubleBidAdapter.js
+++ /dev/null
@@ -1,198 +0,0 @@
-// Vuble Adapter
-
-import * as utils from '../src/utils.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import { Renderer } from '../src/Renderer.js';
-
-const BIDDER_CODE = 'vuble';
-
-const ENVS = ['com', 'net'];
-const CURRENCIES = {
- com: 'EUR',
- net: 'USD'
-};
-const TTL = 60;
-
-const outstreamRender = bid => {
- bid.renderer.push(() => {
- window.ANOutstreamVideo.renderAd({
- sizes: [bid.width, bid.height],
- targetId: bid.adUnitCode,
- adResponse: bid.adResponse,
- rendererOptions: {
- showBigPlayButton: false,
- showProgressBar: 'bar',
- showVolume: false,
- allowFullscreen: true,
- skippable: false,
- }
- });
- });
-}
-
-const createRenderer = (bid, serverResponse) => {
- const renderer = Renderer.install({
- id: serverResponse.renderer_id,
- url: serverResponse.renderer_url,
- loaded: false,
- });
-
- try {
- renderer.setRender(outstreamRender);
- } catch (err) {
- utils.logWarn('Prebid Error calling setRender on renderer', err);
- }
-
- return renderer;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- supportedMediaTypes: ['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: function (bid) {
- let rawSizes = utils.deepAccess(bid, 'mediaTypes.video.playerSize') || bid.sizes;
- if (utils.isEmpty(rawSizes) || utils.parseSizesInput(rawSizes).length == 0) {
- return false;
- }
-
- if (!utils.deepAccess(bid, 'mediaTypes.video.context')) {
- return false;
- }
-
- if (!utils.contains(ENVS, bid.params.env)) {
- return false;
- }
-
- return !!(bid.params.env && bid.params.pubId && bid.params.zoneId);
- },
-
- /**
- * 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) {
- return validBidRequests.map(bidRequest => {
- // We take the first size
- let rawSize = utils.deepAccess(bidRequest, 'mediaTypes.video.playerSize') || bidRequest.sizes;
- let size = utils.parseSizesInput(rawSize)[0].split('x');
-
- // Get the page's url
- let referer = (bidderRequest && bidderRequest.refererInfo) ? bidderRequest.refererInfo.referer : '';
- if (bidRequest.params.referrer) {
- referer = bidRequest.params.referrer;
- }
-
- // Get Video Context
- let context = utils.deepAccess(bidRequest, 'mediaTypes.video.context');
-
- let url = 'https://player.mediabong.' + bidRequest.params.env + '/prebid/request';
- let data = {
- width: size[0],
- height: size[1],
- pub_id: bidRequest.params.pubId,
- zone_id: bidRequest.params.zoneId,
- context: context,
- floor_price: bidRequest.params.floorPrice ? bidRequest.params.floorPrice : 0,
- url: referer,
- env: bidRequest.params.env,
- bid_id: bidRequest.bidId,
- adUnitCode: bidRequest.adUnitCode
- };
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- data.gdpr_consent = {
- consent_string: bidderRequest.gdprConsent.consentString,
- gdpr_applies: (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') ? bidderRequest.gdprConsent.gdprApplies : true
- }
- }
-
- return {
- method: 'POST',
- url: url,
- data: data
- };
- });
- },
-
- /**
- * 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, bidRequest) {
- const responseBody = serverResponse.body;
-
- if (typeof responseBody !== 'object' || responseBody.status !== 'ok') {
- return [];
- }
-
- let bids = [];
- let bid = {
- requestId: bidRequest.data.bid_id,
- cpm: responseBody.cpm,
- width: bidRequest.data.width,
- height: bidRequest.data.height,
- ttl: TTL,
- creativeId: responseBody.creativeId,
- dealId: responseBody.dealId,
- netRevenue: true,
- currency: CURRENCIES[bidRequest.data.env],
- vastUrl: responseBody.url,
- mediaType: 'video'
- };
-
- if (responseBody.renderer_url) {
- let adResponse = {
- ad: {
- video: {
- content: responseBody.content
- }
- }
- };
-
- Object.assign(bid, {
- adResponse: adResponse,
- adUnitCode: bidRequest.data.adUnitCode,
- renderer: createRenderer(bid, responseBody)
- });
- }
-
- bids.push(bid);
-
- return bids;
- },
-
- /**
- * 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: function (syncOptions, serverResponses) {
- if (syncOptions.iframeEnabled) {
- if (serverResponses.length > 0) {
- let responseBody = serverResponses[0].body;
- if (typeof responseBody !== 'object' || responseBody.iframeSync) {
- return [{
- type: 'iframe',
- url: responseBody.iframeSync
- }];
- }
- }
- }
- return [];
- }
-};
-
-registerBidder(spec);
diff --git a/modules/waardexBidAdapter.js b/modules/waardexBidAdapter.js
index 1558ea39cd1..bc60e151e39 100644
--- a/modules/waardexBidAdapter.js
+++ b/modules/waardexBidAdapter.js
@@ -95,7 +95,7 @@ const getBidRequestsToSend = validBidRequests => {
const getBidRequestToSend = validBidRequest => {
const result = {
bidId: validBidRequest.bidId,
- bidfloor: parseFloat(validBidRequest.params.bidfloor) || 0,
+ bidfloor: 0,
position: parseInt(validBidRequest.params.position) || 1,
instl: parseInt(validBidRequest.params.instl) || 0,
};
diff --git a/modules/waardexBidAdapter.md b/modules/waardexBidAdapter.md
index 8eade8409f4..6978281d40e 100644
--- a/modules/waardexBidAdapter.md
+++ b/modules/waardexBidAdapter.md
@@ -33,7 +33,6 @@ var adUnits = [
{
bidder: 'waardex',
params: {
- bidfloor: 1.5,
position: 1,
instl: 1,
zoneId: 1
@@ -60,31 +59,30 @@ const adUnits = [
mediaTypes: {
video: {
context: 'instream',
- playerSize: sizes[0]
+ playerSize: sizes[0],
+ mimes: ['video/x-ms-wmv', 'video/mp4'],
+ minduration: 2,
+ maxduration: 10,
+ protocols: ['VAST 1.0', 'VAST 2.0'],
+ startdelay: -1,
+ placement: 1,
+ skip: 1,
+ skipafter: 2,
+ minbitrate: 0,
+ maxbitrate: 0,
+ delivery: [1, 2, 3],
+ playbackmethod: [1, 2],
+ api: [1, 2, 3, 4, 5, 6],
+ linearity: 1,
+ position: 1
}
},
bids: [
{
bidder: 'waardex',
params: {
- bidfloor: 1.5,
- position: 1,
instl: 1,
- zoneId: 1,
- mimes: ['video/x-ms-wmv', 'video/mp4'],
- minduration: 2,
- maxduration: 10,
- protocols: ['VAST 1.0', 'VAST 2.0'],
- startdelay: -1,
- placement: 1,
- skip: 1,
- skipafter: 2,
- minbitrate: 0,
- maxbitrate: 0,
- delivery: [1, 2, 3],
- playbackmethod: [1, 2],
- api: [1, 2, 3, 4, 5, 6],
- linearity: 1,
+ zoneId: 1
}
}
]
diff --git a/modules/welectBidAdapter.js b/modules/welectBidAdapter.js
deleted file mode 100644
index 467b628c944..00000000000
--- a/modules/welectBidAdapter.js
+++ /dev/null
@@ -1,92 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'welect';
-const DEFAULT_DOMAIN = 'www.welect.de';
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ['wlt'],
- gvlid: 282,
- supportedMediaTypes: ['video'],
-
- // 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 (
- utils.deepAccess(bid, 'mediaTypes.video.context') === 'instream' &&
- !!bid.params.placementId
- );
- },
- /**
- * 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) {
- return validBidRequests.map((bidRequest) => {
- let rawSizes =
- utils.deepAccess(bidRequest, 'mediaTypes.video.playerSize') ||
- bidRequest.sizes;
- let size = rawSizes[0];
-
- let domain = bidRequest.params.domain || DEFAULT_DOMAIN;
-
- let url = `https://${domain}/api/v2/preflight/${bidRequest.params.placementId}`;
-
- let gdprConsent = null;
-
- if (bidRequest && bidRequest.gdprConsent) {
- gdprConsent = {
- gdpr_consent: {
- gdprApplies: bidRequest.gdprConsent.gdprApplies,
- tcString: bidRequest.gdprConsent.gdprConsent,
- },
- };
- }
-
- const data = {
- width: size[0],
- height: size[1],
- bid_id: bidRequest.bidId,
- ...gdprConsent,
- };
-
- return {
- method: 'POST',
- url: url,
- data: data,
- options: {
- contentType: 'application/json',
- withCredentials: false,
- crossOrigin: true,
- },
- };
- });
- },
- /**
- * 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, bidRequest) {
- const responseBody = serverResponse.body;
-
- if (typeof responseBody !== 'object' || responseBody.available !== true) {
- return [];
- }
-
- const bidResponses = [];
- const bidResponse = responseBody.bidResponse;
- bidResponses.push(bidResponse);
- return bidResponses;
- },
-};
-registerBidder(spec);
diff --git a/modules/widespaceBidAdapter.js b/modules/widespaceBidAdapter.js
index 3cea5ca57a1..7890628f94b 100644
--- a/modules/widespaceBidAdapter.js
+++ b/modules/widespaceBidAdapter.js
@@ -61,7 +61,7 @@ export const spec = {
'gdprCmp': bidderRequest && bidderRequest.gdprConsent ? 1 : 0,
'hb': '1',
'hb.cd': CUST_DATA ? encodedParamValue(CUST_DATA) : '',
- 'hb.floor': bid.bidfloor || '',
+ 'hb.floor': '',
'hb.spb': i === 0 ? pixelSyncPossibility() : -1,
'hb.ver': WS_ADAPTER_VERSION,
'hb.name': 'prebidjs-$prebid.version$',
@@ -95,10 +95,9 @@ export const spec = {
// Include debug data when available
if (!isInHostileIframe) {
- const DEBUG_AD = (find(window.top.location.hash.split('&'),
+ data.forceAdId = (find(window.top.location.hash.split('&'),
val => includes(val, 'WS_DEBUG_FORCEADID')
) || '').split('=')[1];
- data.forceAdId = DEBUG_AD;
}
// GDPR Consent info
@@ -151,7 +150,10 @@ export const spec = {
netRevenue: Boolean(bid.netRev),
ttl: bid.ttl,
referrer: getTopWindowReferrer(),
- ad: bid.code
+ ad: bid.code,
+ meta: {
+ advertiserDomains: bid.adomain || []
+ }
});
}
});
@@ -223,7 +225,6 @@ function visibleOnLoad(element) {
const topPos = element.getBoundingClientRect().top;
return topPos < screen.height && topPos >= window.top.pageYOffset ? 1 : 0;
}
- ;
return '';
}
diff --git a/modules/widespaceBidAdapter.md b/modules/widespaceBidAdapter.md
index 1ca2b61d406..fe87a620a86 100644
--- a/modules/widespaceBidAdapter.md
+++ b/modules/widespaceBidAdapter.md
@@ -1,8 +1,8 @@
# Overview
-**Module Name:** Widespace Bidder Adapter.
-**Module Type:** Bidder Adapter.
+**Module Name:** Widespace Bidder Adapter.\
+**Module Type:** Bidder Adapter.\
**Maintainer:** support@widespace.com
@@ -38,3 +38,4 @@ Banner and video formats are supported.
}
];
```
+
diff --git a/modules/windtalkerBidAdapter.js b/modules/windtalkerBidAdapter.js
deleted file mode 100644
index 512cc7f839b..00000000000
--- a/modules/windtalkerBidAdapter.js
+++ /dev/null
@@ -1,307 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import includes from 'core-js-pure/features/array/includes.js';
-
-const NATIVE_DEFAULTS = {
- TITLE_LEN: 100,
- DESCR_LEN: 200,
- SPONSORED_BY_LEN: 50,
- IMG_MIN: 150,
- ICON_MIN: 50,
-};
-const DEFAULT_MIMES = ['video/mp4', 'video/webm', 'application/x-shockwave-flash', 'application/javascript'];
-const VIDEO_TARGETING = ['mimes', 'skippable', 'playback_method', 'protocols', 'api'];
-const DEFAULT_PROTOCOLS = [2, 3, 5, 6];
-const DEFAULT_APIS = [1, 2];
-
-export const spec = {
-
- code: 'windtalker',
- supportedMediaTypes: ['banner', 'native', 'video'],
-
- isBidRequestValid: bid => (
- !!(bid && bid.params && bid.params.pubId && bid.params.placementId)
- ),
- buildRequests: (bidRequests, bidderRequest) => {
- const request = {
- id: bidRequests[0].bidderRequestId,
- at: 2,
- imp: bidRequests.map(slot => impression(slot)),
- site: site(bidRequests),
- app: app(bidRequests),
- device: device(bidRequests),
- };
- applyGdpr(bidderRequest, request);
- return {
- method: 'POST',
- url: 'https://windtalkerdisplay.hb.adp3.net/',
- data: JSON.stringify(request),
- };
- },
- interpretResponse: (response, request) => (
- bidResponseAvailable(request, response.body)
- ),
-};
-
-function bidResponseAvailable(bidRequest, bidResponse) {
- const idToImpMap = {};
- const idToBidMap = {};
- const ortbRequest = parse(bidRequest.data);
- ortbRequest.imp.forEach(imp => {
- idToImpMap[imp.id] = imp;
- });
- if (bidResponse) {
- bidResponse.seatbid.forEach(seatBid => seatBid.bid.forEach(bid => {
- idToBidMap[bid.impid] = bid;
- }));
- }
- const bids = [];
- Object.keys(idToImpMap).forEach(id => {
- if (idToBidMap[id]) {
- const bid = {};
- bid.requestId = id;
- bid.adId = id;
- bid.creativeId = id;
- bid.cpm = idToBidMap[id].price;
- bid.currency = bidResponse.cur;
- bid.ttl = 360;
- bid.netRevenue = true;
- if (idToImpMap[id]['native']) {
- bid['native'] = nativeResponse(idToImpMap[id], idToBidMap[id]);
- let nurl = idToBidMap[id].nurl;
- nurl = nurl.replace(/\$(%7B|\{)AUCTION_IMP_ID(%7D|\})/gi, idToBidMap[id].impid);
- nurl = nurl.replace(/\$(%7B|\{)AUCTION_PRICE(%7D|\})/gi, idToBidMap[id].price);
- nurl = nurl.replace(/\$(%7B|\{)AUCTION_CURRENCY(%7D|\})/gi, bidResponse.cur);
- nurl = nurl.replace(/\$(%7B|\{)AUCTION_BID_ID(%7D|\})/gi, bidResponse.bidid);
- bid['native']['impressionTrackers'] = [nurl];
- bid.mediaType = 'native';
- } else if (idToImpMap[id]['video']) {
- bid.vastUrl = idToBidMap[id].adm;
- bid.vastUrl = bid.vastUrl.replace(/\$(%7B|\{)AUCTION_PRICE(%7D|\})/gi, idToBidMap[id].price);
- bid.crid = idToBidMap[id].crid;
- bid.width = idToImpMap[id].video.w;
- bid.height = idToImpMap[id].video.h;
- bid.mediaType = 'video';
- } else if (idToImpMap[id]['banner']) {
- bid.ad = idToBidMap[id].adm;
- bid.ad = bid.ad.replace(/\$(%7B|\{)AUCTION_IMP_ID(%7D|\})/gi, idToBidMap[id].impid);
- bid.ad = bid.ad.replace(/\$(%7B|\{)AUCTION_AD_ID(%7D|\})/gi, idToBidMap[id].adid);
- bid.ad = bid.ad.replace(/\$(%7B|\{)AUCTION_PRICE(%7D|\})/gi, idToBidMap[id].price);
- bid.ad = bid.ad.replace(/\$(%7B|\{)AUCTION_CURRENCY(%7D|\})/gi, bidResponse.cur);
- bid.ad = bid.ad.replace(/\$(%7B|\{)AUCTION_BID_ID(%7D|\})/gi, bidResponse.bidid);
- bid.width = idToBidMap[id].w;
- bid.height = idToBidMap[id].h;
- bid.mediaType = 'banner';
- }
- bids.push(bid);
- }
- });
- return bids;
-}
-function impression(slot) {
- return {
- id: slot.bidId,
- secure: window.location.protocol === 'https:' ? 1 : 0,
- 'banner': banner(slot),
- 'native': nativeImpression(slot),
- 'video': videoImpression(slot),
- bidfloor: slot.params.bidFloor || '0.000001',
- tagid: slot.params.placementId.toString(),
- };
-}
-
-function banner(slot) {
- if (slot.mediaType === 'banner' || utils.deepAccess(slot, 'mediaTypes.banner')) {
- const sizes = utils.deepAccess(slot, 'mediaTypes.banner.sizes');
- if (sizes.length > 1) {
- let format = [];
- for (let f = 0; f < sizes.length; f++) {
- format.push({'w': sizes[f][0], 'h': sizes[f][1]});
- }
- return {'format': format};
- } else {
- return {
- w: sizes[0][0],
- h: sizes[0][1]
- }
- }
- }
- return null;
-}
-
-function videoImpression(slot) {
- if (slot.mediaType === 'video' || utils.deepAccess(slot, 'mediaTypes.video')) {
- const sizes = utils.deepAccess(slot, 'mediaTypes.video.playerSize');
- const video = {
- w: sizes[0][0],
- h: sizes[0][1],
- mimes: DEFAULT_MIMES,
- protocols: DEFAULT_PROTOCOLS,
- api: DEFAULT_APIS,
- };
- if (slot.params.video) {
- Object.keys(slot.params.video).filter(param => includes(VIDEO_TARGETING, param)).forEach(param => video[param] = slot.params.video[param]);
- }
- return video;
- }
- return null;
-}
-
-function nativeImpression(slot) {
- if (slot.mediaType === 'native' || utils.deepAccess(slot, 'mediaTypes.native')) {
- const assets = [];
- addAsset(assets, titleAsset(1, slot.nativeParams.title, NATIVE_DEFAULTS.TITLE_LEN));
- addAsset(assets, dataAsset(2, slot.nativeParams.body, 2, NATIVE_DEFAULTS.DESCR_LEN));
- addAsset(assets, dataAsset(3, slot.nativeParams.sponsoredBy, 1, NATIVE_DEFAULTS.SPONSORED_BY_LEN));
- addAsset(assets, imageAsset(4, slot.nativeParams.icon, 1, NATIVE_DEFAULTS.ICON_MIN, NATIVE_DEFAULTS.ICON_MIN));
- addAsset(assets, imageAsset(5, slot.nativeParams.image, 3, NATIVE_DEFAULTS.IMG_MIN, NATIVE_DEFAULTS.IMG_MIN));
- return {
- request: JSON.stringify({ assets }),
- ver: '1.1',
- };
- }
- return null;
-}
-
-function addAsset(assets, asset) {
- if (asset) {
- assets.push(asset);
- }
-}
-
-function titleAsset(id, params, defaultLen) {
- if (params) {
- return {
- id,
- required: params.required ? 1 : 0,
- title: {
- len: params.len || defaultLen,
- },
- };
- }
- return null;
-}
-
-function imageAsset(id, params, type, defaultMinWidth, defaultMinHeight) {
- return params ? {
- id,
- required: params.required ? 1 : 0,
- img: {
- type,
- wmin: params.wmin || defaultMinWidth,
- hmin: params.hmin || defaultMinHeight,
- }
- } : null;
-}
-
-function dataAsset(id, params, type, defaultLen) {
- return params ? {
- id,
- required: params.required ? 1 : 0,
- data: {
- type,
- len: params.len || defaultLen,
- }
- } : null;
-}
-
-function site(bidderRequest) {
- const pubId = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.pubId : '0';
- const siteId = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.siteId : '0';
- const appParams = bidderRequest[0].params.app;
- if (!appParams) {
- return {
- publisher: {
- id: pubId.toString(),
- domain: window.location.hostname,
- },
- id: siteId.toString(),
- ref: window.top.document.referrer,
- page: window.location.href,
- }
- }
- return null;
-}
-
-function app(bidderRequest) {
- const pubId = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.pubId : '0';
- const appParams = bidderRequest[0].params.app;
- if (appParams) {
- return {
- publisher: {
- id: pubId.toString(),
- },
- id: appParams.id,
- name: appParams.name,
- bundle: appParams.bundle,
- storeurl: appParams.storeUrl,
- domain: appParams.domain,
- }
- }
- return null;
-}
-
-function device(bidderRequest) {
- const lat = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.latitude : '';
- const lon = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.longitude : '';
- const ifa = bidderRequest && bidderRequest.length > 0 ? bidderRequest[0].params.ifa : '';
- return {
- dnt: utils.getDNT() ? 1 : 0,
- ua: navigator.userAgent,
- language: (navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage),
- w: (window.screen.width || window.innerWidth),
- h: (window.screen.height || window.innerHeigh),
- geo: {
- lat: lat,
- lon: lon,
- },
- ifa: ifa,
- };
-}
-
-function parse(rawResponse) {
- try {
- if (rawResponse) {
- return JSON.parse(rawResponse);
- }
- } catch (ex) {
- utils.logError('windtalker.parse', 'ERROR', ex);
- }
- return null;
-}
-
-function applyGdpr(bidderRequest, ortbRequest) {
- if (bidderRequest && bidderRequest.gdprConsent) {
- ortbRequest.regs = { ext: { gdpr: bidderRequest.gdprConsent.gdprApplies ? 1 : 0 } };
- ortbRequest.user = { ext: { consent: bidderRequest.gdprConsent.consentString } };
- }
-}
-
-function nativeResponse(imp, bid) {
- if (imp['native']) {
- const nativeAd = parse(bid.adm);
- const keys = {};
- keys.image = {};
- keys.icon = {};
- if (nativeAd && nativeAd['native'] && nativeAd['native'].assets) {
- nativeAd['native'].assets.forEach(asset => {
- keys.title = asset.title ? asset.title.text : keys.title;
- keys.body = asset.data && asset.id === 2 ? asset.data.value : keys.body;
- keys.sponsoredBy = asset.data && asset.id === 3 ? asset.data.value : keys.sponsoredBy;
- keys.icon.url = asset.img && asset.id === 4 ? asset.img.url : keys.icon.url;
- keys.icon.width = asset.img && asset.id === 4 ? asset.img.w : keys.icon.width;
- keys.icon.height = asset.img && asset.id === 4 ? asset.img.h : keys.icon.height;
- keys.image.url = asset.img && asset.id === 5 ? asset.img.url : keys.image.url;
- keys.image.width = asset.img && asset.id === 5 ? asset.img.w : keys.image.width;
- keys.image.height = asset.img && asset.id === 5 ? asset.img.h : keys.image.height;
- });
- if (nativeAd['native'].link) {
- keys.clickUrl = encodeURIComponent(nativeAd['native'].link.url);
- }
- return keys;
- }
- }
- return null;
-}
-
-registerBidder(spec);
diff --git a/modules/winrBidAdapter.js b/modules/winrBidAdapter.js
new file mode 100644
index 00000000000..b73758e9717
--- /dev/null
+++ b/modules/winrBidAdapter.js
@@ -0,0 +1,614 @@
+import * as utils from '../src/utils.js';
+import { config } from '../src/config.js';
+import { registerBidder } from '../src/adapters/bidderFactory.js';
+import { BANNER } from '../src/mediaTypes.js';
+import find from 'core-js-pure/features/array/find.js';
+import includes from 'core-js-pure/features/array/includes.js';
+import { getStorageManager } from '../src/storageManager.js';
+
+export const storage = getStorageManager();
+
+const BIDDER_CODE = 'winr';
+const URL = 'https://ib.adnxs.com/ut/v3/prebid';
+const URL_SIMPLE = 'https://ib.adnxs-simple.com/ut/v3/prebid';
+const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language'];
+const APP_DEVICE_PARAMS = ['geo', 'device_id']; // appid is collected separately
+const SOURCE = 'pbjs';
+const DEFAULT_CURRENCY = 'USD';
+const GATE_COOKIE_NAME = 'wnr_gate';
+
+function buildBid(bidData) {
+ const bid = bidData;
+ const position = {
+ domParent: bid.meta.domParent ? `'${bid.meta.domParent}'` : null,
+ child: bid.meta.child ? bid.meta.child : 4
+ }
+ bid.ad = wrapAd(bid, position);
+ return bid;
+}
+
+function getMediaTypeFromBid(bid) {
+ return bid.mediaTypes && Object.keys(bid.mediaTypes)[0];
+}
+
+function wrapAd(bid, position) {
+ return `
+
+
+
+
+
+
+
+
+
+ `;
+}
+
+export const spec = {
+ code: BIDDER_CODE,
+ aliases: ['wnr'],
+ supportedMediaTypes: [BANNER],
+
+ /**
+ * Determines whether or not the given bid request is valid.
+ *
+ * @param {object} bid The bid to validate.
+ * @return boolean True if this is a valid bid, and false otherwise.
+ */
+ isBidRequestValid: function (bid) {
+ // Return false for each bid request if the media type is not 'banner'
+ if (getMediaTypeFromBid(bid) !== BANNER) {
+ return false;
+ }
+
+ // Return false for each bid request if the cookies disabled
+ if (!storage.cookiesAreEnabled()) {
+ return false;
+ }
+
+ // Return false for each bid request if the gate cookie is set
+ if (storage.getCookie(GATE_COOKIE_NAME) !== null) {
+ return false;
+ }
+
+ // Return false for each bid request if no placementId exists
+ if (!bid.params.placementId) {
+ return false;
+ }
+
+ return true;
+ },
+
+ /**
+ * Make a server request from the list of BidRequests.
+ *
+ * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server.
+ * @return ServerRequest Info describing the request to the server.
+ */
+ buildRequests: function (bidRequests, bidderRequest) {
+ const tags = bidRequests.map(bidToTag);
+ const userObjBid = find(bidRequests, hasUserInfo);
+ let userObj = {};
+ if (config.getConfig('coppa') === true) {
+ userObj = { 'coppa': true };
+ }
+
+ if (userObjBid) {
+ Object.keys(userObjBid.params.user)
+ .filter((param) => includes(USER_PARAMS, param))
+ .forEach((param) => {
+ let uparam = utils.convertCamelToUnderscore(param);
+ if (
+ param === 'segments' &&
+ utils.isArray(userObjBid.params.user[param])
+ ) {
+ let segs = [];
+ userObjBid.params.user[param].forEach((val) => {
+ if (utils.isNumber(val)) {
+ segs.push({ id: val });
+ } else if (utils.isPlainObject(val)) {
+ segs.push(val);
+ }
+ });
+ userObj[uparam] = segs;
+ } else if (param !== 'segments') {
+ userObj[uparam] = userObjBid.params.user[param];
+ }
+ });
+ }
+
+ const appDeviceObjBid = find(bidRequests, hasAppDeviceInfo);
+ let appDeviceObj;
+ if (appDeviceObjBid && appDeviceObjBid.params && appDeviceObjBid.params.app) {
+ appDeviceObj = {};
+ Object.keys(appDeviceObjBid.params.app)
+ .filter(param => includes(APP_DEVICE_PARAMS, param))
+ .forEach(param => appDeviceObj[param] = appDeviceObjBid.params.app[param]);
+ }
+
+ const appIdObjBid = find(bidRequests, hasAppId);
+ let appIdObj;
+ if (appIdObjBid && appIdObjBid.params && appDeviceObjBid.params.app && appDeviceObjBid.params.app.id) {
+ appIdObj = {
+ appid: appIdObjBid.params.app.id
+ };
+ }
+
+ const memberIdBid = find(bidRequests, hasMemberId);
+ const member = memberIdBid ? parseInt(memberIdBid.params.member, 10) : 0;
+ const schain = bidRequests[0].schain;
+
+ const payload = {
+ tags: [...tags],
+ user: userObj,
+ sdk: {
+ source: SOURCE,
+ version: '$prebid.version$',
+ },
+ schain: schain
+ };
+
+ if (member > 0) {
+ payload.member_id = member;
+ }
+
+ if (appDeviceObjBid) {
+ payload.device = appDeviceObj
+ }
+ if (appIdObjBid) {
+ payload.app = appIdObj;
+ }
+
+ if (bidderRequest && bidderRequest.gdprConsent) {
+ // note - objects for impbus use underscore instead of camelCase
+ payload.gdpr_consent = {
+ consent_string: bidderRequest.gdprConsent.consentString,
+ consent_required: bidderRequest.gdprConsent.gdprApplies,
+ };
+ }
+
+ if (bidderRequest && bidderRequest.uspConsent) {
+ payload.us_privacy = bidderRequest.uspConsent;
+ }
+
+ if (bidderRequest && bidderRequest.refererInfo) {
+ let refererinfo = {
+ rd_ref: encodeURIComponent(bidderRequest.refererInfo.referer),
+ rd_top: bidderRequest.refererInfo.reachedTop,
+ rd_ifs: bidderRequest.refererInfo.numIframes,
+ rd_stk: bidderRequest.refererInfo.stack
+ .map((url) => encodeURIComponent(url))
+ .join(','),
+ };
+ payload.referrer_detection = refererinfo;
+ }
+
+ if (bidRequests[0].userId) {
+ let eids = [];
+
+ addUserId(eids, utils.deepAccess(bidRequests[0], `userId.flocId.id`), 'chrome.com', null);
+ addUserId(eids, utils.deepAccess(bidRequests[0], `userId.criteoId`), 'criteo.com', null);
+ addUserId(eids, utils.deepAccess(bidRequests[0], `userId.netId`), 'netid.de', null);
+ addUserId(eids, utils.deepAccess(bidRequests[0], `userId.idl_env`), 'liveramp.com', null);
+ addUserId(eids, utils.deepAccess(bidRequests[0], `userId.tdid`), 'adserver.org', 'TDID');
+ addUserId(eids, utils.deepAccess(bidRequests[0], `userId.uid2.id`), 'uidapi.com', 'UID2');
+
+ if (eids.length) {
+ payload.eids = eids;
+ }
+ }
+
+ if (tags[0].publisher_id) {
+ payload.publisher_id = tags[0].publisher_id;
+ }
+
+ const request = formatRequest(payload, bidderRequest);
+ return request;
+ },
+
+ /**
+ * 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, { bidderRequest }) {
+ serverResponse = serverResponse.body;
+ const bids = [];
+ if (!serverResponse || serverResponse.error) {
+ let errorMessage = `in response for ${bidderRequest.bidderCode} adapter`;
+ if (serverResponse && serverResponse.error) {
+ errorMessage += `: ${serverResponse.error}`;
+ }
+ utils.logError(errorMessage);
+ return bids;
+ }
+
+ if (serverResponse.tags) {
+ serverResponse.tags.forEach((serverBid) => {
+ const rtbBid = getRtbBid(serverBid);
+ if (rtbBid) {
+ if (
+ rtbBid.cpm !== 0 &&
+ includes(this.supportedMediaTypes, rtbBid.ad_type)
+ ) {
+ const bid = newBid(serverBid, rtbBid, bidderRequest);
+ bid.mediaType = parseMediaType(rtbBid);
+ bids.push(bid);
+ }
+ }
+ });
+ }
+
+ return bids.map(bid => buildBid(bid));
+ },
+
+ getUserSyncs: function (syncOptions) {
+ if (syncOptions.iframeEnabled) {
+ return [
+ {
+ type: 'iframe',
+ url: 'https://acdn.adnxs.com/dmp/async_usersync.html',
+ },
+ ];
+ }
+ },
+
+ transformBidParams: function (params, isOpenRtb) {
+ params = utils.convertTypes(
+ {
+ member: 'string',
+ invCode: 'string',
+ placementId: 'number',
+ keywords: utils.transformBidderParamKeywords,
+ publisherId: 'number',
+ },
+ params
+ );
+
+ if (isOpenRtb) {
+ params.use_pmt_rule =
+ typeof params.usePaymentRule === 'boolean'
+ ? params.usePaymentRule
+ : false;
+ if (params.usePaymentRule) {
+ delete params.usePaymentRule;
+ }
+
+ if (isPopulatedArray(params.keywords)) {
+ params.keywords.forEach(deleteValues);
+ }
+
+ Object.keys(params).forEach((paramKey) => {
+ let convertedKey = utils.convertCamelToUnderscore(paramKey);
+ if (convertedKey !== paramKey) {
+ params[convertedKey] = params[paramKey];
+ delete params[paramKey];
+ }
+ });
+ }
+
+ return params;
+ },
+};
+
+function isPopulatedArray(arr) {
+ return !!(utils.isArray(arr) && arr.length > 0);
+}
+
+function deleteValues(keyPairObj) {
+ if (isPopulatedArray(keyPairObj.value) && keyPairObj.value[0] === '') {
+ delete keyPairObj.value;
+ }
+}
+
+function hasPurpose1Consent(bidderRequest) {
+ let result = true;
+ if (bidderRequest && bidderRequest.gdprConsent) {
+ if (
+ bidderRequest.gdprConsent.gdprApplies &&
+ bidderRequest.gdprConsent.apiVersion === 2
+ ) {
+ result = !!(
+ utils.deepAccess(
+ bidderRequest.gdprConsent,
+ 'vendorData.purpose.consents.1'
+ ) === true
+ );
+ }
+ }
+ return result;
+}
+
+function formatRequest(payload, bidderRequest) {
+ let request = [];
+ let options = {
+ withCredentials: true
+ };
+
+ let endpointUrl = URL;
+
+ if (!hasPurpose1Consent(bidderRequest)) {
+ endpointUrl = URL_SIMPLE;
+ }
+
+ if (
+ utils.getParameterByName('apn_test').toUpperCase() === 'TRUE' ||
+ config.getConfig('apn_test') === true
+ ) {
+ options.customHeaders = {
+ 'X-Is-Test': 1,
+ };
+ }
+
+ const payloadString = JSON.stringify(payload);
+ request = {
+ method: 'POST',
+ url: endpointUrl,
+ data: payloadString,
+ bidderRequest,
+ options,
+ };
+
+ return request;
+}
+
+/**
+ * Unpack the Server's Bid into a Prebid-compatible one.
+ * @param serverBid
+ * @param rtbBid
+ * @param bidderRequest
+ * @return Bid
+ */
+function newBid(serverBid, rtbBid, bidderRequest) {
+ const bidRequest = utils.getBidRequest(serverBid.uuid, [bidderRequest]);
+ const bid = {
+ adType: rtbBid.ad_type,
+ requestId: serverBid.uuid,
+ auctionId: bidRequest.auctionId,
+ cpm: rtbBid.cpm,
+ creativeId: rtbBid.creative_id,
+ brandCategoryId: rtbBid.brandCategoryId,
+ dealId: rtbBid.deal_id,
+ currency: DEFAULT_CURRENCY,
+ netRevenue: true,
+ ttl: 300,
+ source: rtbBid.content_source,
+ mediaSubtypeId: rtbBid.media_subtype_id,
+ mediaTypeId: rtbBid.media_type_id,
+ adUnitCode: bidRequest.adUnitCode,
+ buyerMemberId: rtbBid.buyer_member_id,
+ appnexus: {
+ buyerMemberId: rtbBid.buyer_member_id,
+ dealPriority: rtbBid.deal_priority,
+ dealCode: rtbBid.deal_code,
+ }
+ };
+
+ // WE DON'T FULLY SUPPORT THIS ATM - future spot for adomain code; creating a stub for 5.0 compliance
+ if (rtbBid.adomain) {
+ bid.meta = Object.assign({}, bid.meta, { advertiserDomains: [] });
+ }
+
+ if (rtbBid.advertiser_id) {
+ bid.meta = Object.assign({}, bid.meta, {
+ advertiserId: rtbBid.advertiser_id,
+ });
+ }
+
+ if (bidRequest.params) {
+ const { placementId, siteId, domParent, child } = bidRequest.params;
+ bid.meta = Object.assign({}, bid.meta, {
+ placementId: placementId,
+ siteId: siteId,
+ domParent: domParent,
+ child: child
+ });
+ }
+
+ Object.assign(bid, {
+ width: rtbBid.rtb.banner.width,
+ height: rtbBid.rtb.banner.height,
+ });
+
+ try {
+ if (rtbBid.rtb.banner && rtbBid.rtb.trackers) {
+ bid.banner = Object.assign({}, bid.banner, {
+ content: rtbBid.rtb.banner.content,
+ width: rtbBid.rtb.banner.width,
+ height: rtbBid.rtb.banner.height,
+ trackers: rtbBid.rtb.trackers,
+ });
+ }
+ } catch (error) {
+ utils.logError('Error assigning ad', error);
+ }
+ return bid;
+}
+
+function bidToTag(bid) {
+ const tag = {};
+ tag.sizes = transformSizes(bid.sizes);
+ tag.primary_size = tag.sizes[0];
+ tag.ad_types = [];
+ tag.uuid = bid.bidId;
+ if (bid.params.placementId) {
+ tag.id = parseInt(bid.params.placementId, 10);
+ } else {
+ tag.code = bid.params.invCode;
+ }
+ tag.allow_smaller_sizes = bid.params.allowSmallerSizes || false;
+ tag.use_pmt_rule = bid.params.usePaymentRule || false;
+ tag.prebid = true;
+ tag.disable_psa = true;
+ let bidFloor = getBidFloor(bid);
+ if (bidFloor) {
+ tag.reserve = bidFloor;
+ }
+ if (bid.params.trafficSourceCode) {
+ tag.traffic_source_code = bid.params.trafficSourceCode;
+ }
+ if (bid.params.privateSizes) {
+ tag.private_sizes = transformSizes(bid.params.privateSizes);
+ }
+ if (bid.params.pubClick) {
+ tag.pubclick = bid.params.pubClick;
+ }
+ if (bid.params.publisherId) {
+ tag.publisher_id = parseInt(bid.params.publisherId, 10);
+ }
+ if (bid.params.externalImpId) {
+ tag.external_imp_id = bid.params.externalImpId;
+ }
+ if (!utils.isEmpty(bid.params.keywords)) {
+ let keywords = utils.transformBidderParamKeywords(bid.params.keywords);
+
+ if (keywords.length > 0) {
+ keywords.forEach(deleteValues);
+ }
+ tag.keywords = keywords;
+ }
+
+ let gpid = utils.deepAccess(bid, 'ortb2Imp.ext.data.pbadslot');
+ if (gpid) {
+ tag.gpid = gpid;
+ }
+
+ tag.hb_source = 1;
+
+ if (tag.ad_types.length === 0) {
+ delete tag.ad_types;
+ }
+
+ return tag;
+}
+
+/* Turn bid request sizes into ut-compatible format */
+function transformSizes(requestSizes) {
+ let sizes = [];
+ let sizeObj = {};
+
+ if (
+ utils.isArray(requestSizes) &&
+ requestSizes.length === 2 &&
+ !utils.isArray(requestSizes[0])
+ ) {
+ sizeObj.width = parseInt(requestSizes[0], 10);
+ sizeObj.height = parseInt(requestSizes[1], 10);
+ sizes.push(sizeObj);
+ } else if (typeof requestSizes === 'object') {
+ for (let i = 0; i < requestSizes.length; i++) {
+ let size = requestSizes[i];
+ sizeObj = {};
+ sizeObj.width = parseInt(size[0], 10);
+ sizeObj.height = parseInt(size[1], 10);
+ sizes.push(sizeObj);
+ }
+ }
+
+ return sizes;
+}
+
+function hasUserInfo(bid) {
+ return !!bid.params.user;
+}
+
+function hasMemberId(bid) {
+ return !!parseInt(bid.params.member, 10);
+}
+
+function hasAppDeviceInfo(bid) {
+ if (bid.params) {
+ return !!bid.params.app
+ }
+}
+
+function hasAppId(bid) {
+ if (bid.params && bid.params.app) {
+ return !!bid.params.app.id
+ }
+ return !!bid.params.app
+}
+
+function getRtbBid(tag) {
+ return tag && tag.ads && tag.ads.length && find(tag.ads, (ad) => ad.rtb);
+}
+
+function parseMediaType(rtbBid) {
+ const adType = rtbBid.ad_type;
+ if (adType !== BANNER) {
+ return false;
+ }
+ return BANNER;
+}
+
+function addUserId(eids, id, source, rti) {
+ if (id) {
+ if (rti) {
+ eids.push({ source, id, rti_partner: rti });
+ } else {
+ eids.push({ source, id });
+ }
+ }
+ return eids;
+}
+
+function getBidFloor(bid) {
+ if (!utils.isFn(bid.getFloor)) {
+ return (bid.params.reserve) ? bid.params.reserve : null;
+ }
+
+ let floor = bid.getFloor({
+ currency: 'USD',
+ mediaType: '*',
+ size: '*'
+ });
+ if (utils.isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'USD') {
+ return floor.floor;
+ }
+ return null;
+}
+
+registerBidder(spec);
diff --git a/modules/winrBidAdapter.md b/modules/winrBidAdapter.md
new file mode 100644
index 00000000000..f9a73a6c0fa
--- /dev/null
+++ b/modules/winrBidAdapter.md
@@ -0,0 +1,546 @@
+# Overview
+
+```
+Module Name: WINR Corporation Bid Adapter
+Module Type: Bidder Adapter
+Maintainer: tech@winr.com.au
+```
+
+# Description
+
+WINR AdGate Bid Adaptor for Prebid.js.
+
+Connects to AppNexus exchange for bids.
+
+This bid adapter supports the Banner media type only.
+
+Please reach out to the WINR team before using this plugin to get `placementId`.
+
+`domParent` and `child` position settings are usually determined and remotely controlled for each publisher site by the WINR team. If you would prefer to have control over these settings, please get in touch.
+
+The code below returns a demo ad.
+
+# Test Parameters
+
+```js
+var adUnits = [
+ // Banner adUnit
+ {
+ code: "ad-unit",
+ mediaTypes: {
+ banner: {
+ sizes: [[1, 1]],
+ },
+ },
+ bids: [
+ {
+ bidder: "winr",
+ params: {
+ placementId: 21764100,
+ domParent: ".blog-post", // optional
+ child: 4, // optional
+ },
+ },
+ ],
+ },
+];
+```
+
+# Example page
+
+```html
+
+
+
+
+
+ Prebid.js Banner Example
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Title of a featured blog post
+
+ Multiple lines of text that form the lede, informing new readers
+ quickly and efficiently about what’s most interesting in this post’s
+ contents.
+
+
+ Continue reading...
+
+
+
+
+
+
+
From the Firehose
+
+
+
+ Sample blog post
+
+ January 1, 2021 by Mark
+
+
+
+ This blog post shows a few different types of content that’s
+ supported and styled with Bootstrap. Basic typography, images, and
+ code are all supported.
+
+
+
+ Yeah, she dances to her own beat. Oh, no. You could've been the
+ greatest. 'Cause, baby, you're a firework . Maybe a
+ reason why all the doors are closed. Open up your heart and just
+ let it begin. So très chic, yeah, she's a classic.
+
+
+
+ Bikinis, zucchinis, Martinis, no weenies. I know there will be
+ sacrifice but that's the price.
+ This is how we do it . I'm not sticking around
+ to watch you go down. You think you're so rock and roll, but
+ you're really just a joke. I know one spark will shock the
+ world, yeah yeah. Can't replace you with a million rings.
+
+
+
+ Trying to connect the dots, don't know what to tell my boss.
+ Before you met me I was alright but things were kinda heavy. You
+ just gotta ignite the light and let it shine. Glitter all over the
+ room pink flamingos in the pool.
+
+ Sub-heading
+
+ You got the finest architecture. Passport stamps, she's
+ cosmopolitan. Fine, fresh, fierce, we got it on lock. Never
+ planned that one day I'd be losing you. She eats your heart out.
+
+
+ Got a motel and built a fort out of sheets.
+ Your kiss is cosmic, every move is magic.
+ Suiting up for my crowning battle.
+
+
+ Takes you miles high, so high, 'cause she’s got that one
+ international smile.
+
+
+ Scared to rock the boat and make a mess.
+ I could have rewrite your addiction.
+ I know you get me so I let my walls come down.
+
+ After a hurricane comes a rainbow.
+
+
+
+
+
+
+
+
+
+
+
+
About
+
+ Saw you downtown singing the Blues. Watch you circle the drain.
+ Why don't you let me stop by? Heavy is the head that
+ wears the crown . Yes, we make angels cry, raining down on
+ earth from up above.
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+# Example page with GPT
+
+```html
+
+
+
+
+
+ Prebid.js Banner Example
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Title of a featured blog post
+
+ Multiple lines of text that form the lede, informing new readers
+ quickly and efficiently about what’s most interesting in this post’s
+ contents.
+
+
+ Continue reading...
+
+
+
+
+
+
+
From the Firehose
+
+
+
+ Sample blog post
+
+ January 1, 2021 by Mark
+
+
+
+ This blog post shows a few different types of content that’s
+ supported and styled with Bootstrap. Basic typography, images, and
+ code are all supported.
+
+
+
+ Yeah, she dances to her own beat. Oh, no. You could've been the
+ greatest. 'Cause, baby, you're a firework . Maybe a
+ reason why all the doors are closed. Open up your heart and just
+ let it begin. So très chic, yeah, she's a classic.
+
+
+
+ Bikinis, zucchinis, Martinis, no weenies. I know there will be
+ sacrifice but that's the price.
+ This is how we do it . I'm not sticking around
+ to watch you go down. You think you're so rock and roll, but
+ you're really just a joke. I know one spark will shock the
+ world, yeah yeah. Can't replace you with a million rings.
+
+
+
+ Trying to connect the dots, don't know what to tell my boss.
+ Before you met me I was alright but things were kinda heavy. You
+ just gotta ignite the light and let it shine. Glitter all over the
+ room pink flamingos in the pool.
+
+ Sub-heading
+
+ You got the finest architecture. Passport stamps, she's
+ cosmopolitan. Fine, fresh, fierce, we got it on lock. Never
+ planned that one day I'd be losing you. She eats your heart out.
+
+
+ Got a motel and built a fort out of sheets.
+ Your kiss is cosmic, every move is magic.
+ Suiting up for my crowning battle.
+
+
+ Takes you miles high, so high, 'cause she’s got that one
+ international smile.
+
+
+ Scared to rock the boat and make a mess.
+ I could have rewrite your addiction.
+ I know you get me so I let my walls come down.
+
+ After a hurricane comes a rainbow.
+
+
+
+
+
+
+
+
+
+
+
+
About
+
+ Saw you downtown singing the Blues. Watch you circle the drain.
+ Why don't you let me stop by? Heavy is the head that
+ wears the crown . Yes, we make angels cry, raining down on
+ earth from up above.
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
diff --git a/modules/wipesBidAdapter.js b/modules/wipesBidAdapter.js
deleted file mode 100644
index f381bcb68a0..00000000000
--- a/modules/wipesBidAdapter.js
+++ /dev/null
@@ -1,71 +0,0 @@
-import * as utils from '../src/utils.js';
-import {config} from '../src/config.js';
-import {registerBidder} from '../src/adapters/bidderFactory.js';
-import {BANNER} from '../src/mediaTypes.js';
-
-const BIDDER_CODE = 'wipes';
-const ALIAS_BIDDER_CODE = ['wi'];
-const SUPPORTED_MEDIA_TYPES = [BANNER]
-const ENDPOINT_URL = 'https://adn-srv.reckoner-api.com/v1/prebid';
-
-function isBidRequestValid(bid) {
- switch (true) {
- case !!(bid.params.asid):
- break;
- default:
- utils.logWarn(`isBidRequestValid Error. ${bid.params}, please check your implementation.`);
- return false;
- }
- return true;
-}
-
-function buildRequests(validBidRequests, bidderRequest) {
- return validBidRequests.map(bidRequest => {
- const bidId = bidRequest.bidId
- const params = bidRequest.params;
- const asid = params.asid;
- return {
- method: 'GET',
- url: ENDPOINT_URL,
- data: {
- asid: asid,
- bid_id: bidId,
- }
- }
- });
-}
-
-function interpretResponse(serverResponse, bidRequest) {
- const bidResponses = [];
- const response = serverResponse.body;
- const cpm = response.cpm || 0;
- if (cpm !== 0) {
- const netRevenue = (response.netRevenue === undefined) ? true : response.netRevenue;
- const bidResponse = {
- requestId: response.bid_id,
- cpm: cpm,
- width: response.width,
- height: response.height,
- creativeId: response.video_creative_id || 0,
- dealId: response.deal_id,
- currency: 'JPY',
- netRevenue: netRevenue,
- ttl: config.getConfig('_bidderTimeout'),
- referrer: bidRequest.data.r || '',
- mediaType: BANNER,
- ad: response.ad_tag,
- };
- bidResponses.push(bidResponse);
- }
- return bidResponses;
-}
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: ALIAS_BIDDER_CODE,
- isBidRequestValid,
- buildRequests,
- interpretResponse,
- supportedMediaTypes: SUPPORTED_MEDIA_TYPES
-}
-registerBidder(spec);
diff --git a/modules/xhbBidAdapter.js b/modules/xhbBidAdapter.js
deleted file mode 100644
index 9363eb97ddc..00000000000
--- a/modules/xhbBidAdapter.js
+++ /dev/null
@@ -1,457 +0,0 @@
-import { Renderer } from '../src/Renderer.js';
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
-import find from 'core-js-pure/features/array/find.js';
-import includes from 'core-js-pure/features/array/includes.js';
-
-const BIDDER_CODE = 'xhb';
-const URL = 'https://ib.adnxs.com/ut/v3/prebid';
-const VIDEO_TARGETING = ['id', 'mimes', 'minduration', 'maxduration',
- 'startdelay', 'skippable', 'playback_method', 'frameworks'];
-const USER_PARAMS = ['age', 'external_uid', 'segments', 'gender', 'dnt', 'language'];
-const NATIVE_MAPPING = {
- body: 'description',
- cta: 'ctatext',
- image: {
- serverName: 'main_image',
- requiredParams: { required: true },
- minimumParams: { sizes: [{}] },
- },
- icon: {
- serverName: 'icon',
- requiredParams: { required: true },
- minimumParams: { sizes: [{}] },
- },
- sponsoredBy: 'sponsored_by',
-};
-const SOURCE = 'pbjs';
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: [],
- supportedMediaTypes: [BANNER, VIDEO, NATIVE],
-
- /**
- * Determines whether or not the given bid request is valid.
- *
- * @param {object} bid The bid to validate.
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: function(bid) {
- return !!(bid.params.placementId || (bid.params.member && bid.params.invCode));
- },
-
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server.
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: function(bidRequests, bidderRequest) {
- const tags = bidRequests.map(bidToTag);
- const userObjBid = find(bidRequests, hasUserInfo);
- let userObj;
- if (userObjBid) {
- userObj = {};
- Object.keys(userObjBid.params.user)
- .filter(param => includes(USER_PARAMS, param))
- .forEach(param => userObj[param] = userObjBid.params.user[param]);
- }
-
- const memberIdBid = find(bidRequests, hasMemberId);
- const member = memberIdBid ? parseInt(memberIdBid.params.member, 10) : 0;
-
- const payload = {
- tags: [...tags],
- user: userObj,
- sdk: {
- source: SOURCE,
- version: '$prebid.version$'
- }
- };
- if (member > 0) {
- payload.member_id = member;
- }
-
- if (bidderRequest && bidderRequest.gdprConsent) {
- // note - objects for impbus use underscore instead of camelCase
- payload.gdpr_consent = {
- consent_string: bidderRequest.gdprConsent.consentString,
- consent_required: bidderRequest.gdprConsent.gdprApplies
- };
- }
-
- const payloadString = JSON.stringify(payload);
- return {
- method: 'POST',
- url: URL,
- data: payloadString,
- bidderRequest
- };
- },
-
- /**
- * 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, {bidderRequest}) {
- serverResponse = serverResponse.body;
- const bids = [];
- if (!serverResponse || serverResponse.error) {
- let errorMessage = `in response for ${bidderRequest.bidderCode} adapter`;
- if (serverResponse && serverResponse.error) { errorMessage += `: ${serverResponse.error}`; }
- utils.logError(errorMessage);
- return bids;
- }
-
- if (serverResponse.tags) {
- serverResponse.tags.forEach(serverBid => {
- const rtbBid = getRtbBid(serverBid);
- if (rtbBid) {
- if (rtbBid.cpm !== 0 && includes(this.supportedMediaTypes, rtbBid.ad_type)) {
- const bid = newBid(serverBid, rtbBid, bidderRequest);
- bid.mediaType = parseMediaType(rtbBid);
- bids.push(bid);
- }
- }
- });
- }
- return bids;
- },
-
- getUserSyncs: function(syncOptions) {
- if (syncOptions.iframeEnabled) {
- return [{
- type: 'iframe',
- url: 'https://acdn.adnxs.com/dmp/async_usersync.html'
- }];
- }
- }
-};
-
-function newRenderer(adUnitCode, rtbBid, rendererOptions = {}) {
- const renderer = Renderer.install({
- id: rtbBid.renderer_id,
- url: rtbBid.renderer_url,
- config: rendererOptions,
- loaded: false,
- });
-
- try {
- renderer.setRender(outstreamRender);
- } catch (err) {
- utils.logWarn('Prebid Error calling setRender on renderer', err);
- }
-
- renderer.setEventHandlers({
- impression: () => utils.logMessage('xhb outstream video impression event'),
- loaded: () => utils.logMessage('xhb outstream video loaded event'),
- ended: () => {
- utils.logMessage('xhb outstream renderer video event');
- document.querySelector(`#${adUnitCode}`).style.display = 'none';
- }
- });
- return renderer;
-}
-
-/* Turn keywords parameter into ut-compatible format */
-function getKeywords(keywords) {
- let arrs = [];
-
- utils._each(keywords, (v, k) => {
- if (utils.isArray(v)) {
- let values = [];
- utils._each(v, (val) => {
- val = utils.getValueString('keywords.' + k, val);
- if (val) { values.push(val); }
- });
- v = values;
- } else {
- v = utils.getValueString('keywords.' + k, v);
- if (utils.isStr(v)) {
- v = [v];
- } else {
- return;
- } // unsuported types - don't send a key
- }
- arrs.push({key: k, value: v});
- });
-
- return arrs;
-}
-
-/**
- * Unpack the Server's Bid into a Prebid-compatible one.
- * @param serverBid
- * @param rtbBid
- * @param bidderRequest
- * @return Bid
- */
-function newBid(serverBid, rtbBid, bidderRequest) {
- const bid = {
- requestId: serverBid.uuid,
- cpm: 0.00,
- creativeId: rtbBid.creative_id,
- dealId: 99999999,
- currency: 'USD',
- netRevenue: true,
- ttl: 300,
- appnexus: {
- buyerMemberId: rtbBid.buyer_member_id
- }
- };
-
- if (rtbBid.rtb.video) {
- Object.assign(bid, {
- width: rtbBid.rtb.video.player_width,
- height: rtbBid.rtb.video.player_height,
- vastUrl: rtbBid.rtb.video.asset_url,
- vastImpUrl: rtbBid.notify_url,
- ttl: 3600
- });
- // This supports Outstream Video
- if (rtbBid.renderer_url) {
- const rendererOptions = utils.deepAccess(
- bidderRequest.bids[0],
- 'renderer.options'
- );
-
- Object.assign(bid, {
- adResponse: serverBid,
- renderer: newRenderer(bid.adUnitCode, rtbBid, rendererOptions)
- });
- bid.adResponse.ad = bid.adResponse.ads[0];
- bid.adResponse.ad.video = bid.adResponse.ad.rtb.video;
- }
- } else if (rtbBid.rtb[NATIVE]) {
- const nativeAd = rtbBid.rtb[NATIVE];
- bid[NATIVE] = {
- title: nativeAd.title,
- body: nativeAd.desc,
- cta: nativeAd.ctatext,
- sponsoredBy: nativeAd.sponsored,
- clickUrl: nativeAd.link.url,
- clickTrackers: nativeAd.link.click_trackers,
- impressionTrackers: nativeAd.impression_trackers,
- javascriptTrackers: nativeAd.javascript_trackers,
- };
- if (nativeAd.main_img) {
- bid['native'].image = {
- url: nativeAd.main_img.url,
- height: nativeAd.main_img.height,
- width: nativeAd.main_img.width,
- };
- }
- if (nativeAd.icon) {
- bid['native'].icon = {
- url: nativeAd.icon.url,
- height: nativeAd.icon.height,
- width: nativeAd.icon.width,
- };
- }
- } else {
- Object.assign(bid, {
- width: rtbBid.rtb.banner.width,
- height: rtbBid.rtb.banner.height,
- ad: rtbBid.rtb.banner.content
- });
- try {
- const url = rtbBid.rtb.trackers[0].impression_urls[0];
- const tracker = utils.createTrackPixelHtml(url);
- bid.ad += tracker;
- } catch (error) {
- utils.logError('Error appending tracking pixel', error);
- }
- }
-
- return bid;
-}
-
-function bidToTag(bid) {
- const tag = {};
- tag.sizes = transformSizes(bid.sizes);
- tag.primary_size = tag.sizes[0];
- tag.ad_types = [];
- tag.uuid = bid.bidId;
- if (bid.params.placementId) {
- tag.id = parseInt(bid.params.placementId, 10);
- } else {
- tag.code = bid.params.invCode;
- }
- tag.allow_smaller_sizes = bid.params.allowSmallerSizes || false;
- tag.use_pmt_rule = bid.params.usePaymentRule || false;
- tag.prebid = true;
- tag.disable_psa = true;
- if (bid.params.reserve) {
- tag.reserve = bid.params.reserve;
- }
- if (bid.params.position) {
- tag.position = {'above': 1, 'below': 2}[bid.params.position] || 0;
- }
- if (bid.params.trafficSourceCode) {
- tag.traffic_source_code = bid.params.trafficSourceCode;
- }
- if (bid.params.privateSizes) {
- tag.private_sizes = transformSizes(bid.params.privateSizes);
- }
- if (bid.params.supplyType) {
- tag.supply_type = bid.params.supplyType;
- }
- if (bid.params.pubClick) {
- tag.pubclick = bid.params.pubClick;
- }
- if (bid.params.extInvCode) {
- tag.ext_inv_code = bid.params.extInvCode;
- }
- if (bid.params.externalImpId) {
- tag.external_imp_id = bid.params.externalImpId;
- }
- if (!utils.isEmpty(bid.params.keywords)) {
- tag.keywords = getKeywords(bid.params.keywords);
- }
-
- if (bid.mediaType === NATIVE || utils.deepAccess(bid, `mediaTypes.${NATIVE}`)) {
- tag.ad_types.push(NATIVE);
-
- if (bid.nativeParams) {
- const nativeRequest = buildNativeRequest(bid.nativeParams);
- tag[NATIVE] = {layouts: [nativeRequest]};
- }
- }
-
- const videoMediaType = utils.deepAccess(bid, `mediaTypes.${VIDEO}`);
- const context = utils.deepAccess(bid, 'mediaTypes.video.context');
-
- if (bid.mediaType === VIDEO || videoMediaType) {
- tag.ad_types.push(VIDEO);
- }
-
- // instream gets vastUrl, outstream gets vastXml
- if (bid.mediaType === VIDEO || (videoMediaType && context !== 'outstream')) {
- tag.require_asset_url = true;
- }
-
- if (bid.params.video) {
- tag.video = {};
- // place any valid video params on the tag
- Object.keys(bid.params.video)
- .filter(param => includes(VIDEO_TARGETING, param))
- .forEach(param => tag.video[param] = bid.params.video[param]);
- }
-
- if (
- (utils.isEmpty(bid.mediaType) && utils.isEmpty(bid.mediaTypes)) ||
- (bid.mediaType === BANNER || (bid.mediaTypes && bid.mediaTypes[BANNER]))
- ) {
- tag.ad_types.push(BANNER);
- }
-
- return tag;
-}
-
-/* Turn bid request sizes into ut-compatible format */
-function transformSizes(requestSizes) {
- let sizes = [];
- let sizeObj = {};
-
- if (utils.isArray(requestSizes) && requestSizes.length === 2 &&
- !utils.isArray(requestSizes[0])) {
- sizeObj.width = parseInt(requestSizes[0], 10);
- sizeObj.height = parseInt(requestSizes[1], 10);
- sizes.push(sizeObj);
- } else if (typeof requestSizes === 'object') {
- for (let i = 0; i < requestSizes.length; i++) {
- let size = requestSizes[i];
- sizeObj = {};
- sizeObj.width = parseInt(size[0], 10);
- sizeObj.height = parseInt(size[1], 10);
- sizes.push(sizeObj);
- }
- }
-
- return sizes;
-}
-
-function hasUserInfo(bid) {
- return !!bid.params.user;
-}
-
-function hasMemberId(bid) {
- return !!parseInt(bid.params.member, 10);
-}
-
-function getRtbBid(tag) {
- return tag && tag.ads && tag.ads.length && find(tag.ads, ad => ad.rtb);
-}
-
-function buildNativeRequest(params) {
- const request = {};
-
- // map standard prebid native asset identifier to /ut parameters
- // e.g., tag specifies `body` but /ut only knows `description`.
- // mapping may be in form {tag: ''} or
- // {tag: {serverName: '', requiredParams: {...}}}
- Object.keys(params).forEach(key => {
- // check if one of the forms is used, otherwise
- // a mapping wasn't specified so pass the key straight through
- const requestKey =
- (NATIVE_MAPPING[key] && NATIVE_MAPPING[key].serverName) ||
- NATIVE_MAPPING[key] ||
- key;
-
- // required params are always passed on request
- const requiredParams = NATIVE_MAPPING[key] && NATIVE_MAPPING[key].requiredParams;
- request[requestKey] = Object.assign({}, requiredParams, params[key]);
-
- // minimum params are passed if no non-required params given on adunit
- const minimumParams = NATIVE_MAPPING[key] && NATIVE_MAPPING[key].minimumParams;
-
- if (requiredParams && minimumParams) {
- // subtract required keys from adunit keys
- const adunitKeys = Object.keys(params[key]);
- const requiredKeys = Object.keys(requiredParams);
- const remaining = adunitKeys.filter(key => !includes(requiredKeys, key));
-
- // if none are left over, the minimum params needs to be sent
- if (remaining.length === 0) {
- request[requestKey] = Object.assign({}, request[requestKey], minimumParams);
- }
- }
- });
-
- return request;
-}
-
-function outstreamRender(bid) {
- // push to render queue because ANOutstreamVideo may not be loaded yet
- bid.renderer.push(() => {
- window.ANOutstreamVideo.renderAd({
- tagId: bid.adResponse.tag_id,
- sizes: [bid.getSize().split('x')],
- targetId: bid.adUnitCode, // target div id to render video
- uuid: bid.adResponse.uuid,
- adResponse: bid.adResponse,
- rendererOptions: bid.renderer.getConfig()
- }, handleOutstreamRendererEvents.bind(null, bid));
- });
-}
-
-function handleOutstreamRendererEvents(bid, id, eventName) {
- bid.renderer.handleVideoEvent({ id, eventName });
-}
-
-function parseMediaType(rtbBid) {
- const adType = rtbBid.ad_type;
- if (adType === VIDEO) {
- return VIDEO;
- } else if (adType === NATIVE) {
- return NATIVE;
- } else {
- return BANNER;
- }
-}
-
-registerBidder(spec);
diff --git a/modules/yieldlabBidAdapter.js b/modules/yieldlabBidAdapter.js
index 9c1c54cfb2b..c05ecbc15fc 100644
--- a/modules/yieldlabBidAdapter.js
+++ b/modules/yieldlabBidAdapter.js
@@ -9,9 +9,11 @@ const BIDDER_CODE = 'yieldlab'
const BID_RESPONSE_TTL_SEC = 300
const CURRENCY_CODE = 'EUR'
const OUTSTREAMPLAYER_URL = 'https://ad.adition.com/dynamic.ad?a=o193092&ma_loadEvent=ma-start-event'
+const GVLID = 70
export const spec = {
code: BIDDER_CODE,
+ gvlid: GVLID,
supportedMediaTypes: [VIDEO, BANNER],
isBidRequestValid: function (bid) {
@@ -102,6 +104,7 @@ export const spec = {
const adType = matchedBid.adtype !== undefined ? matchedBid.adtype : ''
const gdprApplies = reqParams.gdpr ? '&gdpr=' + reqParams.gdpr : ''
const gdprConsent = reqParams.consent ? '&consent=' + reqParams.consent : ''
+ const pvId = matchedBid.pvid !== undefined ? '&pvid=' + matchedBid.pvid : ''
const bidResponse = {
requestId: bidRequest.bidId,
@@ -114,7 +117,10 @@ export const spec = {
netRevenue: false,
ttl: BID_RESPONSE_TTL_SEC,
referrer: '',
- ad: ``
+ ad: ``,
+ meta: {
+ advertiserDomains: (matchedBid.advertiser) ? matchedBid.advertiser : 'n/a'
+ }
}
if (isVideo(bidRequest, adType)) {
@@ -124,7 +130,7 @@ export const spec = {
bidResponse.height = playersize[1]
}
bidResponse.mediaType = VIDEO
- bidResponse.vastUrl = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}`
+ bidResponse.vastUrl = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}`
if (isOutstream(bidRequest)) {
const renderer = Renderer.install({
id: bidRequest.bidId,
diff --git a/modules/yieldliftBidAdapter.js b/modules/yieldliftBidAdapter.js
index 87a598bd335..9398e2c7816 100644
--- a/modules/yieldliftBidAdapter.js
+++ b/modules/yieldliftBidAdapter.js
@@ -96,6 +96,9 @@ export const spec = {
creativeId: bid.crid,
netRevenue: DEFAULT_NET_REVENUE,
currency: DEFAULT_CURRENCY,
+ meta: {
+ adomain: bid.adomain
+ }
})
})
} else {
diff --git a/modules/yieldmoBidAdapter.js b/modules/yieldmoBidAdapter.js
index 36f93f60c9e..654e7236210 100644
--- a/modules/yieldmoBidAdapter.js
+++ b/modules/yieldmoBidAdapter.js
@@ -12,8 +12,8 @@ const NET_REVENUE = true;
const BANNER_SERVER_ENDPOINT = 'https://ads.yieldmo.com/exchange/prebid';
const VIDEO_SERVER_ENDPOINT = 'https://ads.yieldmo.com/exchange/prebidvideo';
const OUTSTREAM_VIDEO_PLAYER_URL = 'https://prebid-outstream.yieldmo.com/bundle.js';
-const OPENRTB_VIDEO_BIDPARAMS = ['placement', 'startdelay', 'skipafter',
- 'protocols', 'api', 'playbackmethod', 'maxduration', 'minduration', 'pos'];
+const OPENRTB_VIDEO_BIDPARAMS = ['mimes', 'startdelay', 'placement', 'startdelay', 'skipafter', 'protocols', 'api',
+ 'playbackmethod', 'maxduration', 'minduration', 'pos', 'skip', 'skippable'];
const OPENRTB_VIDEO_SITEPARAMS = ['name', 'domain', 'cat', 'keywords'];
const LOCAL_WINDOW = utils.getWindowTop();
const DEFAULT_PLAYBACK_METHOD = 2;
@@ -93,6 +93,9 @@ export const spec = {
if (request.schain) {
serverRequest.schain = JSON.stringify(request.schain);
}
+ if (utils.deepAccess(request, 'params.lr_env')) {
+ serverRequest.ats_envelope = request.params.lr_env;
+ }
});
serverRequest.p = '[' + serverRequest.p.toString() + ']';
@@ -322,7 +325,8 @@ function openRtbRequest(bidRequests, bidderRequest) {
bcat: bidRequests[0].params.bcat || [],
ext: {
prebid: '$prebid.version$',
- }
+ },
+ ats_envelope: bidRequests[0].params.lr_env,
};
populateOpenRtbGdpr(openRtbRequest, bidderRequest);
@@ -335,7 +339,6 @@ function openRtbRequest(bidRequests, bidderRequest) {
* @return Object OpenRTB's 'imp' (impression) object
*/
function openRtbImpression(bidRequest) {
- const videoReq = utils.deepAccess(bidRequest, 'mediaTypes.video');
const size = extractPlayerSize(bidRequest);
const imp = {
id: bidRequest.bidId,
@@ -347,23 +350,27 @@ function openRtbImpression(bidRequest) {
video: {
w: size[0],
h: size[1],
- mimes: videoReq.mimes,
linearity: 1
}
};
+ const mediaTypesParams = utils.deepAccess(bidRequest, 'mediaTypes.video');
+ Object.keys(mediaTypesParams)
+ .filter(param => includes(OPENRTB_VIDEO_BIDPARAMS, param))
+ .forEach(param => imp.video[param] = mediaTypesParams[param]);
+
const videoParams = utils.deepAccess(bidRequest, 'params.video');
Object.keys(videoParams)
.filter(param => includes(OPENRTB_VIDEO_BIDPARAMS, param))
.forEach(param => imp.video[param] = videoParams[param]);
- if (videoParams.skippable) imp.video.skip = 1;
- if (videoParams.placement !== 1) {
- imp.video = {
- ...imp.video,
- startdelay: DEFAULT_START_DELAY,
- playbackmethod: [ DEFAULT_PLAYBACK_METHOD ]
- }
+ if (imp.video.skippable) {
+ imp.video.skip = 1;
+ delete imp.video.skippable;
+ }
+ if (imp.video.placement !== 1) {
+ imp.video.startdelay = DEFAULT_START_DELAY;
+ imp.video.playbackmethod = [ DEFAULT_PLAYBACK_METHOD ];
}
return imp;
}
@@ -476,51 +483,68 @@ function validateVideoParams(bid) {
const isDefined = val => typeof val !== 'undefined';
const validate = (fieldPath, validateCb, errorCb, errorCbParam) => {
- const value = utils.deepAccess(bid, fieldPath);
- if (!validateCb(value)) {
- errorCb(fieldPath, value, errorCbParam);
+ if (fieldPath.indexOf('video') === 0) {
+ const valueFieldPath = 'params.' + fieldPath;
+ const mediaFieldPath = 'mediaTypes.' + fieldPath;
+ const valueParams = utils.deepAccess(bid, valueFieldPath);
+ const mediaTypesParams = utils.deepAccess(bid, mediaFieldPath);
+ const hasValidValueParams = validateCb(valueParams);
+ const hasValidMediaTypesParams = validateCb(mediaTypesParams);
+
+ if (hasValidValueParams) return valueParams;
+ else if (hasValidMediaTypesParams) return hasValidMediaTypesParams;
+ else {
+ if (!hasValidValueParams) errorCb(valueFieldPath, valueParams, errorCbParam);
+ else if (!hasValidMediaTypesParams) errorCb(mediaFieldPath, mediaTypesParams, errorCbParam);
+ }
+ return valueParams || mediaTypesParams;
+ } else {
+ const value = utils.deepAccess(bid, fieldPath);
+ if (!validateCb(value)) {
+ errorCb(fieldPath, value, errorCbParam);
+ }
+ return value;
}
- return value;
}
try {
+ validate('video.context', val => !utils.isEmpty(val), paramRequired);
+
validate('params.placementId', val => !utils.isEmpty(val), paramRequired);
- validate('mediaTypes.video.playerSize', val => utils.isArrayOfNums(val, 2) ||
+ validate('video.playerSize', val => utils.isArrayOfNums(val, 2) ||
(utils.isArray(val) && val.every(v => utils.isArrayOfNums(v, 2))),
paramInvalid, 'array of 2 integers, ex: [640,480] or [[640,480]]');
- validate('mediaTypes.video.mimes', val => isDefined(val), paramRequired);
- validate('mediaTypes.video.mimes', val => utils.isArray(val) && val.every(v => utils.isStr(v)), paramInvalid,
+ validate('video.mimes', val => isDefined(val), paramRequired);
+ validate('video.mimes', val => utils.isArray(val) && val.every(v => utils.isStr(v)), paramInvalid,
'array of strings, ex: ["video/mp4"]');
- validate('params.video', val => !utils.isEmpty(val), paramRequired);
-
- const placement = validate('params.video.placement', val => isDefined(val), paramRequired);
- validate('params.video.placement', val => val >= 1 && val <= 5, paramInvalid);
+ const placement = validate('video.placement', val => isDefined(val), paramRequired);
+ validate('video.placement', val => val >= 1 && val <= 5, paramInvalid);
if (placement === 1) {
- validate('params.video.startdelay', val => isDefined(val),
+ validate('video.startdelay', val => isDefined(val),
(field, v) => paramRequired(field, v, 'placement == 1'));
- validate('params.video.startdelay', val => utils.isNumber(val), paramInvalid, 'number, ex: 5');
+ validate('video.startdelay', val => utils.isNumber(val), paramInvalid, 'number, ex: 5');
}
- validate('params.video.protocols', val => isDefined(val), paramRequired);
- validate('params.video.protocols', val => utils.isArrayOfNums(val) && val.every(v => (v >= 1 && v <= 6)),
+ validate('video.protocols', val => isDefined(val), paramRequired);
+ validate('video.protocols', val => utils.isArrayOfNums(val) && val.every(v => (v >= 1 && v <= 6)),
paramInvalid, 'array of numbers, ex: [2,3]');
- validate('params.video.api', val => isDefined(val), paramRequired);
- validate('params.video.api', val => utils.isArrayOfNums(val) && val.every(v => (v >= 1 && v <= 6)),
+ validate('video.api', val => isDefined(val), paramRequired);
+ validate('video.api', val => utils.isArrayOfNums(val) && val.every(v => (v >= 1 && v <= 6)),
paramInvalid, 'array of numbers, ex: [2,3]');
- validate('params.video.playbackmethod', val => !isDefined(val) || utils.isArrayOfNums(val), paramInvalid,
+ validate('video.playbackmethod', val => !isDefined(val) || utils.isArrayOfNums(val), paramInvalid,
'array of integers, ex: [2,6]');
- validate('params.video.maxduration', val => isDefined(val), paramRequired);
- validate('params.video.maxduration', val => utils.isInteger(val), paramInvalid);
- validate('params.video.minduration', val => !isDefined(val) || utils.isNumber(val), paramInvalid);
- validate('params.video.skippable', val => !isDefined(val) || utils.isBoolean(val), paramInvalid);
- validate('params.video.skipafter', val => !isDefined(val) || utils.isNumber(val), paramInvalid);
- validate('params.video.pos', val => !isDefined(val) || utils.isNumber(val), paramInvalid);
+ validate('video.maxduration', val => isDefined(val), paramRequired);
+ validate('video.maxduration', val => utils.isInteger(val), paramInvalid);
+ validate('video.minduration', val => !isDefined(val) || utils.isNumber(val), paramInvalid);
+ validate('video.skippable', val => !isDefined(val) || utils.isBoolean(val), paramInvalid);
+ validate('video.skipafter', val => !isDefined(val) || utils.isNumber(val), paramInvalid);
+ validate('video.pos', val => !isDefined(val) || utils.isNumber(val), paramInvalid);
validate('params.badv', val => !isDefined(val) || utils.isArray(val), paramInvalid,
'array of strings, ex: ["ford.com","pepsi.com"]');
validate('params.bcat', val => !isDefined(val) || utils.isArray(val), paramInvalid,
diff --git a/modules/yieldmoBidAdapter.md b/modules/yieldmoBidAdapter.md
index 54be295a1a1..c98e2ab5c74 100644
--- a/modules/yieldmoBidAdapter.md
+++ b/modules/yieldmoBidAdapter.md
@@ -29,8 +29,9 @@ var adUnits = [{ // Banner adUnit
bids: [{
bidder: 'yieldmo',
params: {
- placementId: '1779781193098233305', // string with at most 19 characters (may include numbers only)
- bidFloor: .28 // optional param
+ placementId: '1779781193098233305', // string with at most 19 characters (may include numbers only)
+ bidFloor: .28, // optional param
+ lr_env: '***' // Optional. Live Ramp ATS envelope
}
}]
}];
@@ -64,7 +65,8 @@ var adUnits = [{ // Video adUnit
playbackmethod: [2,6], // required, array of integers
skippable: true, // optional, boolean
skipafter: 10 // optional, integer
- }
+ },
+ lr_env: '***' // Optional. Live Ramp ATS envelope
}
}]
}];
@@ -91,8 +93,14 @@ var videoAdUnit = [{
protocols: [2, 3], // required, array of integers
api: [2, 3], // required, array of integers
playbackmethod: [1,2] // required, array of integers
- }
+ },
+ lr_env: '***' // Optional. Live Ramp ATS envelope
}
}]
}];
```
+
+Please also note, that we support the following OpenRTB params:
+'mimes', 'startdelay', 'placement', 'startdelay', 'skipafter', 'protocols', 'api',
+'playbackmethod', 'maxduration', 'minduration', 'pos', 'skip', 'skippable'.
+They can be specified in `mediaTypes.video` or in `bids[].params.video`.
diff --git a/modules/yieldoneBidAdapter.js b/modules/yieldoneBidAdapter.js
index 574967db291..73c3d2e8808 100644
--- a/modules/yieldoneBidAdapter.js
+++ b/modules/yieldoneBidAdapter.js
@@ -52,6 +52,12 @@ export const spec = {
payload.h = size.split('x')[1];
}
+ // LiveRampID
+ const idlEnv = utils.deepAccess(bidRequest, 'userId.idl_env');
+ if (utils.isStr(idlEnv) && !utils.isEmpty(idlEnv)) {
+ payload.lr_env = idlEnv;
+ }
+
return {
method: 'GET',
url: ENDPOINT_URL,
@@ -82,7 +88,10 @@ export const spec = {
currency: currency,
netRevenue: netRevenue,
ttl: config.getConfig('_bidderTimeout'),
- referrer: referrer
+ referrer: referrer,
+ meta: {
+ advertiserDomains: response.adomain ? response.adomain : []
+ },
};
if (response.adTag && renderId === 'ViewableRendering') {
diff --git a/modules/zedoBidAdapter.js b/modules/zedoBidAdapter.js
deleted file mode 100644
index e75b9c82065..00000000000
--- a/modules/zedoBidAdapter.js
+++ /dev/null
@@ -1,342 +0,0 @@
-import * as utils from '../src/utils.js';
-import { registerBidder } from '../src/adapters/bidderFactory.js';
-import { BANNER, VIDEO } from '../src/mediaTypes.js';
-import find from 'core-js-pure/features/array/find';
-import { Renderer } from '../src/Renderer.js';
-import { getRefererInfo } from '../src/refererDetection.js';
-
-const BIDDER_CODE = 'zedo';
-const SECURE_URL = 'https://saxp.zedo.com/asw/fmh.json';
-const DIM_TYPE = {
- '7': 'display',
- '9': 'display',
- '14': 'display',
- '70': 'SBR',
- '83': 'CurtainRaiser',
- '85': 'Inarticle',
- '86': 'pswipeup',
- '88': 'Inview',
- '100': 'display',
- '101': 'display',
- '102': 'display',
- '103': 'display'
- // '85': 'pre-mid-post-roll',
-};
-const SECURE_EVENT_PIXEL_URL = 'tt1.zedo.com/log/p.gif';
-
-export const spec = {
- code: BIDDER_CODE,
- aliases: [],
- supportedMediaTypes: [BANNER, VIDEO],
-
- /**
- * Determines whether or not the given bid request is valid.
- *
- * @param {object} bid The bid to validate.
- * @return boolean True if this is a valid bid, and false otherwise.
- */
- isBidRequestValid: function (bid) {
- return !!(bid.params && bid.params.channelCode && bid.params.dimId);
- },
-
- /**
- * Make a server request from the list of BidRequests.
- *
- * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server.
- * @return ServerRequest Info describing the request to the server.
- */
- buildRequests: function (bidRequests, bidderRequest) {
- let data = {
- placements: []
- };
- bidRequests.map(bidRequest => {
- let channelCode = parseInt(bidRequest.params.channelCode);
- let network = parseInt(channelCode / 1000000);
- let channel = channelCode % 1000000;
- let dim = getSizes(bidRequest.sizes);
- let placement = {
- id: bidRequest.bidId,
- network: network,
- channel: channel,
- publisher: bidRequest.params.pubId ? bidRequest.params.pubId : 0,
- width: dim[0],
- height: dim[1],
- dimension: bidRequest.params.dimId,
- version: '$prebid.version$',
- keyword: '',
- transactionId: bidRequest.transactionId
- }
- if (bidderRequest && bidderRequest.gdprConsent) {
- if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') {
- data.gdpr = Number(bidderRequest.gdprConsent.gdprApplies);
- }
- data.gdpr_consent = bidderRequest.gdprConsent.consentString;
- }
- // Add CCPA consent string
- if (bidderRequest && bidderRequest.uspConsent) {
- data.usp = bidderRequest.uspConsent;
- }
-
- let dimType = DIM_TYPE[String(bidRequest.params.dimId)]
- if (dimType) {
- placement['renderers'] = [{
- 'name': dimType
- }]
- } else { // default to display
- placement['renderers'] = [{
- 'name': 'display'
- }]
- }
- data['placements'].push(placement);
- });
- // adding schain object
- if (bidRequests[0].schain) {
- data['supplyChain'] = getSupplyChain(bidRequests[0].schain);
- }
- return {
- method: 'GET',
- url: SECURE_URL,
- data: 'g=' + JSON.stringify(data)
- }
- },
-
- /**
- * 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) {
- serverResponse = serverResponse.body;
- const bids = [];
- if (!serverResponse || serverResponse.error) {
- let errorMessage = `in response for ${request.bidderCode} adapter`;
- if (serverResponse && serverResponse.error) { errorMessage += `: ${serverResponse.error}`; }
- utils.logError(errorMessage);
- return bids;
- }
-
- if (serverResponse.ad) {
- serverResponse.ad.forEach(ad => {
- const creativeBid = getCreative(ad);
- if (creativeBid) {
- if (parseInt(creativeBid.cpm) !== 0) {
- const bid = newBid(ad, creativeBid, request);
- bid.mediaType = parseMediaType(creativeBid);
- bids.push(bid);
- }
- }
- });
- }
- return bids;
- },
-
- getUserSyncs: function (syncOptions, responses, gdprConsent) {
- if (syncOptions.iframeEnabled) {
- let url = 'https://tt3.zedo.com/rs/us/fcs.html';
- if (gdprConsent && typeof gdprConsent.consentString === 'string') {
- // add 'gdpr' only if 'gdprApplies' is defined
- if (typeof gdprConsent.gdprApplies === 'boolean') {
- url += `?gdpr=${Number(gdprConsent.gdprApplies)}&gdpr_consent=${gdprConsent.consentString}`;
- } else {
- url += `?gdpr_consent=${gdprConsent.consentString}`;
- }
- }
- return [{
- type: 'iframe',
- url: url
- }];
- }
- },
-
- onTimeout: function (timeoutData) {
- try {
- logEvent('117', timeoutData);
- } catch (e) {
- utils.logError(e);
- }
- },
-
- onBidWon: function (bid) {
- try {
- logEvent('116', [bid]);
- } catch (e) {
- utils.logError(e);
- }
- }
-
-};
-
-function getSupplyChain (supplyChain) {
- return {
- complete: supplyChain.complete,
- nodes: supplyChain.nodes
- }
-};
-
-function getCreative(ad) {
- return ad && ad.creatives && ad.creatives.length && find(ad.creatives, creative => creative.adId);
-};
-/**
- * Unpack the Server's Bid into a Prebid-compatible one.
- * @param serverBid
- * @param rtbBid
- * @param bidderRequest
- * @return Bid
- */
-function newBid(serverBid, creativeBid, bidderRequest) {
- const bid = {
- requestId: serverBid.slotId,
- creativeId: creativeBid.adId,
- network: serverBid.network,
- adType: creativeBid.creativeDetails.type,
- dealId: 99999999,
- currency: 'USD',
- netRevenue: true,
- ttl: 300
- };
-
- if (creativeBid.creativeDetails.type === 'VAST') {
- Object.assign(bid, {
- width: creativeBid.width,
- height: creativeBid.height,
- vastXml: creativeBid.creativeDetails.adContent,
- cpm: parseInt(creativeBid.bidCpm) / 1000000,
- ttl: 3600
- });
- const rendererOptions = utils.deepAccess(
- bidderRequest,
- 'renderer.options'
- );
- let rendererUrl = 'https://ss3.zedo.com/gecko/beta/fmpbgt.min.js';
- Object.assign(bid, {
- adResponse: serverBid,
- renderer: getRenderer(bid.adUnitCode, serverBid.slotId, rendererUrl, rendererOptions)
- });
- } else {
- Object.assign(bid, {
- width: creativeBid.width,
- height: creativeBid.height,
- cpm: parseInt(creativeBid.bidCpm) / 1000000,
- ad: creativeBid.creativeDetails.adContent,
- });
- }
-
- return bid;
-}
-/* Turn bid request sizes into compatible format */
-function getSizes(requestSizes) {
- let width = 0;
- let height = 0;
- if (utils.isArray(requestSizes) && requestSizes.length === 2 &&
- !utils.isArray(requestSizes[0])) {
- width = parseInt(requestSizes[0], 10);
- height = parseInt(requestSizes[1], 10);
- } else if (typeof requestSizes === 'object') {
- for (let i = 0; i < requestSizes.length; i++) {
- let size = requestSizes[i];
- width = parseInt(size[0], 10);
- height = parseInt(size[1], 10);
- break;
- }
- }
- return [width, height];
-}
-
-function getRenderer(adUnitCode, rendererId, rendererUrl, rendererOptions = {}) {
- const renderer = Renderer.install({
- id: rendererId,
- url: rendererUrl,
- config: rendererOptions,
- loaded: false,
- });
-
- try {
- renderer.setRender(videoRenderer);
- } catch (err) {
- utils.logWarn('Prebid Error calling setRender on renderer', err);
- }
-
- renderer.setEventHandlers({
- impression: () => utils.logMessage('ZEDO video impression'),
- loaded: () => utils.logMessage('ZEDO video loaded'),
- ended: () => {
- utils.logMessage('ZEDO renderer video ended');
- document.querySelector(`#${adUnitCode}`).style.display = 'none';
- }
- });
- return renderer;
-}
-
-function videoRenderer(bid) {
- // push to render queue
- const refererInfo = getRefererInfo();
- let referrer = '';
- if (refererInfo) {
- referrer = refererInfo.referer;
- }
- bid.renderer.push(() => {
- let channelCode = utils.deepAccess(bid, 'params.0.channelCode') || 0;
- let dimId = utils.deepAccess(bid, 'params.0.dimId') || 0;
- let publisher = utils.deepAccess(bid, 'params.0.pubId') || 0;
- let options = utils.deepAccess(bid, 'params.0.options') || {};
- let channel = (channelCode > 0) ? (channelCode - (bid.network * 1000000)) : 0;
-
- var rndr = new window.ZdPBTag(bid.adUnitCode, bid.network, bid.width, bid.height, bid.adType, bid.vastXml, channel, dimId,
- (encodeURI(referrer) || ''), options);
- rndr.renderAd(publisher);
- });
-}
-
-function parseMediaType(creativeBid) {
- const adType = creativeBid.creativeDetails.type;
- if (adType === 'VAST') {
- return VIDEO;
- } else {
- return BANNER;
- }
-}
-
-function logEvent(eid, data) {
- let getParams = {
- protocol: 'https',
- hostname: SECURE_EVENT_PIXEL_URL,
- search: getLoggingData(eid, data)
- };
- let eventUrl = utils.buildUrl(getParams).replace(/&/g, ';');
- utils.triggerPixel(eventUrl);
-}
-
-function getLoggingData(eid, data) {
- data = (utils.isArray(data) && data) || [];
-
- let params = {};
- let channel, network, dim, publisher, adunitCode, timeToRespond, cpm;
- data.map((adunit) => {
- adunitCode = adunit.adUnitCode;
- channel = utils.deepAccess(adunit, 'params.0.channelCode') || 0;
- network = channel > 0 ? parseInt(channel / 1000000) : 0;
- dim = utils.deepAccess(adunit, 'params.0.dimId') * 256 || 0;
- publisher = utils.deepAccess(adunit, 'params.0.pubId') || 0;
- timeToRespond = adunit.timeout ? adunit.timeout : adunit.timeToRespond;
- cpm = adunit.cpm;
- });
- let referrer = '';
- const refererInfo = getRefererInfo();
- if (refererInfo) {
- referrer = refererInfo.referer;
- }
- params.n = network;
- params.c = channel;
- params.s = publisher;
- params.x = dim;
- params.ai = encodeURI('Prebid^zedo^' + adunitCode + '^' + cpm + '^' + timeToRespond);
- params.pu = encodeURI(referrer) || '';
- params.eid = eid;
- params.e = 'e';
- params.z = Math.random();
-
- return params;
-}
-
-registerBidder(spec);
diff --git a/modules/zemantaBidAdapter.js b/modules/zemantaBidAdapter.js
deleted file mode 100644
index b2c00b69c24..00000000000
--- a/modules/zemantaBidAdapter.js
+++ /dev/null
@@ -1,281 +0,0 @@
-// jshint esversion: 6, es3: false, node: true
-'use strict';
-
-import {
- registerBidder
-} from '../src/adapters/bidderFactory.js';
-import { NATIVE, BANNER } from '../src/mediaTypes.js';
-import * as utils from '../src/utils.js';
-import { ajax } from '../src/ajax.js';
-import { config } from '../src/config.js';
-
-const BIDDER_CODE = 'zemanta';
-const GVLID = 164;
-const CURRENCY = 'USD';
-const NATIVE_ASSET_IDS = { 0: 'title', 2: 'icon', 3: 'image', 5: 'sponsoredBy', 4: 'body', 1: 'cta' };
-const NATIVE_PARAMS = {
- title: { id: 0, name: 'title' },
- icon: { id: 2, type: 1, name: 'img' },
- image: { id: 3, type: 3, name: 'img' },
- sponsoredBy: { id: 5, name: 'data', type: 1 },
- body: { id: 4, name: 'data', type: 2 },
- cta: { id: 1, type: 12, name: 'data' }
-};
-
-export const spec = {
- code: BIDDER_CODE,
- gvlid: GVLID,
- aliases: [
- { code: 'outbrain', gvlid: GVLID }
- ],
- supportedMediaTypes: [ NATIVE, BANNER ],
- isBidRequestValid: (bid) => {
- return (
- (!!config.getConfig('zemanta.bidderUrl') || !!config.getConfig('outbrain.bidderUrl')) &&
- !!utils.deepAccess(bid, 'params.publisher.id') &&
- !!(bid.nativeParams || bid.sizes)
- );
- },
- buildRequests: (validBidRequests, bidderRequest) => {
- const page = bidderRequest.refererInfo.referer;
- const ua = navigator.userAgent;
- const test = setOnAny(validBidRequests, 'params.test');
- const publisher = setOnAny(validBidRequests, 'params.publisher');
- const bcat = setOnAny(validBidRequests, 'params.bcat');
- const badv = setOnAny(validBidRequests, 'params.badv');
- const cur = CURRENCY;
- const endpointUrl = config.getConfig('zemanta.bidderUrl') || config.getConfig('outbrain.bidderUrl');
- const timeout = bidderRequest.timeout;
-
- const imps = validBidRequests.map((bid, id) => {
- bid.netRevenue = 'net';
- const imp = {
- id: id + 1 + ''
- }
-
- if (bid.params.tagid) {
- imp.tagid = bid.params.tagid
- }
-
- if (bid.nativeParams) {
- imp.native = {
- request: JSON.stringify({
- assets: getNativeAssets(bid)
- })
- }
- } else {
- imp.banner = {
- format: transformSizes(bid.sizes)
- }
- }
-
- return imp;
- });
-
- const request = {
- id: bidderRequest.auctionId,
- site: { page, publisher },
- device: { ua },
- source: { fd: 1 },
- cur: [cur],
- tmax: timeout,
- imp: imps,
- bcat: bcat,
- badv: badv,
- };
-
- if (test) {
- request.is_debug = !!test;
- request.test = 1;
- }
-
- if (utils.deepAccess(bidderRequest, 'gdprConsent.gdprApplies')) {
- utils.deepSetValue(request, 'user.ext.consent', bidderRequest.gdprConsent.consentString)
- utils.deepSetValue(request, 'regs.ext.gdpr', bidderRequest.gdprConsent.gdprApplies & 1)
- }
- if (bidderRequest.uspConsent) {
- utils.deepSetValue(request, 'regs.ext.us_privacy', bidderRequest.uspConsent)
- }
- if (config.getConfig('coppa') === true) {
- utils.deepSetValue(request, 'regs.coppa', config.getConfig('coppa') & 1)
- }
-
- return {
- method: 'POST',
- url: endpointUrl,
- data: JSON.stringify(request),
- bids: validBidRequests
- };
- },
- interpretResponse: (serverResponse, { bids }) => {
- if (!serverResponse.body) {
- return [];
- }
- const { seatbid, cur } = serverResponse.body;
-
- const bidResponses = flatten(seatbid.map(seat => seat.bid)).reduce((result, bid) => {
- result[bid.impid - 1] = bid;
- return result;
- }, []);
-
- return bids.map((bid, id) => {
- const bidResponse = bidResponses[id];
- if (bidResponse) {
- const type = bid.nativeParams ? NATIVE : BANNER;
- const bidObject = {
- requestId: bid.bidId,
- cpm: bidResponse.price,
- creativeId: bidResponse.crid,
- ttl: 360,
- netRevenue: bid.netRevenue === 'net',
- currency: cur,
- mediaType: type,
- nurl: bidResponse.nurl,
- };
- if (type === NATIVE) {
- bidObject.native = parseNative(bidResponse);
- } else {
- bidObject.ad = bidResponse.adm;
- bidObject.width = bidResponse.w;
- bidObject.height = bidResponse.h;
- }
- bidObject.meta = {};
- if (bidResponse.adomain && bidResponse.adomain.length > 0) {
- bidObject.meta.advertiserDomains = bidResponse.adomain;
- }
- return bidObject;
- }
- }).filter(Boolean);
- },
- getUserSyncs: (syncOptions, responses, gdprConsent, uspConsent) => {
- const syncs = [];
- let syncUrl = config.getConfig('zemanta.usersyncUrl') || config.getConfig('outbrain.usersyncUrl');
- if (syncOptions.pixelEnabled && syncUrl) {
- if (gdprConsent) {
- syncUrl += '&gdpr=' + (gdprConsent.gdprApplies & 1);
- syncUrl += '&gdpr_consent=' + encodeURIComponent(gdprConsent.consentString || '');
- }
- if (uspConsent) {
- syncUrl += '&us_privacy=' + encodeURIComponent(uspConsent);
- }
-
- syncs.push({
- type: 'image',
- url: syncUrl
- });
- }
- return syncs;
- },
- onBidWon: (bid) => {
- // for native requests we put the nurl as an imp tracker, otherwise if the auction takes place on prebid server
- // the server JS adapter puts the nurl in the adm as a tracking pixel and removes the attribute
- if (bid.nurl) {
- ajax(utils.replaceAuctionPrice(bid.nurl, bid.originalCpm))
- }
- }
-};
-
-registerBidder(spec);
-
-function parseNative(bid) {
- const { assets, link, eventtrackers } = JSON.parse(bid.adm);
- const result = {
- clickUrl: link.url,
- clickTrackers: link.clicktrackers || undefined
- };
- assets.forEach(asset => {
- const kind = NATIVE_ASSET_IDS[asset.id];
- const content = kind && asset[NATIVE_PARAMS[kind].name];
- if (content) {
- result[kind] = content.text || content.value || { url: content.url, width: content.w, height: content.h };
- }
- });
- if (eventtrackers) {
- result.impressionTrackers = [];
- eventtrackers.forEach(tracker => {
- if (tracker.event !== 1) return;
- switch (tracker.method) {
- case 1: // img
- result.impressionTrackers.push(tracker.url);
- break;
- case 2: // js
- result.javascriptTrackers = ``;
- break;
- }
- });
- }
- return result;
-}
-
-function setOnAny(collection, key) {
- for (let i = 0, result; i < collection.length; i++) {
- result = utils.deepAccess(collection[i], key);
- if (result) {
- return result;
- }
- }
-}
-
-function flatten(arr) {
- return [].concat(...arr);
-}
-
-function getNativeAssets(bid) {
- return utils._map(bid.nativeParams, (bidParams, key) => {
- const props = NATIVE_PARAMS[key];
- const asset = {
- required: bidParams.required & 1,
- };
- if (props) {
- asset.id = props.id;
- let wmin, hmin, w, h;
- let aRatios = bidParams.aspect_ratios;
-
- if (aRatios && aRatios[0]) {
- aRatios = aRatios[0];
- wmin = aRatios.min_width || 0;
- hmin = aRatios.ratio_height * wmin / aRatios.ratio_width | 0;
- }
-
- if (bidParams.sizes) {
- const sizes = flatten(bidParams.sizes);
- w = sizes[0];
- h = sizes[1];
- }
-
- asset[props.name] = {
- len: bidParams.len,
- type: props.type,
- wmin,
- hmin,
- w,
- h
- };
-
- return asset;
- }
- }).filter(Boolean);
-}
-
-/* Turn bid request sizes into ut-compatible format */
-function transformSizes(requestSizes) {
- if (!utils.isArray(requestSizes)) {
- return [];
- }
-
- if (requestSizes.length === 2 && !utils.isArray(requestSizes[0])) {
- return [{
- w: parseInt(requestSizes[0], 10),
- h: parseInt(requestSizes[1], 10)
- }];
- } else if (utils.isArray(requestSizes[0])) {
- return requestSizes.map(item =>
- ({
- w: parseInt(item[0], 10),
- h: parseInt(item[1], 10)
- })
- );
- }
-
- return [];
-}
diff --git a/modules/zemantaBidAdapter.md b/modules/zemantaBidAdapter.md
deleted file mode 100644
index fa933ecd922..00000000000
--- a/modules/zemantaBidAdapter.md
+++ /dev/null
@@ -1,111 +0,0 @@
-# Overview
-
-```
-Module Name: Zemanta Adapter
-Module Type: Bidder Adapter
-Maintainer: prog-ops-team@outbrain.com
-```
-
-# Description
-
-Module that connects to zemanta bidder to fetch bids.
-Both native and display formats are supported but not at the same time. Using OpenRTB standard.
-
-# Configuration
-
-## Bidder and usersync URLs
-
-The Zemanta adapter does not work without setting the correct bidder and usersync URLs.
-You will receive the URLs when contacting us.
-
-```
-pbjs.setConfig({
- zemanta: {
- bidderUrl: 'https://bidder-url.com',
- usersyncUrl: 'https://usersync-url.com'
- }
-});
-```
-
-
-# Test Native Parameters
-```
- var adUnits = [
- code: '/19968336/prebid_native_example_1',
- mediaTypes: {
- native: {
- image: {
- required: false,
- sizes: [100, 50]
- },
- title: {
- required: false,
- len: 140
- },
- sponsoredBy: {
- required: false
- },
- clickUrl: {
- required: false
- },
- body: {
- required: false
- },
- icon: {
- required: false,
- sizes: [50, 50]
- }
- }
- },
- bids: [{
- bidder: 'zemanta',
- params: {
- publisher: {
- id: '2706', // required
- name: 'Publishers Name',
- domain: 'publisher.com'
- },
- tagid: 'tag-id',
- bcat: ['IAB1-1'],
- badv: ['example.com']
- }
- }]
- ];
-
- pbjs.setConfig({
- zemanta: {
- bidderUrl: 'https://prebidtest.zemanta.com/api/bidder/prebidtest/bid/'
- }
- });
-```
-
-# Test Display Parameters
-```
- var adUnits = [
- code: '/19968336/prebid_display_example_1',
- mediaTypes: {
- banner: {
- sizes: [[300, 250]]
- }
- },
- bids: [{
- bidder: 'zemanta',
- params: {
- publisher: {
- id: '2706', // required
- name: 'Publishers Name',
- domain: 'publisher.com'
- },
- tagid: 'tag-id',
- bcat: ['IAB1-1'],
- badv: ['example.com']
- },
- }]
- ];
-
- pbjs.setConfig({
- zemanta: {
- bidderUrl: 'https://prebidtest.zemanta.com/api/bidder/prebidtest/bid/'
- }
- });
-```
diff --git a/modules/zetaBidAdapter.js b/modules/zetaBidAdapter.js
index ee5c854df97..c6ce7e857ba 100644
--- a/modules/zetaBidAdapter.js
+++ b/modules/zetaBidAdapter.js
@@ -2,8 +2,9 @@ import * as utils from '../src/utils.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import {BANNER} from '../src/mediaTypes.js';
const BIDDER_CODE = 'zeta_global';
+const PREBID_DEFINER_ID = '44253'
const ENDPOINT_URL = 'https://prebid.rfihub.com/prebid';
-const USER_SYNC_URL = 'https://p.rfihub.com/cm?pub=42770&in=1';
+const USER_SYNC_URL = 'https://p.rfihub.com/cm?in=1&pub=';
const DEFAULT_CUR = 'USD';
const TTL = 200;
const NET_REV = true;
@@ -87,10 +88,12 @@ export const spec = {
badv: params.badv,
bapp: params.bapp,
source: params.source ? params.source : {},
+ regs: params.regs ? params.regs : {},
ext: params.ext ? params.ext : {}
};
payload.device.ua = navigator.userAgent;
+ payload.device.ip = navigator.ip;
payload.site.page = bidderRequest.refererInfo.referer;
payload.site.mobile = /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent) ? 1 : 0;
payload.ext.definerId = params.definerId;
@@ -99,20 +102,18 @@ export const spec = {
payload.test = params.test;
}
if (request.gdprConsent) {
- payload.regs = {
- ext: {
- gdpr: request.gdprConsent.gdprApplies === true ? 1 : 0
- }
- };
+ payload.regs.ext = Object.assign(
+ payload.regs.ext,
+ {gdpr: request.gdprConsent.gdprApplies === true ? 1 : 0}
+ );
}
if (request.gdprConsent && request.gdprConsent.gdprApplies) {
- payload.user = {
- ext: {
- consent: request.gdprConsent.consentString
- }
- };
+ payload.user.ext = Object.assign(
+ payload.user.ext,
+ {consent: request.gdprConsent.consentString}
+ );
}
- const postUrl = params.definerId !== '0' ? ENDPOINT_URL.concat('/', params.definerId) : ENDPOINT_URL;
+ const postUrl = params.definerId !== PREBID_DEFINER_ID ? ENDPOINT_URL.concat('/', params.definerId) : ENDPOINT_URL;
return {
method: 'POST',
url: postUrl,
@@ -149,20 +150,24 @@ export const spec = {
},
/**
- * 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.
- * @param gdprConsent The GDPR consent parameters
- * @param uspConsent The USP consent parameters
- * @return {UserSync[]} The user syncs which should be dropped.
- */
- getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) {
+ * 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.
+ * @param definerId The calling entity's definer id
+ * @param gdprConsent The GDPR consent parameters
+ * @param uspConsent The USP consent parameters
+ * @return {UserSync[]} The user syncs which should be dropped.
+ */
+ getUserSyncs: function(syncOptions, serverResponses, definerId, gdprConsent, uspConsent) {
const syncs = [];
+ if (definerId === '' || definerId === null) {
+ definerId = PREBID_DEFINER_ID;
+ }
if (syncOptions.iframeEnabled) {
syncs.push({
type: 'iframe',
- url: USER_SYNC_URL
+ url: USER_SYNC_URL.concat(definerId)
});
}
return syncs;
diff --git a/modules/zetaBidAdapter.md b/modules/zetaBidAdapter.md
index 89a9767d29a..e0f7271a4f1 100644
--- a/modules/zetaBidAdapter.md
+++ b/modules/zetaBidAdapter.md
@@ -35,7 +35,7 @@ Module that connects to Zeta's demand sources
country: 'USA'
}
},
- definerId: '0',
+ definerId: '44253',
test: 1
}
}
diff --git a/modules/zetaSspBidAdapter.js b/modules/zetaSspBidAdapter.js
index c956df55a1f..76ceea0fdd1 100644
--- a/modules/zetaSspBidAdapter.js
+++ b/modules/zetaSspBidAdapter.js
@@ -62,10 +62,13 @@ export const spec = {
sid: params.sid ? params.sid : undefined
}
};
+ const rInfo = bidderRequest.refererInfo;
+ payload.site.page = config.getConfig('pageUrl') || ((rInfo && rInfo.referer) ? rInfo.referer.trim() : window.location.href);
+ payload.site.domain = config.getConfig('publisherDomain') || getDomainFromURL(payload.site.page);
payload.device.ua = navigator.userAgent;
- payload.site.page = bidderRequest.refererInfo.referer;
- payload.site.mobile = /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent) ? 1 : 0;
+ payload.device.devicetype = isMobile() ? 1 : isConnectedTV() ? 3 : 2;
+ payload.site.mobile = payload.device.devicetype === 1 ? 1 : 0;
if (params.test) {
payload.test = params.test;
@@ -76,13 +79,12 @@ export const spec = {
gdpr: request.gdprConsent.gdprApplies === true ? 1 : 0
}
};
- }
- if (request.gdprConsent && request.gdprConsent.gdprApplies) {
- payload.user = {
- ext: {
+ if (request.gdprConsent.gdprApplies && request.gdprConsent.consentString) {
+ payload.user.ext = {
+ ...payload.user.ext,
consent: request.gdprConsent.consentString
}
- };
+ }
}
provideEids(request, payload);
return {
@@ -100,28 +102,32 @@ export const spec = {
* @return {Bid[]} An array of bids which were nested inside the server.
*/
interpretResponse: function (serverResponse, bidRequest) {
- let bidResponse = [];
- if (Object.keys(serverResponse.body).length !== 0) {
- let zetaResponse = serverResponse.body;
- let zetaBid = zetaResponse.seatbid[0].bid[0];
- let bid = {
- requestId: zetaBid.impid,
- cpm: zetaBid.price,
- currency: zetaResponse.cur,
- width: zetaBid.w,
- height: zetaBid.h,
- ad: zetaBid.adm,
- ttl: TTL,
- creativeId: zetaBid.crid,
- netRevenue: NET_REV,
- };
- if (zetaBid.adomain && zetaBid.adomain.length) {
- bid.meta = {};
- bid.meta.advertiserDomains = zetaBid.adomain;
- }
- bidResponse.push(bid);
+ let bidResponses = [];
+ const response = (serverResponse || {}).body;
+ if (response && response.seatbid && response.seatbid[0].bid && response.seatbid[0].bid.length) {
+ response.seatbid.forEach(zetaSeatbid => {
+ zetaSeatbid.bid.forEach(zetaBid => {
+ let bid = {
+ requestId: zetaBid.impid,
+ cpm: zetaBid.price,
+ currency: response.cur,
+ width: zetaBid.w,
+ height: zetaBid.h,
+ ad: zetaBid.adm,
+ ttl: TTL,
+ creativeId: zetaBid.crid,
+ netRevenue: NET_REV,
+ };
+ if (zetaBid.adomain && zetaBid.adomain.length) {
+ bid.meta = {
+ advertiserDomains: zetaBid.adomain
+ };
+ }
+ bidResponses.push(bid);
+ })
+ })
}
- return bidResponse;
+ return bidResponses;
},
/**
@@ -179,4 +185,22 @@ function provideEids(request, payload) {
}
}
+function getDomainFromURL(url) {
+ let anchor = document.createElement('a');
+ anchor.href = url;
+ let hostname = anchor.hostname;
+ if (hostname.indexOf('www.') === 0) {
+ return hostname.substring(4);
+ }
+ return hostname;
+}
+
+function isMobile() {
+ return /(ios|ipod|ipad|iphone|android)/i.test(navigator.userAgent);
+}
+
+function isConnectedTV() {
+ return /(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i.test(navigator.userAgent);
+}
+
registerBidder(spec);
diff --git a/package-lock.json b/package-lock.json
index a6a58a530de..95a53b37173 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,60 +1,54 @@
{
"name": "prebid.js",
- "version": "4.39.0-pre",
+ "version": "5.3.0-pre",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@babel/code-frame": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
- "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz",
+ "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.10.4"
+ "@babel/highlight": "7.14.5"
}
},
"@babel/compat-data": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.5.tgz",
- "integrity": "sha512-mPVoWNzIpYJHbWje0if7Ck36bpbtTvIxOi9+6WSK9wjGEXearAqlwBoTQvVjsAY2VIwgcs8V940geY3okzRCEw==",
- "dev": true,
- "requires": {
- "browserslist": "^4.12.0",
- "invariant": "^2.2.4",
- "semver": "^5.5.0"
- }
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz",
+ "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==",
+ "dev": true
},
"@babel/core": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz",
- "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.10.4",
- "@babel/generator": "^7.10.5",
- "@babel/helper-module-transforms": "^7.10.5",
- "@babel/helpers": "^7.10.4",
- "@babel/parser": "^7.10.5",
- "@babel/template": "^7.10.4",
- "@babel/traverse": "^7.10.5",
- "@babel/types": "^7.10.5",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.1",
- "json5": "^2.1.2",
- "lodash": "^4.17.19",
- "resolve": "^1.3.2",
- "semver": "^5.4.1",
- "source-map": "^0.5.0"
+ "version": "7.14.6",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz",
+ "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.14.5",
+ "@babel/generator": "7.14.5",
+ "@babel/helper-compilation-targets": "7.14.5",
+ "@babel/helper-module-transforms": "7.14.5",
+ "@babel/helpers": "7.14.6",
+ "@babel/parser": "7.14.7",
+ "@babel/template": "7.14.5",
+ "@babel/traverse": "7.14.7",
+ "@babel/types": "7.14.5",
+ "convert-source-map": "1.8.0",
+ "debug": "4.3.1",
+ "gensync": "1.0.0-beta.2",
+ "json5": "2.2.0",
+ "semver": "6.3.0",
+ "source-map": "0.5.7"
},
"dependencies": {
"debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.2"
}
},
"ms": {
@@ -66,380 +60,460 @@
}
},
"@babel/generator": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz",
- "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz",
+ "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==",
"dev": true,
"requires": {
- "@babel/types": "^7.10.5",
- "jsesc": "^2.5.1",
- "source-map": "^0.5.0"
+ "@babel/types": "7.14.5",
+ "jsesc": "2.5.2",
+ "source-map": "0.5.7"
}
},
"@babel/helper-annotate-as-pure": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
- "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz",
+ "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==",
"dev": true,
"requires": {
- "@babel/types": "^7.10.4"
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
- "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz",
+ "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==",
"dev": true,
"requires": {
- "@babel/helper-explode-assignable-expression": "^7.10.4",
- "@babel/types": "^7.10.4"
+ "@babel/helper-explode-assignable-expression": "7.14.5",
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-compilation-targets": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz",
- "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz",
+ "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.10.4",
- "browserslist": "^4.12.0",
- "invariant": "^2.2.4",
- "levenary": "^1.1.1",
- "semver": "^5.5.0"
+ "@babel/compat-data": "7.14.7",
+ "@babel/helper-validator-option": "7.14.5",
+ "browserslist": "4.16.6",
+ "semver": "6.3.0"
}
},
"@babel/helper-create-class-features-plugin": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz",
- "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==",
+ "version": "7.14.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz",
+ "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==",
"dev": true,
"requires": {
- "@babel/helper-function-name": "^7.10.4",
- "@babel/helper-member-expression-to-functions": "^7.10.5",
- "@babel/helper-optimise-call-expression": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/helper-replace-supers": "^7.10.4",
- "@babel/helper-split-export-declaration": "^7.10.4"
+ "@babel/helper-annotate-as-pure": "7.14.5",
+ "@babel/helper-function-name": "7.14.5",
+ "@babel/helper-member-expression-to-functions": "7.14.7",
+ "@babel/helper-optimise-call-expression": "7.14.5",
+ "@babel/helper-replace-supers": "7.14.5",
+ "@babel/helper-split-export-declaration": "7.14.5"
}
},
"@babel/helper-create-regexp-features-plugin": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz",
- "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz",
+ "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.10.4",
- "@babel/helper-regex": "^7.10.4",
- "regexpu-core": "^4.7.0"
+ "@babel/helper-annotate-as-pure": "7.14.5",
+ "regexpu-core": "4.7.1"
}
},
- "@babel/helper-define-map": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
- "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
+ "@babel/helper-define-polyfill-provider": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz",
+ "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==",
"dev": true,
"requires": {
- "@babel/helper-function-name": "^7.10.4",
- "@babel/types": "^7.10.5",
- "lodash": "^4.17.19"
+ "@babel/helper-compilation-targets": "7.14.5",
+ "@babel/helper-module-imports": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/traverse": "7.14.7",
+ "debug": "4.3.1",
+ "lodash.debounce": "4.0.8",
+ "resolve": "1.20.0",
+ "semver": "6.3.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
}
},
"@babel/helper-explode-assignable-expression": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz",
- "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz",
+ "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==",
"dev": true,
"requires": {
- "@babel/traverse": "^7.10.4",
- "@babel/types": "^7.10.4"
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-function-name": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
- "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz",
+ "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==",
"dev": true,
"requires": {
- "@babel/helper-get-function-arity": "^7.10.4",
- "@babel/template": "^7.10.4",
- "@babel/types": "^7.10.4"
+ "@babel/helper-get-function-arity": "7.14.5",
+ "@babel/template": "7.14.5",
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-get-function-arity": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
- "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz",
+ "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==",
"dev": true,
"requires": {
- "@babel/types": "^7.10.4"
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-hoist-variables": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
- "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz",
+ "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.10.4"
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-member-expression-to-functions": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz",
- "integrity": "sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==",
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz",
+ "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==",
"dev": true,
"requires": {
- "@babel/types": "^7.10.5"
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-module-imports": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
- "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz",
+ "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.10.4"
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-module-transforms": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz",
- "integrity": "sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz",
+ "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.10.4",
- "@babel/helper-replace-supers": "^7.10.4",
- "@babel/helper-simple-access": "^7.10.4",
- "@babel/helper-split-export-declaration": "^7.10.4",
- "@babel/template": "^7.10.4",
- "@babel/types": "^7.10.5",
- "lodash": "^4.17.19"
+ "@babel/helper-module-imports": "7.14.5",
+ "@babel/helper-replace-supers": "7.14.5",
+ "@babel/helper-simple-access": "7.14.5",
+ "@babel/helper-split-export-declaration": "7.14.5",
+ "@babel/helper-validator-identifier": "7.14.5",
+ "@babel/template": "7.14.5",
+ "@babel/traverse": "7.14.7",
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-optimise-call-expression": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
- "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz",
+ "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==",
"dev": true,
"requires": {
- "@babel/types": "^7.10.4"
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-plugin-utils": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
- "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
+ "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==",
"dev": true
},
- "@babel/helper-regex": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
- "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
+ "@babel/helper-remap-async-to-generator": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz",
+ "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==",
"dev": true,
"requires": {
- "lodash": "^4.17.19"
+ "@babel/helper-annotate-as-pure": "7.14.5",
+ "@babel/helper-wrap-function": "7.14.5",
+ "@babel/types": "7.14.5"
}
},
- "@babel/helper-remap-async-to-generator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz",
- "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==",
+ "@babel/helper-replace-supers": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz",
+ "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.10.4",
- "@babel/helper-wrap-function": "^7.10.4",
- "@babel/template": "^7.10.4",
- "@babel/traverse": "^7.10.4",
- "@babel/types": "^7.10.4"
+ "@babel/helper-member-expression-to-functions": "7.14.7",
+ "@babel/helper-optimise-call-expression": "7.14.5",
+ "@babel/traverse": "7.14.7",
+ "@babel/types": "7.14.5"
}
},
- "@babel/helper-replace-supers": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
- "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
+ "@babel/helper-simple-access": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz",
+ "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==",
"dev": true,
"requires": {
- "@babel/helper-member-expression-to-functions": "^7.10.4",
- "@babel/helper-optimise-call-expression": "^7.10.4",
- "@babel/traverse": "^7.10.4",
- "@babel/types": "^7.10.4"
+ "@babel/types": "7.14.5"
}
},
- "@babel/helper-simple-access": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
- "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
+ "@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz",
+ "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==",
"dev": true,
"requires": {
- "@babel/template": "^7.10.4",
- "@babel/types": "^7.10.4"
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz",
- "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz",
+ "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==",
"dev": true,
"requires": {
- "@babel/types": "^7.10.4"
+ "@babel/types": "7.14.5"
}
},
"@babel/helper-validator-identifier": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
- "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
+ "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "dev": true
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
+ "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
"dev": true
},
"@babel/helper-wrap-function": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz",
- "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz",
+ "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==",
"dev": true,
"requires": {
- "@babel/helper-function-name": "^7.10.4",
- "@babel/template": "^7.10.4",
- "@babel/traverse": "^7.10.4",
- "@babel/types": "^7.10.4"
+ "@babel/helper-function-name": "7.14.5",
+ "@babel/template": "7.14.5",
+ "@babel/traverse": "7.14.7",
+ "@babel/types": "7.14.5"
}
},
"@babel/helpers": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
- "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
+ "version": "7.14.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz",
+ "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==",
"dev": true,
"requires": {
- "@babel/template": "^7.10.4",
- "@babel/traverse": "^7.10.4",
- "@babel/types": "^7.10.4"
+ "@babel/template": "7.14.5",
+ "@babel/traverse": "7.14.7",
+ "@babel/types": "7.14.5"
}
},
"@babel/highlight": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
- "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.10.4",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
+ "@babel/helper-validator-identifier": "7.14.5",
+ "chalk": "2.4.2",
+ "js-tokens": "4.0.0"
}
},
"@babel/parser": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz",
- "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==",
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz",
+ "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==",
"dev": true
},
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz",
+ "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "7.14.5",
+ "@babel/plugin-proposal-optional-chaining": "7.14.5"
+ }
+ },
"@babel/plugin-proposal-async-generator-functions": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
- "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz",
+ "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/helper-remap-async-to-generator": "^7.10.4",
- "@babel/plugin-syntax-async-generators": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/helper-remap-async-to-generator": "7.14.5",
+ "@babel/plugin-syntax-async-generators": "7.8.4"
}
},
"@babel/plugin-proposal-class-properties": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz",
- "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz",
+ "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "7.14.6",
+ "@babel/helper-plugin-utils": "7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==",
"dev": true,
"requires": {
- "@babel/helper-create-class-features-plugin": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-create-class-features-plugin": "7.14.6",
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/plugin-syntax-class-static-block": "7.14.5"
}
},
"@babel/plugin-proposal-dynamic-import": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
- "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz",
+ "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz",
+ "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/plugin-syntax-dynamic-import": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/plugin-syntax-export-namespace-from": "7.8.3"
}
},
"@babel/plugin-proposal-json-strings": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
- "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz",
+ "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/plugin-syntax-json-strings": "7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz",
+ "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/plugin-syntax-json-strings": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/plugin-syntax-logical-assignment-operators": "7.10.4"
}
},
"@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz",
- "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz",
+ "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "7.8.3"
}
},
"@babel/plugin-proposal-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz",
+ "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/plugin-syntax-numeric-separator": "7.10.4"
}
},
"@babel/plugin-proposal-object-rest-spread": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz",
- "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==",
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz",
+ "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
- "@babel/plugin-transform-parameters": "^7.10.4"
+ "@babel/compat-data": "7.14.7",
+ "@babel/helper-compilation-targets": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/plugin-syntax-object-rest-spread": "7.8.3",
+ "@babel/plugin-transform-parameters": "7.14.5"
}
},
"@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz",
- "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz",
+ "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/plugin-syntax-optional-catch-binding": "7.8.3"
}
},
"@babel/plugin-proposal-optional-chaining": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz",
- "integrity": "sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz",
+ "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/plugin-syntax-optional-chaining": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "7.14.5",
+ "@babel/plugin-syntax-optional-chaining": "7.8.3"
}
},
"@babel/plugin-proposal-private-methods": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz",
- "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz",
+ "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==",
"dev": true,
"requires": {
- "@babel/helper-create-class-features-plugin": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-create-class-features-plugin": "7.14.6",
+ "@babel/helper-plugin-utils": "7.14.5"
+ }
+ },
+ "@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "7.14.5",
+ "@babel/helper-create-class-features-plugin": "7.14.6",
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/plugin-syntax-private-property-in-object": "7.14.5"
}
},
"@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz",
- "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz",
+ "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-create-regexp-features-plugin": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-syntax-async-generators": {
@@ -448,16 +522,25 @@
"integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-syntax-class-properties": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz",
- "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==",
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-syntax-dynamic-import": {
@@ -466,7 +549,16 @@
"integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-syntax-json-strings": {
@@ -475,7 +567,16 @@
"integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-syntax-nullish-coalescing-operator": {
@@ -484,7 +585,7 @@
"integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-syntax-numeric-separator": {
@@ -493,7 +594,7 @@
"integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-syntax-object-rest-spread": {
@@ -502,7 +603,7 @@
"integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-syntax-optional-catch-binding": {
@@ -511,7 +612,7 @@
"integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-syntax-optional-chaining": {
@@ -520,424 +621,458 @@
"integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "@babel/helper-plugin-utils": "7.14.5"
+ }
+ },
+ "@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-syntax-top-level-await": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz",
- "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-arrow-functions": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz",
- "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz",
+ "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-async-to-generator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz",
- "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz",
+ "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/helper-remap-async-to-generator": "^7.10.4"
+ "@babel/helper-module-imports": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/helper-remap-async-to-generator": "7.14.5"
}
},
"@babel/plugin-transform-block-scoped-functions": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz",
- "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz",
+ "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-block-scoping": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz",
- "integrity": "sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz",
+ "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-classes": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz",
- "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz",
+ "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.10.4",
- "@babel/helper-define-map": "^7.10.4",
- "@babel/helper-function-name": "^7.10.4",
- "@babel/helper-optimise-call-expression": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/helper-replace-supers": "^7.10.4",
- "@babel/helper-split-export-declaration": "^7.10.4",
- "globals": "^11.1.0"
+ "@babel/helper-annotate-as-pure": "7.14.5",
+ "@babel/helper-function-name": "7.14.5",
+ "@babel/helper-optimise-call-expression": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/helper-replace-supers": "7.14.5",
+ "@babel/helper-split-export-declaration": "7.14.5",
+ "globals": "11.12.0"
}
},
"@babel/plugin-transform-computed-properties": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz",
- "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz",
+ "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-destructuring": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz",
- "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==",
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz",
+ "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-dotall-regex": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz",
- "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz",
+ "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-create-regexp-features-plugin": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-duplicate-keys": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz",
- "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz",
+ "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-exponentiation-operator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz",
- "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz",
+ "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==",
"dev": true,
"requires": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-builder-binary-assignment-operator-visitor": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-for-of": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz",
- "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz",
+ "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-function-name": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz",
- "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz",
+ "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==",
"dev": true,
"requires": {
- "@babel/helper-function-name": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-function-name": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-literals": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz",
- "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz",
+ "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-member-expression-literals": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz",
- "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz",
+ "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-modules-amd": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz",
- "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz",
+ "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.10.5",
- "@babel/helper-plugin-utils": "^7.10.4",
- "babel-plugin-dynamic-import-node": "^2.3.3"
+ "@babel/helper-module-transforms": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5",
+ "babel-plugin-dynamic-import-node": "2.3.3"
}
},
"@babel/plugin-transform-modules-commonjs": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz",
- "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz",
+ "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/helper-simple-access": "^7.10.4",
- "babel-plugin-dynamic-import-node": "^2.3.3"
+ "@babel/helper-module-transforms": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/helper-simple-access": "7.14.5",
+ "babel-plugin-dynamic-import-node": "2.3.3"
}
},
"@babel/plugin-transform-modules-systemjs": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz",
- "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz",
+ "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==",
"dev": true,
"requires": {
- "@babel/helper-hoist-variables": "^7.10.4",
- "@babel/helper-module-transforms": "^7.10.5",
- "@babel/helper-plugin-utils": "^7.10.4",
- "babel-plugin-dynamic-import-node": "^2.3.3"
+ "@babel/helper-hoist-variables": "7.14.5",
+ "@babel/helper-module-transforms": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/helper-validator-identifier": "7.14.5",
+ "babel-plugin-dynamic-import-node": "2.3.3"
}
},
"@babel/plugin-transform-modules-umd": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz",
- "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz",
+ "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-module-transforms": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz",
- "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==",
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz",
+ "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.10.4"
+ "@babel/helper-create-regexp-features-plugin": "7.14.5"
}
},
"@babel/plugin-transform-new-target": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz",
- "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz",
+ "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-object-super": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz",
- "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz",
+ "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/helper-replace-supers": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/helper-replace-supers": "7.14.5"
}
},
"@babel/plugin-transform-parameters": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz",
- "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz",
+ "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==",
"dev": true,
"requires": {
- "@babel/helper-get-function-arity": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-property-literals": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz",
- "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz",
+ "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-regenerator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz",
- "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz",
+ "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==",
"dev": true,
"requires": {
- "regenerator-transform": "^0.14.2"
+ "regenerator-transform": "0.14.5"
}
},
"@babel/plugin-transform-reserved-words": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz",
- "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz",
+ "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-shorthand-properties": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz",
- "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz",
+ "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-spread": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz",
- "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==",
+ "version": "7.14.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz",
+ "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "7.14.5"
}
},
"@babel/plugin-transform-sticky-regex": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz",
- "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz",
+ "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/helper-regex": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-template-literals": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz",
- "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz",
+ "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-typeof-symbol": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz",
- "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz",
+ "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-unicode-escapes": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz",
- "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz",
+ "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/plugin-transform-unicode-regex": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz",
- "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz",
+ "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/helper-create-regexp-features-plugin": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5"
}
},
"@babel/preset-env": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.4.tgz",
- "integrity": "sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw==",
- "dev": true,
- "requires": {
- "@babel/compat-data": "^7.10.4",
- "@babel/helper-compilation-targets": "^7.10.4",
- "@babel/helper-module-imports": "^7.10.4",
- "@babel/helper-plugin-utils": "^7.10.4",
- "@babel/plugin-proposal-async-generator-functions": "^7.10.4",
- "@babel/plugin-proposal-class-properties": "^7.10.4",
- "@babel/plugin-proposal-dynamic-import": "^7.10.4",
- "@babel/plugin-proposal-json-strings": "^7.10.4",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
- "@babel/plugin-proposal-numeric-separator": "^7.10.4",
- "@babel/plugin-proposal-object-rest-spread": "^7.10.4",
- "@babel/plugin-proposal-optional-catch-binding": "^7.10.4",
- "@babel/plugin-proposal-optional-chaining": "^7.10.4",
- "@babel/plugin-proposal-private-methods": "^7.10.4",
- "@babel/plugin-proposal-unicode-property-regex": "^7.10.4",
- "@babel/plugin-syntax-async-generators": "^7.8.0",
- "@babel/plugin-syntax-class-properties": "^7.10.4",
- "@babel/plugin-syntax-dynamic-import": "^7.8.0",
- "@babel/plugin-syntax-json-strings": "^7.8.0",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
- "@babel/plugin-syntax-optional-chaining": "^7.8.0",
- "@babel/plugin-syntax-top-level-await": "^7.10.4",
- "@babel/plugin-transform-arrow-functions": "^7.10.4",
- "@babel/plugin-transform-async-to-generator": "^7.10.4",
- "@babel/plugin-transform-block-scoped-functions": "^7.10.4",
- "@babel/plugin-transform-block-scoping": "^7.10.4",
- "@babel/plugin-transform-classes": "^7.10.4",
- "@babel/plugin-transform-computed-properties": "^7.10.4",
- "@babel/plugin-transform-destructuring": "^7.10.4",
- "@babel/plugin-transform-dotall-regex": "^7.10.4",
- "@babel/plugin-transform-duplicate-keys": "^7.10.4",
- "@babel/plugin-transform-exponentiation-operator": "^7.10.4",
- "@babel/plugin-transform-for-of": "^7.10.4",
- "@babel/plugin-transform-function-name": "^7.10.4",
- "@babel/plugin-transform-literals": "^7.10.4",
- "@babel/plugin-transform-member-expression-literals": "^7.10.4",
- "@babel/plugin-transform-modules-amd": "^7.10.4",
- "@babel/plugin-transform-modules-commonjs": "^7.10.4",
- "@babel/plugin-transform-modules-systemjs": "^7.10.4",
- "@babel/plugin-transform-modules-umd": "^7.10.4",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4",
- "@babel/plugin-transform-new-target": "^7.10.4",
- "@babel/plugin-transform-object-super": "^7.10.4",
- "@babel/plugin-transform-parameters": "^7.10.4",
- "@babel/plugin-transform-property-literals": "^7.10.4",
- "@babel/plugin-transform-regenerator": "^7.10.4",
- "@babel/plugin-transform-reserved-words": "^7.10.4",
- "@babel/plugin-transform-shorthand-properties": "^7.10.4",
- "@babel/plugin-transform-spread": "^7.10.4",
- "@babel/plugin-transform-sticky-regex": "^7.10.4",
- "@babel/plugin-transform-template-literals": "^7.10.4",
- "@babel/plugin-transform-typeof-symbol": "^7.10.4",
- "@babel/plugin-transform-unicode-escapes": "^7.10.4",
- "@babel/plugin-transform-unicode-regex": "^7.10.4",
- "@babel/preset-modules": "^0.1.3",
- "@babel/types": "^7.10.4",
- "browserslist": "^4.12.0",
- "core-js-compat": "^3.6.2",
- "invariant": "^2.2.2",
- "levenary": "^1.1.1",
- "semver": "^5.5.0"
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz",
+ "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "7.14.7",
+ "@babel/helper-compilation-targets": "7.14.5",
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/helper-validator-option": "7.14.5",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "7.14.5",
+ "@babel/plugin-proposal-async-generator-functions": "7.14.7",
+ "@babel/plugin-proposal-class-properties": "7.14.5",
+ "@babel/plugin-proposal-class-static-block": "7.14.5",
+ "@babel/plugin-proposal-dynamic-import": "7.14.5",
+ "@babel/plugin-proposal-export-namespace-from": "7.14.5",
+ "@babel/plugin-proposal-json-strings": "7.14.5",
+ "@babel/plugin-proposal-logical-assignment-operators": "7.14.5",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "7.14.5",
+ "@babel/plugin-proposal-numeric-separator": "7.14.5",
+ "@babel/plugin-proposal-object-rest-spread": "7.14.7",
+ "@babel/plugin-proposal-optional-catch-binding": "7.14.5",
+ "@babel/plugin-proposal-optional-chaining": "7.14.5",
+ "@babel/plugin-proposal-private-methods": "7.14.5",
+ "@babel/plugin-proposal-private-property-in-object": "7.14.5",
+ "@babel/plugin-proposal-unicode-property-regex": "7.14.5",
+ "@babel/plugin-syntax-async-generators": "7.8.4",
+ "@babel/plugin-syntax-class-properties": "7.12.13",
+ "@babel/plugin-syntax-class-static-block": "7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "7.8.3",
+ "@babel/plugin-syntax-json-strings": "7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "7.14.5",
+ "@babel/plugin-syntax-top-level-await": "7.14.5",
+ "@babel/plugin-transform-arrow-functions": "7.14.5",
+ "@babel/plugin-transform-async-to-generator": "7.14.5",
+ "@babel/plugin-transform-block-scoped-functions": "7.14.5",
+ "@babel/plugin-transform-block-scoping": "7.14.5",
+ "@babel/plugin-transform-classes": "7.14.5",
+ "@babel/plugin-transform-computed-properties": "7.14.5",
+ "@babel/plugin-transform-destructuring": "7.14.7",
+ "@babel/plugin-transform-dotall-regex": "7.14.5",
+ "@babel/plugin-transform-duplicate-keys": "7.14.5",
+ "@babel/plugin-transform-exponentiation-operator": "7.14.5",
+ "@babel/plugin-transform-for-of": "7.14.5",
+ "@babel/plugin-transform-function-name": "7.14.5",
+ "@babel/plugin-transform-literals": "7.14.5",
+ "@babel/plugin-transform-member-expression-literals": "7.14.5",
+ "@babel/plugin-transform-modules-amd": "7.14.5",
+ "@babel/plugin-transform-modules-commonjs": "7.14.5",
+ "@babel/plugin-transform-modules-systemjs": "7.14.5",
+ "@babel/plugin-transform-modules-umd": "7.14.5",
+ "@babel/plugin-transform-named-capturing-groups-regex": "7.14.7",
+ "@babel/plugin-transform-new-target": "7.14.5",
+ "@babel/plugin-transform-object-super": "7.14.5",
+ "@babel/plugin-transform-parameters": "7.14.5",
+ "@babel/plugin-transform-property-literals": "7.14.5",
+ "@babel/plugin-transform-regenerator": "7.14.5",
+ "@babel/plugin-transform-reserved-words": "7.14.5",
+ "@babel/plugin-transform-shorthand-properties": "7.14.5",
+ "@babel/plugin-transform-spread": "7.14.6",
+ "@babel/plugin-transform-sticky-regex": "7.14.5",
+ "@babel/plugin-transform-template-literals": "7.14.5",
+ "@babel/plugin-transform-typeof-symbol": "7.14.5",
+ "@babel/plugin-transform-unicode-escapes": "7.14.5",
+ "@babel/plugin-transform-unicode-regex": "7.14.5",
+ "@babel/preset-modules": "0.1.4",
+ "@babel/types": "7.14.5",
+ "babel-plugin-polyfill-corejs2": "0.2.2",
+ "babel-plugin-polyfill-corejs3": "0.2.3",
+ "babel-plugin-polyfill-regenerator": "0.2.2",
+ "core-js-compat": "3.15.1",
+ "semver": "6.3.0"
}
},
"@babel/preset-modules": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz",
- "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==",
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+ "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
- "@babel/plugin-transform-dotall-regex": "^7.4.4",
- "@babel/types": "^7.4.4",
- "esutils": "^2.0.2"
+ "@babel/helper-plugin-utils": "7.14.5",
+ "@babel/plugin-proposal-unicode-property-regex": "7.14.5",
+ "@babel/plugin-transform-dotall-regex": "7.14.5",
+ "@babel/types": "7.14.5",
+ "esutils": "2.0.3"
}
},
"@babel/runtime": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz",
- "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==",
+ "version": "7.14.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz",
+ "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "0.13.7"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.13.7",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+ "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/runtime-corejs3": {
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz",
+ "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==",
"dev": true,
"requires": {
- "regenerator-runtime": "^0.13.4"
+ "core-js-pure": "3.15.1",
+ "regenerator-runtime": "0.13.7"
},
"dependencies": {
"regenerator-runtime": {
@@ -949,40 +1084,40 @@
}
},
"@babel/template": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
- "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz",
+ "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.10.4",
- "@babel/parser": "^7.10.4",
- "@babel/types": "^7.10.4"
+ "@babel/code-frame": "7.14.5",
+ "@babel/parser": "7.14.7",
+ "@babel/types": "7.14.5"
}
},
"@babel/traverse": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz",
- "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.10.4",
- "@babel/generator": "^7.10.5",
- "@babel/helper-function-name": "^7.10.4",
- "@babel/helper-split-export-declaration": "^7.10.4",
- "@babel/parser": "^7.10.5",
- "@babel/types": "^7.10.5",
- "debug": "^4.1.0",
- "globals": "^11.1.0",
- "lodash": "^4.17.19"
+ "version": "7.14.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz",
+ "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.14.5",
+ "@babel/generator": "7.14.5",
+ "@babel/helper-function-name": "7.14.5",
+ "@babel/helper-hoist-variables": "7.14.5",
+ "@babel/helper-split-export-declaration": "7.14.5",
+ "@babel/parser": "7.14.7",
+ "@babel/types": "7.14.5",
+ "debug": "4.3.1",
+ "globals": "11.12.0"
},
"dependencies": {
"debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.2"
}
},
"ms": {
@@ -994,46 +1129,129 @@
}
},
"@babel/types": {
- "version": "7.10.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz",
- "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
+ "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.10.4",
- "lodash": "^4.17.19",
- "to-fast-properties": "^2.0.0"
+ "@babel/helper-validator-identifier": "7.14.5",
+ "to-fast-properties": "2.0.0"
}
},
- "@cnakazawa/watch": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
- "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
+ "@eslint/eslintrc": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz",
+ "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==",
"dev": true,
"requires": {
- "exec-sh": "^0.3.2",
- "minimist": "^1.2.0"
+ "ajv": "6.12.6",
+ "debug": "4.3.1",
+ "espree": "7.3.1",
+ "globals": "13.9.0",
+ "ignore": "4.0.6",
+ "import-fresh": "3.3.0",
+ "js-yaml": "3.14.1",
+ "minimatch": "3.0.4",
+ "strip-json-comments": "3.1.1"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "3.1.3",
+ "fast-json-stable-stringify": "2.1.0",
+ "json-schema-traverse": "0.4.1",
+ "uri-js": "4.4.1"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "globals": {
+ "version": "13.9.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz",
+ "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==",
+ "dev": true,
+ "requires": {
+ "type-fest": "0.20.2"
+ }
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.10",
+ "esprima": "4.0.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ }
}
},
"@gulp-sourcemaps/identity-map": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz",
- "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz",
+ "integrity": "sha512-Tb+nSISZku+eQ4X1lAkevcQa+jknn/OVUgZ3XCxEKIsLsqYuPoJwJOPQeaOk75X3WPftb29GWY1eqE7GLsXb1Q==",
"dev": true,
"requires": {
- "acorn": "^5.0.3",
- "css": "^2.2.1",
- "normalize-path": "^2.1.1",
- "source-map": "^0.6.0",
- "through2": "^2.0.3"
+ "acorn": "6.4.2",
+ "normalize-path": "3.0.0",
+ "postcss": "7.0.36",
+ "source-map": "0.6.1",
+ "through2": "3.0.2"
},
"dependencies": {
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "acorn": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
+ "dev": true
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "postcss": {
+ "version": "7.0.36",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz",
+ "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==",
"dev": true,
"requires": {
- "remove-trailing-separator": "^1.0.1"
+ "chalk": "2.4.2",
+ "source-map": "0.6.1",
+ "supports-color": "6.1.0"
}
},
"source-map": {
@@ -1041,6 +1259,25 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
+ },
+ "supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "through2": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
+ "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.4",
+ "readable-stream": "3.6.0"
+ }
}
}
},
@@ -1050,8 +1287,8 @@
"integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=",
"dev": true,
"requires": {
- "normalize-path": "^2.0.1",
- "through2": "^2.0.3"
+ "normalize-path": "2.1.1",
+ "through2": "2.0.5"
},
"dependencies": {
"normalize-path": {
@@ -1060,888 +1297,150 @@
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
"dev": true,
"requires": {
- "remove-trailing-separator": "^1.0.1"
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
}
}
}
},
"@istanbuljs/schema": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
- "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
"dev": true
},
- "@jest/console": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz",
- "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==",
+ "@jest/types": {
+ "version": "27.0.2",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.2.tgz",
+ "integrity": "sha512-XpjCtJ/99HB4PmyJ2vgmN7vT+JLP7RW1FBT9RgnMFS4Dt7cvIyBee8O3/j98aUZ34ZpenPZFqmaaObWSeL65dg==",
"dev": true,
"requires": {
- "@jest/source-map": "^24.9.0",
- "chalk": "^2.0.1",
- "slash": "^2.0.0"
- },
- "dependencies": {
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- }
- }
- },
- "@jest/core": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz",
- "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==",
- "dev": true,
- "requires": {
- "@jest/console": "^24.7.1",
- "@jest/reporters": "^24.9.0",
- "@jest/test-result": "^24.9.0",
- "@jest/transform": "^24.9.0",
- "@jest/types": "^24.9.0",
- "ansi-escapes": "^3.0.0",
- "chalk": "^2.0.1",
- "exit": "^0.1.2",
- "graceful-fs": "^4.1.15",
- "jest-changed-files": "^24.9.0",
- "jest-config": "^24.9.0",
- "jest-haste-map": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-regex-util": "^24.3.0",
- "jest-resolve": "^24.9.0",
- "jest-resolve-dependencies": "^24.9.0",
- "jest-runner": "^24.9.0",
- "jest-runtime": "^24.9.0",
- "jest-snapshot": "^24.9.0",
- "jest-util": "^24.9.0",
- "jest-validate": "^24.9.0",
- "jest-watcher": "^24.9.0",
- "micromatch": "^3.1.10",
- "p-each-series": "^1.0.0",
- "realpath-native": "^1.1.0",
- "rimraf": "^2.5.4",
- "slash": "^2.0.0",
- "strip-ansi": "^5.0.0"
+ "@types/istanbul-lib-coverage": "2.0.3",
+ "@types/istanbul-reports": "3.0.1",
+ "@types/node": "15.12.4",
+ "@types/yargs": "16.0.3",
+ "chalk": "4.1.1"
},
"dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "color-convert": "2.0.1"
}
},
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
- "ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
- "dev": true
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
+ "has-flag": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "jest-message-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
- "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
- "stack-utils": "^1.0.1"
- }
- },
- "jest-regex-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
- "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==",
- "dev": true
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- },
- "stack-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
- "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "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"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
+ "has-flag": "4.0.0"
}
}
}
},
- "@jest/environment": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz",
- "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==",
+ "@jsdevtools/coverage-istanbul-loader": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz",
+ "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==",
"dev": true,
"requires": {
- "@jest/fake-timers": "^24.9.0",
- "@jest/transform": "^24.9.0",
- "@jest/types": "^24.9.0",
- "jest-mock": "^24.9.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- }
+ "convert-source-map": "1.8.0",
+ "istanbul-lib-instrument": "4.0.3",
+ "loader-utils": "2.0.0",
+ "merge-source-map": "1.1.0",
+ "schema-utils": "2.7.1"
}
},
- "@jest/fake-timers": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz",
- "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==",
+ "@sindresorhus/is": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz",
+ "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==",
+ "dev": true
+ },
+ "@sinonjs/commons": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
+ "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "jest-message-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
- "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
- "stack-utils": "^1.0.1"
- }
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- },
- "stack-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
- "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
- "dev": true
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- }
- }
- },
- "@jest/reporters": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz",
- "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==",
- "dev": true,
- "requires": {
- "@jest/environment": "^24.9.0",
- "@jest/test-result": "^24.9.0",
- "@jest/transform": "^24.9.0",
- "@jest/types": "^24.9.0",
- "chalk": "^2.0.1",
- "exit": "^0.1.2",
- "glob": "^7.1.2",
- "istanbul-lib-coverage": "^2.0.2",
- "istanbul-lib-instrument": "^3.0.1",
- "istanbul-lib-report": "^2.0.4",
- "istanbul-lib-source-maps": "^3.0.1",
- "istanbul-reports": "^2.2.6",
- "jest-haste-map": "^24.9.0",
- "jest-resolve": "^24.9.0",
- "jest-runtime": "^24.9.0",
- "jest-util": "^24.9.0",
- "jest-worker": "^24.6.0",
- "node-notifier": "^5.4.2",
- "slash": "^2.0.0",
- "source-map": "^0.6.0",
- "string-length": "^2.0.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "istanbul-lib-coverage": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
- "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
- "dev": true
- },
- "istanbul-lib-instrument": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
- "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
- "dev": true,
- "requires": {
- "@babel/generator": "^7.4.0",
- "@babel/parser": "^7.4.3",
- "@babel/template": "^7.4.0",
- "@babel/traverse": "^7.4.3",
- "@babel/types": "^7.4.0",
- "istanbul-lib-coverage": "^2.0.5",
- "semver": "^6.0.0"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
+ "type-detect": "4.0.8"
}
},
- "@jest/source-map": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz",
- "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==",
+ "@sinonjs/formatio": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz",
+ "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==",
"dev": true,
"requires": {
- "callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "@jest/test-result": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz",
- "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==",
- "dev": true,
- "requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- }
- }
- },
- "@jest/test-sequencer": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz",
- "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==",
- "dev": true,
- "requires": {
- "@jest/test-result": "^24.9.0",
- "jest-haste-map": "^24.9.0",
- "jest-runner": "^24.9.0",
- "jest-runtime": "^24.9.0"
- }
- },
- "@jest/transform": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz",
- "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.1.0",
- "@jest/types": "^24.9.0",
- "babel-plugin-istanbul": "^5.1.0",
- "chalk": "^2.0.1",
- "convert-source-map": "^1.4.0",
- "fast-json-stable-stringify": "^2.0.0",
- "graceful-fs": "^4.1.15",
- "jest-haste-map": "^24.9.0",
- "jest-regex-util": "^24.9.0",
- "jest-util": "^24.9.0",
- "micromatch": "^3.1.10",
- "pirates": "^4.0.1",
- "realpath-native": "^1.1.0",
- "slash": "^2.0.0",
- "source-map": "^0.6.1",
- "write-file-atomic": "2.4.1"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "jest-regex-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
- "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==",
- "dev": true
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- }
- }
- },
- "@jest/types": {
- "version": "26.1.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz",
- "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^15.0.0",
- "chalk": "^4.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "@jsdevtools/coverage-istanbul-loader": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz",
- "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==",
- "dev": true,
- "requires": {
- "convert-source-map": "^1.7.0",
- "istanbul-lib-instrument": "^4.0.3",
- "loader-utils": "^2.0.0",
- "merge-source-map": "^1.1.0",
- "schema-utils": "^2.7.0"
- }
- },
- "@sindresorhus/is": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.0.0.tgz",
- "integrity": "sha512-kqA5I6Yun7PBHk8WN9BBP1c7FfN2SrD05GuVSEYPqDb4nerv7HqYfgBfMIKmT/EuejURkJKLZuLyGKGs6WEG9w==",
- "dev": true
- },
- "@sinonjs/commons": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz",
- "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==",
- "dev": true,
- "requires": {
- "type-detect": "4.0.8"
- }
- },
- "@sinonjs/formatio": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz",
- "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==",
- "dev": true,
- "requires": {
- "samsam": "1.3.0"
+ "samsam": "1.3.0"
}
},
"@sinonjs/samsam": {
@@ -1950,9 +1449,9 @@
"integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==",
"dev": true,
"requires": {
- "@sinonjs/commons": "^1.3.0",
- "array-from": "^2.1.1",
- "lodash": "^4.17.15"
+ "@sinonjs/commons": "1.8.3",
+ "array-from": "2.1.1",
+ "lodash": "4.17.21"
}
},
"@sinonjs/text-encoding": {
@@ -1967,74 +1466,101 @@
"integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==",
"dev": true,
"requires": {
- "defer-to-connect": "^2.0.0"
+ "defer-to-connect": "2.0.1"
}
},
- "@types/babel__core": {
- "version": "7.1.9",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz",
- "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
+ "@types/aria-query": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.1.tgz",
+ "integrity": "sha512-S6oPal772qJZHoRZLFc/XoZW2gFvwXusYUmXPXkgxJLuEk2vOt7jc4Yo6z/vtI0EBkbPBVrJJ0B+prLIKiWqHg==",
+ "dev": true
},
- "@types/babel__generator": {
- "version": "7.6.1",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz",
- "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==",
+ "@types/cacheable-request": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz",
+ "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.0.0"
+ "@types/http-cache-semantics": "4.0.0",
+ "@types/keyv": "3.1.1",
+ "@types/node": "15.12.4",
+ "@types/responselike": "1.0.0"
}
},
- "@types/babel__template": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz",
- "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
+ "@types/component-emitter": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
+ "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==",
+ "dev": true
+ },
+ "@types/cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==",
+ "dev": true
+ },
+ "@types/cors": {
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz",
+ "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==",
+ "dev": true
+ },
+ "@types/easy-table": {
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/@types/easy-table/-/easy-table-0.0.32.tgz",
+ "integrity": "sha512-zKh0f/ixYFnr3Ldf5ZJTi1ZpnRqAynTTtVyGvWDf/TT12asE8ac98t3/WGWfFdRPp/qsccxg82C/Kl3NPNhqEw==",
+ "dev": true
},
- "@types/babel__traverse": {
- "version": "7.0.13",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz",
- "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==",
+ "@types/ejs": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.0.6.tgz",
+ "integrity": "sha512-fj1hi+ZSW0xPLrJJD+YNwIh9GZbyaIepG26E/gXvp8nCa2pYokxUYO1sK9qjGxp2g8ryZYuon7wmjpwE2cyASQ==",
+ "dev": true
+ },
+ "@types/estree": {
+ "version": "0.0.48",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz",
+ "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==",
"dev": true,
- "requires": {
- "@babel/types": "^7.3.0"
- }
+ "optional": true
},
- "@types/cacheable-request": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz",
- "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==",
+ "@types/expect": {
+ "version": "1.20.4",
+ "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz",
+ "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==",
+ "dev": true
+ },
+ "@types/fibers": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/fibers/-/fibers-3.1.0.tgz",
+ "integrity": "sha512-1o3I9xtk2PZFxwaLCC6gTaBfBZ5rvw/DSZZPK89fwuwO6LNrzSbC6rEs1xI0bQ3fCRWmO+uNJQQeD2J56oTMDg==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "9.0.11",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.11.tgz",
+ "integrity": "sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==",
"dev": true,
"requires": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "*",
- "@types/node": "*",
- "@types/responselike": "*"
+ "@types/node": "15.12.4"
}
},
- "@types/color-name": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
- "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
- "dev": true
- },
"@types/http-cache-semantics": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz",
"integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==",
"dev": true
},
+ "@types/inquirer": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-7.3.2.tgz",
+ "integrity": "sha512-EkeX/hU0SWinA2c7Qu/+6+7KbepFPYJcjankUgtA/VSY6BlVHybL0Cgyey9PDbXwhNXnNGBLU3t+MORp23RgAw==",
+ "dev": true,
+ "requires": {
+ "@types/through": "0.0.30",
+ "rxjs": "6.6.7"
+ }
+ },
"@types/istanbul-lib-coverage": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
@@ -2047,23 +1573,22 @@
"integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "*"
+ "@types/istanbul-lib-coverage": "2.0.3"
}
},
"@types/istanbul-reports": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
- "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
+ "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "*",
- "@types/istanbul-lib-report": "*"
+ "@types/istanbul-lib-report": "3.0.0"
}
},
"@types/json-schema": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
- "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==",
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
+ "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
"dev": true
},
"@types/json5": {
@@ -2078,119 +1603,353 @@
"integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==",
"dev": true,
"requires": {
- "@types/node": "*"
+ "@types/node": "15.12.4"
}
},
- "@types/node": {
- "version": "14.0.24",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.24.tgz",
- "integrity": "sha512-btt/oNOiDWcSuI721MdL8VQGnjsKjlTMdrKyTcLCKeQp/n4AAMFJ961wMbp+09y8WuGPClDEv07RIItdXKIXAA==",
+ "@types/lodash": {
+ "version": "4.14.170",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz",
+ "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==",
"dev": true
},
- "@types/puppeteer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-3.0.1.tgz",
- "integrity": "sha512-t03eNKCvWJXhQ8wkc5C6GYuSqMEdKLOX0GLMGtks25YZr38wKZlKTwGM/BoAPVtdysX7Bb9tdwrDS1+NrW3RRA==",
+ "@types/lodash.flattendeep": {
+ "version": "4.4.6",
+ "resolved": "https://registry.npmjs.org/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.6.tgz",
+ "integrity": "sha512-uLm2MaRVlqJSGsMK0RZpP5T3KqReq+9WbYDHCUhBhp98v56hMG/Yht52bsoTSui9xz2mUvQ9NfG3LrNGDL92Ng==",
"dev": true,
"requires": {
- "@types/node": "*"
+ "@types/lodash": "4.14.170"
}
},
- "@types/responselike": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
- "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
+ "@types/lodash.pickby": {
+ "version": "4.6.6",
+ "resolved": "https://registry.npmjs.org/@types/lodash.pickby/-/lodash.pickby-4.6.6.tgz",
+ "integrity": "sha512-NFa13XxlMd9eFi0UFZFWIztpMpXhozbijrx3Yb1viYZphT7jyopIFVoIRF4eYMjruWNEG1rnyrRmg/8ej9T8Iw==",
"dev": true,
"requires": {
- "@types/node": "*"
+ "@types/lodash": "4.14.170"
}
},
- "@types/stack-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
- "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==",
- "dev": true
+ "@types/lodash.union": {
+ "version": "4.6.6",
+ "resolved": "https://registry.npmjs.org/@types/lodash.union/-/lodash.union-4.6.6.tgz",
+ "integrity": "sha512-Wu0ZEVNcyCz8eAn6TlUbYWZoGbH9E+iOHxAZbwUoCEXdUiy6qpcz5o44mMXViM4vlPLLCPlkAubEP1gokoSZaw==",
+ "dev": true,
+ "requires": {
+ "@types/lodash": "4.14.170"
+ }
},
- "@types/yargs": {
- "version": "15.0.5",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz",
- "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==",
+ "@types/mdast": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
+ "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "@types/unist": "2.0.3"
}
},
- "@types/yargs-parser": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
- "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
+ "@types/minimist": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz",
+ "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==",
"dev": true
},
- "@types/yauzl": {
- "version": "2.9.1",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz",
- "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==",
+ "@types/mocha": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz",
+ "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "15.12.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz",
+ "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==",
+ "dev": true
+ },
+ "@types/normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
+ "dev": true
+ },
+ "@types/puppeteer": {
+ "version": "5.4.3",
+ "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.3.tgz",
+ "integrity": "sha512-3nE8YgR9DIsgttLW+eJf6mnXxq8Ge+27m5SU3knWmrlfl6+KOG0Bf9f7Ua7K+C4BnaTMAh3/UpySqdAYvrsvjg==",
"dev": true,
- "optional": true,
"requires": {
- "@types/node": "*"
+ "@types/node": "15.12.4"
}
},
- "@wdio/browserstack-service": {
- "version": "6.1.15",
- "resolved": "https://registry.npmjs.org/@wdio/browserstack-service/-/browserstack-service-6.1.15.tgz",
- "integrity": "sha512-q8qLa44wGSB3tIuZ0yquvAZqr2W7vEwupWiOd1ct0CSYgd4yX/nLd8oypqJCc8jU1ZwNAhu+V3/6hszvwx+HbA==",
+ "@types/recursive-readdir": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.0.tgz",
+ "integrity": "sha512-HGk753KRu2N4mWduovY4BLjYq4jTOL29gV2OfGdGxHcPSWGFkC5RRIdk+VTs5XmYd7MVAD+JwKrcb5+5Y7FOCg==",
"dev": true,
"requires": {
- "@wdio/logger": "6.0.16",
- "browserstack-local": "^1.4.5",
- "got": "^11.0.2"
+ "@types/node": "15.12.4"
}
},
- "@wdio/cli": {
- "version": "6.3.4",
- "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-6.3.4.tgz",
- "integrity": "sha512-eXA4rR6DwhNtXx1Hxknwgl7jGt/q4ZErCB8aOX9rowEoPOxwPQStd6yJcqI2QE8+AC1S72PKC4w+0WImL+M6Bw==",
- "dev": true,
- "requires": {
- "@wdio/config": "6.1.14",
- "@wdio/logger": "6.0.16",
- "@wdio/utils": "6.3.0",
- "async-exit-hook": "^2.0.1",
- "chalk": "^4.0.0",
- "chokidar": "^3.0.0",
- "cli-spinners": "^2.1.0",
- "ejs": "^3.0.1",
- "fs-extra": "^9.0.0",
- "inquirer": "^7.0.0",
- "lodash.flattendeep": "^4.4.0",
- "lodash.pickby": "^4.6.0",
- "lodash.union": "^4.6.0",
- "mkdirp": "^1.0.4",
- "recursive-readdir": "^2.2.2",
- "webdriverio": "6.3.4",
- "yargs": "^15.0.1",
- "yarn-install": "^1.0.0"
+ "@types/responselike": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
+ "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "15.12.4"
+ }
+ },
+ "@types/stack-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz",
+ "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==",
+ "dev": true
+ },
+ "@types/stream-buffers": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stream-buffers/-/stream-buffers-3.0.3.tgz",
+ "integrity": "sha512-NeFeX7YfFZDYsCfbuaOmFQ0OjSmHreKBpp7MQ4alWQBHeh2USLsj7qyMyn9t82kjqIX516CR/5SRHnARduRtbQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "15.12.4"
+ }
+ },
+ "@types/through": {
+ "version": "0.0.30",
+ "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz",
+ "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "15.12.4"
+ }
+ },
+ "@types/unist": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
+ "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
+ "dev": true
+ },
+ "@types/vinyl": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.4.tgz",
+ "integrity": "sha512-2o6a2ixaVI2EbwBPg1QYLGQoHK56p/8X/sGfKbFC8N6sY9lfjsMf/GprtkQkSya0D4uRiutRZ2BWj7k3JvLsAQ==",
+ "dev": true,
+ "requires": {
+ "@types/expect": "1.20.4",
+ "@types/node": "15.12.4"
+ }
+ },
+ "@types/which": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.2.tgz",
+ "integrity": "sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA==",
+ "dev": true
+ },
+ "@types/yargs": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.3.tgz",
+ "integrity": "sha512-YlFfTGS+zqCgXuXNV26rOIeETOkXnGQXP/pjjL9P0gO/EP9jTmc7pUBhx+jVEIxpq41RX33GQ7N3DzOSfZoglQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "20.2.0"
+ }
+ },
+ "@types/yargs-parser": {
+ "version": "20.2.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz",
+ "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==",
+ "dev": true
+ },
+ "@types/yauzl": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz",
+ "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/node": "15.12.4"
+ }
+ },
+ "@ungap/promise-all-settled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+ "dev": true
+ },
+ "@vue/compiler-core": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.1.2.tgz",
+ "integrity": "sha512-nHmq7vLjq/XM2IMbZUcKWoH5sPXa2uR/nIKZtjbK5F3TcbnYE/zKsrSUR9WZJ03unlwotNBX1OyxVt9HbWD7/Q==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "7.14.7",
+ "@babel/types": "7.14.5",
+ "@vue/shared": "3.1.2",
+ "estree-walker": "2.0.2",
+ "source-map": "0.6.1"
},
"dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "@vue/compiler-dom": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.1.2.tgz",
+ "integrity": "sha512-k2+SWcWH0jL6WQAX7Or2ONqu5MbtTgTO0dJrvebQYzgqaKMXNI90RNeWeCxS4BnNFMDONpHBeFgbwbnDWIkmRg==",
+ "dev": true,
+ "requires": {
+ "@vue/compiler-core": "3.1.2",
+ "@vue/shared": "3.1.2"
+ }
+ },
+ "@vue/compiler-sfc": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.1.2.tgz",
+ "integrity": "sha512-SeG/2+DvwejQ7oAiSx8BrDh5qOdqCYHGClPiTvVIHTfSIHiS2JjMbCANdDCjHkTOh/O7WZzo2JhdKm98bRBxTw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@babel/parser": "7.14.7",
+ "@babel/types": "7.14.5",
+ "@types/estree": "0.0.48",
+ "@vue/compiler-core": "3.1.2",
+ "@vue/compiler-dom": "3.1.2",
+ "@vue/compiler-ssr": "3.1.2",
+ "@vue/shared": "3.1.2",
+ "consolidate": "0.16.0",
+ "estree-walker": "2.0.2",
+ "hash-sum": "2.0.0",
+ "lru-cache": "5.1.1",
+ "magic-string": "0.25.7",
+ "merge-source-map": "1.1.0",
+ "postcss": "8.3.5",
+ "postcss-modules": "4.1.3",
+ "postcss-selector-parser": "6.0.6",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "yallist": "3.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "@vue/compiler-ssr": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.1.2.tgz",
+ "integrity": "sha512-BwXo9LFk5OSWdMyZQ4bX1ELHX0Z/9F+ld/OaVnpUPzAZCHslBYLvyKUVDwv2C/lpLjRffpC2DOUEdl1+RP1aGg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@vue/compiler-dom": "3.1.2",
+ "@vue/shared": "3.1.2"
+ }
+ },
+ "@vue/shared": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.2.tgz",
+ "integrity": "sha512-EmH/poaDWBPJaPILXNI/1fvUbArJQmmTyVCwvvyDYDFnkPoTclAbHRAtyIvqfez7jybTDn077HTNILpxlsoWhg==",
+ "dev": true
+ },
+ "@wdio/browserstack-service": {
+ "version": "6.12.1",
+ "resolved": "https://registry.npmjs.org/@wdio/browserstack-service/-/browserstack-service-6.12.1.tgz",
+ "integrity": "sha512-B4zYlaE8q1Jxb6ctcuUPlKL3inwloETwks+cB9fFtVMDf/HH2Cau3Pi0CoIs8435EI+J4/1LxLHQV2uhzbBSlQ==",
+ "dev": true,
+ "requires": {
+ "@wdio/logger": "6.10.10",
+ "browserstack-local": "1.4.8",
+ "got": "11.8.2"
+ }
+ },
+ "@wdio/cli": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-7.7.4.tgz",
+ "integrity": "sha512-npgpaIpPoSpyef1Pv0ZKyB5FJAZnDJiVphgda0RysXd6J0S3mlwzXrcIoapl28mmeWI6NIvvv65u0sominhsyQ==",
+ "dev": true,
+ "requires": {
+ "@types/ejs": "3.0.6",
+ "@types/fs-extra": "9.0.11",
+ "@types/inquirer": "7.3.2",
+ "@types/lodash.flattendeep": "4.4.6",
+ "@types/lodash.pickby": "4.6.6",
+ "@types/lodash.union": "4.6.6",
+ "@types/recursive-readdir": "2.2.0",
+ "@wdio/config": "7.7.3",
+ "@wdio/logger": "7.7.0",
+ "@wdio/types": "7.7.3",
+ "@wdio/utils": "7.7.3",
+ "async-exit-hook": "2.0.1",
+ "chalk": "4.1.1",
+ "chokidar": "3.5.2",
+ "cli-spinners": "2.6.0",
+ "ejs": "3.1.6",
+ "fs-extra": "10.0.0",
+ "inquirer": "8.1.1",
+ "lodash.flattendeep": "4.4.0",
+ "lodash.pickby": "4.6.0",
+ "lodash.union": "4.6.0",
+ "mkdirp": "1.0.4",
+ "recursive-readdir": "2.2.2",
+ "webdriverio": "7.7.4",
+ "yargs": "17.0.1",
+ "yarn-install": "1.0.0"
+ },
+ "dependencies": {
+ "@wdio/logger": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.7.0.tgz",
+ "integrity": "sha512-XX/OkC8NlvsBdhKsb9j7ZbuQtF/Vuo0xf38PXdqYtVezOrYbDuba0hPG++g/IGNuAF34ZbSi+49cvz4u5w92kQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "4.1.1",
+ "loglevel": "1.7.1",
+ "loglevel-plugin-prefix": "0.8.4",
+ "strip-ansi": "6.0.0"
+ }
+ },
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
+ "color-convert": "2.0.1"
}
},
"chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
"color-convert": {
@@ -2199,7 +1958,7 @@
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "color-name": "~1.1.4"
+ "color-name": "1.1.4"
}
},
"color-name": {
@@ -2215,64 +1974,60 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "has-flag": "4.0.0"
}
},
"yargs": {
- "version": "15.4.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
- "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "version": "17.0.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz",
+ "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==",
"dev": true,
"requires": {
- "cliui": "^6.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^4.1.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^4.2.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^18.1.2"
+ "cliui": "7.0.4",
+ "escalade": "3.1.1",
+ "get-caller-file": "2.0.5",
+ "require-directory": "2.1.1",
+ "string-width": "4.2.2",
+ "y18n": "5.0.8",
+ "yargs-parser": "20.2.9"
}
}
}
},
"@wdio/concise-reporter": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/@wdio/concise-reporter/-/concise-reporter-6.3.0.tgz",
- "integrity": "sha512-H7yILps+dKK1k4XoVE5HOVMpTHN321SFmjjMgtq1zfiC6Dph7Unl4ODmnyVLD5Kk3ycQ31PfOBr0QPyKnLUFiQ==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/@wdio/concise-reporter/-/concise-reporter-7.7.3.tgz",
+ "integrity": "sha512-2Ix20n48N+lvvU4NzqMP7z+daG748RRsmDqdstCoBrJgXV6frvu38HVHV90U5uKt5Vmp6/QQl05A4OliaNoO9w==",
"dev": true,
"requires": {
- "@wdio/reporter": "6.3.0",
- "chalk": "^4.0.0",
- "pretty-ms": "^7.0.0"
+ "@wdio/reporter": "7.7.3",
+ "@wdio/types": "7.7.3",
+ "chalk": "4.1.1",
+ "pretty-ms": "7.0.1"
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
+ "color-convert": "2.0.1"
}
},
"chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
"color-convert": {
@@ -2281,7 +2036,7 @@
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "color-name": "~1.1.4"
+ "color-name": "1.1.4"
}
},
"color-name": {
@@ -2297,70 +2052,57 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "has-flag": "4.0.0"
}
}
}
},
"@wdio/config": {
- "version": "6.1.14",
- "resolved": "https://registry.npmjs.org/@wdio/config/-/config-6.1.14.tgz",
- "integrity": "sha512-MXHMHwtkAblfnIxONs9aW//T9Fq5XIw3oH+tztcBRvNTTAIXmwHd+4sOjAwjpCdBSGs0C4kM/aTpGfwDZVURvQ==",
- "dev": true,
- "requires": {
- "@wdio/logger": "6.0.16",
- "deepmerge": "^4.0.0",
- "glob": "^7.1.2"
- }
- },
- "@wdio/local-runner": {
- "version": "6.3.4",
- "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-6.3.4.tgz",
- "integrity": "sha512-rKEhFXiNH6H2G86JTgy2cgtEFoNBZ50gRy+P1LEhc7Ko/dAYqYMC+Sy8lnbsDzxz6IZVlbubgs+y7GRREayqoQ==",
- "dev": true,
- "requires": {
- "@wdio/logger": "6.0.16",
- "@wdio/repl": "6.3.0",
- "@wdio/runner": "6.3.4",
- "async-exit-hook": "^2.0.1",
- "stream-buffers": "^3.0.2"
- }
- },
- "@wdio/logger": {
- "version": "6.0.16",
- "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-6.0.16.tgz",
- "integrity": "sha512-VbH5UnQIG/3sSMV+Y38+rOdwyK9mVA9vuL7iOngoTafHwUjL1MObfN/Cex84L4mGxIgfxCu6GV48iUmSuQ7sqA==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.7.3.tgz",
+ "integrity": "sha512-I8gkb5BjXLe6/9NK7OCA9Mc+A6xeGUqbYTRd4PNKdObE6HomKOxw4plVZCYF0DlD2FCo4OGrvYGmalojFsCMdA==",
"dev": true,
"requires": {
- "chalk": "^4.0.0",
- "loglevel": "^1.6.0",
- "loglevel-plugin-prefix": "^0.8.4",
- "strip-ansi": "^6.0.0"
+ "@wdio/logger": "7.7.0",
+ "@wdio/types": "7.7.3",
+ "deepmerge": "4.2.2",
+ "glob": "7.1.7"
},
"dependencies": {
+ "@wdio/logger": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.7.0.tgz",
+ "integrity": "sha512-XX/OkC8NlvsBdhKsb9j7ZbuQtF/Vuo0xf38PXdqYtVezOrYbDuba0hPG++g/IGNuAF34ZbSi+49cvz4u5w92kQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "4.1.1",
+ "loglevel": "1.7.1",
+ "loglevel-plugin-prefix": "0.8.4",
+ "strip-ansi": "6.0.0"
+ }
+ },
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
+ "color-convert": "2.0.1"
}
},
"chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
"color-convert": {
@@ -2369,7 +2111,7 @@
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "color-name": "~1.1.4"
+ "color-name": "1.1.4"
}
},
"color-name": {
@@ -2385,74 +2127,76 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "has-flag": "4.0.0"
}
}
}
},
- "@wdio/mocha-framework": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-6.3.0.tgz",
- "integrity": "sha512-3lLvzhDYWwOYmiJAjr2fm/nENq6g6uUOtkIeEQFp1kDyBQkDsH1PXGdFklQbRiQT8mAqOPhx1kvXrCA/XpWl7g==",
+ "@wdio/local-runner": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-7.7.4.tgz",
+ "integrity": "sha512-ubBr9+pDZuOg6i/EJdW8E71dXrE1A63+wsZH6lpdm1fFWqfRvjl+DTCdE2rtLhr44vNSmiHxIIQnCjvZXwjiFg==",
"dev": true,
"requires": {
- "@wdio/logger": "6.0.16",
- "@wdio/utils": "6.3.0",
- "expect-webdriverio": "^1.1.5",
- "mocha": "^8.0.1"
+ "@types/stream-buffers": "3.0.3",
+ "@wdio/logger": "7.7.0",
+ "@wdio/repl": "7.7.3",
+ "@wdio/runner": "7.7.4",
+ "@wdio/types": "7.7.3",
+ "async-exit-hook": "2.0.1",
+ "split2": "3.2.2",
+ "stream-buffers": "3.0.2"
},
"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
+ "@wdio/logger": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.7.0.tgz",
+ "integrity": "sha512-XX/OkC8NlvsBdhKsb9j7ZbuQtF/Vuo0xf38PXdqYtVezOrYbDuba0hPG++g/IGNuAF34ZbSi+49cvz4u5w92kQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "4.1.1",
+ "loglevel": "1.7.1",
+ "loglevel-plugin-prefix": "0.8.4",
+ "strip-ansi": "6.0.0"
+ }
},
- "chokidar": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
- "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "fsevents": "~2.1.2",
- "glob-parent": "~5.1.0",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.3.0"
+ "color-convert": "2.0.1"
}
},
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "color-name": "1.1.4"
}
},
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"has-flag": {
@@ -2461,244 +2205,457 @@
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"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
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
+ "has-flag": "4.0.0"
}
- },
- "mocha": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz",
- "integrity": "sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==",
+ }
+ }
+ },
+ "@wdio/logger": {
+ "version": "6.10.10",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-6.10.10.tgz",
+ "integrity": "sha512-2nh0hJz9HeZE0VIEMI+oPgjr/Q37ohrR9iqsl7f7GW5ik+PnKYCT9Eab5mR1GNMG60askwbskgGC1S9ygtvrSw==",
+ "dev": true,
+ "requires": {
+ "chalk": "4.1.1",
+ "loglevel": "1.7.1",
+ "loglevel-plugin-prefix": "0.8.4",
+ "strip-ansi": "6.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "ansi-colors": "4.1.1",
- "browser-stdout": "1.3.1",
- "chokidar": "3.3.1",
- "debug": "3.2.6",
- "diff": "4.0.2",
- "escape-string-regexp": "1.0.5",
- "find-up": "4.1.0",
- "glob": "7.1.6",
- "growl": "1.10.5",
- "he": "1.2.0",
- "js-yaml": "3.13.1",
- "log-symbols": "3.0.0",
- "minimatch": "3.0.4",
- "ms": "2.1.2",
- "object.assign": "4.1.0",
- "promise.allsettled": "1.0.2",
- "serialize-javascript": "3.0.0",
- "strip-json-comments": "3.0.1",
- "supports-color": "7.1.0",
- "which": "2.0.2",
- "wide-align": "1.1.3",
- "workerpool": "6.0.0",
- "yargs": "13.3.2",
- "yargs-parser": "13.1.2",
- "yargs-unparser": "1.6.0"
+ "color-convert": "2.0.1"
}
},
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
+ }
},
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "p-limit": "^2.0.0"
+ "color-name": "1.1.4"
}
},
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "readdirp": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz",
- "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "picomatch": "^2.0.7"
+ "has-flag": "4.0.0"
}
- },
- "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==",
+ }
+ }
+ },
+ "@wdio/mocha-framework": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-7.7.4.tgz",
+ "integrity": "sha512-zLhMJBAp4HOP0qGffCNSA1UBdRystn9o5y7EEQXU6Gu+ktrSOV/RU+pvd+kqHo6RfOIcwShljZVStf3zh8cY6Q==",
+ "dev": true,
+ "requires": {
+ "@types/mocha": "8.2.2",
+ "@wdio/logger": "7.7.0",
+ "@wdio/types": "7.7.3",
+ "@wdio/utils": "7.7.3",
+ "expect-webdriverio": "3.1.0",
+ "mocha": "9.0.1"
+ },
+ "dependencies": {
+ "@wdio/logger": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.7.0.tgz",
+ "integrity": "sha512-XX/OkC8NlvsBdhKsb9j7ZbuQtF/Vuo0xf38PXdqYtVezOrYbDuba0hPG++g/IGNuAF34ZbSi+49cvz4u5w92kQ==",
"dev": true,
"requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
+ "chalk": "4.1.1",
+ "loglevel": "1.7.1",
+ "loglevel-plugin-prefix": "0.8.4",
+ "strip-ansi": "6.0.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==",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "ansi-regex": "^4.1.0"
+ "color-convert": "2.0.1"
}
},
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "chokidar": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+ "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
"dev": true,
"requires": {
- "isexe": "^2.0.0"
+ "anymatch": "3.1.2",
+ "braces": "3.0.2",
+ "fsevents": "2.3.2",
+ "glob-parent": "5.1.2",
+ "is-binary-path": "2.1.0",
+ "is-glob": "4.0.1",
+ "normalize-path": "3.0.0",
+ "readdirp": "3.5.0"
}
},
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
+ "color-name": "1.1.4"
}
},
- "yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "dev": true,
- "requires": {
- "cliui": "^5.0.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^2.0.1",
- "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.1.2"
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
},
"dependencies": {
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "6.0.0",
+ "path-exists": "4.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "5.0.0"
+ }
+ },
+ "mocha": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.0.1.tgz",
+ "integrity": "sha512-9zwsavlRO+5csZu6iRtl3GHImAbhERoDsZwdRkdJ/bE+eVplmoxNKE901ZJ9LdSchYBjSCPbjKc5XvcAri2ylw==",
+ "dev": true,
+ "requires": {
+ "@ungap/promise-all-settled": "1.1.2",
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.1",
+ "debug": "4.3.1",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.1.7",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "3.0.4",
+ "ms": "2.1.3",
+ "nanoid": "3.1.23",
+ "serialize-javascript": "5.0.1",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "which": "2.0.2",
+ "wide-align": "1.1.3",
+ "workerpool": "6.1.4",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"dev": true,
"requires": {
- "locate-path": "^3.0.0"
+ "has-flag": "4.0.0"
}
}
}
},
- "yargs-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "3.1.0"
+ }
+ },
+ "readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "dev": true,
+ "requires": {
+ "picomatch": "2.3.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "4.0.0"
+ }
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
"requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
+ "cliui": "7.0.4",
+ "escalade": "3.1.1",
+ "get-caller-file": "2.0.5",
+ "require-directory": "2.1.1",
+ "string-width": "4.2.2",
+ "y18n": "5.0.8",
+ "yargs-parser": "20.2.4"
}
+ },
+ "yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true
}
}
},
"@wdio/protocols": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-6.3.0.tgz",
- "integrity": "sha512-1GKzfyCTLW5WkFd3W7NLACih+zNWU7c8kFurbCQXDK1ko1obqJEs7ZjBr85q5XqMWburdks5rDjyml2iEB2LBg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.7.4.tgz",
+ "integrity": "sha512-gfGPOjvqUws3/dTnrXbCYP2keYE6O5BK5qHWnOEu6c7ubE4hebxV8W5c822L7ntabc1e38+diEbM+qFuIT890Q==",
"dev": true
},
"@wdio/repl": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-6.3.0.tgz",
- "integrity": "sha512-FT3flKOqNdZNG1uYl+QpOfdZIgKAWhLfoQ0s+wL0crLeDNIFvvM2qSDhRBRDYV7a0IFyBi8Z975WBn0dlH03Ig==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.7.3.tgz",
+ "integrity": "sha512-7nhvUa3Zd5Ny9topJGRZwkomlveuO3RIv+jBUHgQ2jiDIGvG9MroHxKEniIbscVSsD32XFOOZY59kSpX1b50VQ==",
"dev": true,
"requires": {
- "@wdio/utils": "6.3.0"
+ "@wdio/utils": "7.7.3"
}
},
"@wdio/reporter": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-6.3.0.tgz",
- "integrity": "sha512-vbwjJvSKZUtsWtQMhuVqT7ZP6RIFAH4+ienjNwW30QPDi38OujZgxC2ZqRoZKsxck6cfTgkxrXfNaxHN0/LHKg==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-7.7.3.tgz",
+ "integrity": "sha512-zAUGgP/FZ3XF5s4RUcDGIAeum3WzkA9ll5lymytxhh/9Jj9/5c77o498ic3RGQlB8FTz+5SVmw08r7g3uekI8g==",
"dev": true,
"requires": {
- "fs-extra": "^9.0.0"
+ "@types/node": "14.17.4",
+ "@wdio/types": "7.7.3",
+ "fs-extra": "10.0.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "14.17.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.4.tgz",
+ "integrity": "sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A==",
+ "dev": true
+ }
}
},
"@wdio/runner": {
- "version": "6.3.4",
- "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-6.3.4.tgz",
- "integrity": "sha512-+iOXfTODsSVf9LFBFKAEZqvPzfIClwFCKu7GGFZ7lrOF1svMNzT/0UY0ETsCBZe61Gr8xiI0wbCEly+0DbEh6w==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-7.7.4.tgz",
+ "integrity": "sha512-Ahfrv3TM9y2KMjWI1xKc+tnLVO+X1/Gf5QPjprmLlRxf/rSQDfX+wMmQP/g0wsLtm4pXy0kR1K/76WWvZgzSkw==",
"dev": true,
"requires": {
- "@wdio/config": "6.1.14",
- "@wdio/logger": "6.0.16",
- "@wdio/utils": "6.3.0",
- "deepmerge": "^4.0.0",
- "gaze": "^1.1.2",
- "webdriver": "6.3.0",
- "webdriverio": "6.3.4"
+ "@wdio/config": "7.7.3",
+ "@wdio/logger": "7.7.0",
+ "@wdio/types": "7.7.3",
+ "@wdio/utils": "7.7.3",
+ "deepmerge": "4.2.2",
+ "gaze": "1.1.3",
+ "webdriver": "7.7.4",
+ "webdriverio": "7.7.4"
+ },
+ "dependencies": {
+ "@wdio/logger": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.7.0.tgz",
+ "integrity": "sha512-XX/OkC8NlvsBdhKsb9j7ZbuQtF/Vuo0xf38PXdqYtVezOrYbDuba0hPG++g/IGNuAF34ZbSi+49cvz4u5w92kQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "4.1.1",
+ "loglevel": "1.7.1",
+ "loglevel-plugin-prefix": "0.8.4",
+ "strip-ansi": "6.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "4.0.0"
+ }
+ }
}
},
"@wdio/spec-reporter": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-6.3.0.tgz",
- "integrity": "sha512-JGZAMcqiOloOw6xcIT5O8GORVaww6kslgH5kZGydVQyoNBj1ZKoLdEjqq2jklJsge1xsscdYdW9u9kMHwm25iA==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-7.7.3.tgz",
+ "integrity": "sha512-5elsNfZd3kbBaKY5IK5ZmdZsWZNSOCqXnM2fYryAh2RBoXbcXkak4D5PbLehusZhp6CQ7UpXEKf4BDDYfd0ebw==",
"dev": true,
"requires": {
- "@wdio/reporter": "6.3.0",
- "chalk": "^4.0.0",
- "easy-table": "^1.1.1",
- "pretty-ms": "^7.0.0"
+ "@types/easy-table": "0.0.32",
+ "@wdio/reporter": "7.7.3",
+ "@wdio/types": "7.7.3",
+ "chalk": "4.1.1",
+ "easy-table": "1.1.1",
+ "pretty-ms": "7.0.1"
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
+ "color-convert": "2.0.1"
}
},
"chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
"color-convert": {
@@ -2707,7 +2664,7 @@
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "color-name": "~1.1.4"
+ "color-name": "1.1.4"
}
},
"color-name": {
@@ -2723,34 +2680,182 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "has-flag": "4.0.0"
}
}
}
},
"@wdio/sync": {
- "version": "6.3.3",
- "resolved": "https://registry.npmjs.org/@wdio/sync/-/sync-6.3.3.tgz",
- "integrity": "sha512-WNq+hhkgk9LluKLP2nQ/9+EH8HNQnROFFHvYuznxb1aKj/zhZvqWuQPpmMWhPMBSTpkdbdLCYerZWKcamYOcJQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@wdio/sync/-/sync-7.7.4.tgz",
+ "integrity": "sha512-x0ZU78Je0yl05TfwiNtkKkJZ+90y6MndR4z5n/m6ADRzSGdFOazGJSFO0h2bN8MkPRusfqYsJwB6MKftCP0URA==",
+ "dev": true,
+ "requires": {
+ "@types/fibers": "3.1.0",
+ "@types/puppeteer": "5.4.3",
+ "@wdio/logger": "7.7.0",
+ "@wdio/types": "7.7.3",
+ "fibers": "5.0.0",
+ "webdriverio": "7.7.4"
+ },
+ "dependencies": {
+ "@wdio/logger": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.7.0.tgz",
+ "integrity": "sha512-XX/OkC8NlvsBdhKsb9j7ZbuQtF/Vuo0xf38PXdqYtVezOrYbDuba0hPG++g/IGNuAF34ZbSi+49cvz4u5w92kQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "4.1.1",
+ "loglevel": "1.7.1",
+ "loglevel-plugin-prefix": "0.8.4",
+ "strip-ansi": "6.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "4.0.0"
+ }
+ }
+ }
+ },
+ "@wdio/types": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.7.3.tgz",
+ "integrity": "sha512-ZZBQHCXKjZSQj9pf4df/QhfgQQj0vzm9hkK7YyNM+S+qnW0LExL8qQKLxTlGHDaYxk/+Jrd9pcZrJXRCoSnUaA==",
"dev": true,
"requires": {
- "@types/puppeteer": "^3.0.1",
- "@wdio/logger": "6.0.16",
- "fibers": "^4.0.1"
+ "@types/node": "14.17.4",
+ "got": "11.8.2"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "14.17.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.4.tgz",
+ "integrity": "sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A==",
+ "dev": true
+ }
}
},
"@wdio/utils": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-6.3.0.tgz",
- "integrity": "sha512-PbeC5fpieamgSAHf7S58MAyraGU1qKxnHdfGMG+ZIWiIo73oo4j/57CcH6ZawQ3YC1wEc/5q+VXg7N5hvqhJOQ==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.7.3.tgz",
+ "integrity": "sha512-bvOoE2gve8Z8HFguVw0RMp5BbSmJR4zSr8DwbwnA8RSL3NshKlRk33HWYLmKsxjkH+ZWI2ihFbpvLD4W4imXag==",
"dev": true,
"requires": {
- "@wdio/logger": "6.0.16"
+ "@wdio/logger": "7.7.0",
+ "@wdio/types": "7.7.3"
+ },
+ "dependencies": {
+ "@wdio/logger": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.7.0.tgz",
+ "integrity": "sha512-XX/OkC8NlvsBdhKsb9j7ZbuQtF/Vuo0xf38PXdqYtVezOrYbDuba0hPG++g/IGNuAF34ZbSi+49cvz4u5w92kQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "4.1.1",
+ "loglevel": "1.7.1",
+ "loglevel-plugin-prefix": "0.8.4",
+ "strip-ansi": "6.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "4.0.0"
+ }
+ }
}
},
"JSONStream": {
@@ -2759,16 +2864,10 @@
"integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
"dev": true,
"requires": {
- "jsonparse": "^1.2.0",
- "through": ">=2.2.7 <3"
+ "jsonparse": "1.3.1",
+ "through": "2.3.8"
}
},
- "abab": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz",
- "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==",
- "dev": true
- },
"abbrev": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
@@ -2780,14 +2879,14 @@
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"requires": {
- "mime-types": "~2.1.24",
+ "mime-types": "2.1.31",
"negotiator": "0.6.2"
}
},
"acorn": {
- "version": "5.7.4",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
- "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"acorn-dynamic-import": {
@@ -2796,7 +2895,7 @@
"integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
"dev": true,
"requires": {
- "acorn": "^4.0.3"
+ "acorn": "4.0.13"
},
"dependencies": {
"acorn": {
@@ -2807,51 +2906,33 @@
}
}
},
- "acorn-globals": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
- "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true
+ },
+ "acorn-node": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+ "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
"dev": true,
"requires": {
- "acorn": "^6.0.1",
- "acorn-walk": "^6.0.1"
- },
- "dependencies": {
- "acorn": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
- "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
- "dev": true
- }
- }
- },
- "acorn-jsx": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
- "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
- "dev": true,
- "requires": {
- "acorn": "^3.0.4"
- },
- "dependencies": {
- "acorn": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
- "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
- "dev": true
- }
+ "acorn": "7.4.1",
+ "acorn-walk": "7.2.0",
+ "xtend": "4.0.2"
}
},
"acorn-walk": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
- "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
"dev": true
},
- "after": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
- "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+ "add-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz",
+ "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=",
"dev": true
},
"agent-base": {
@@ -2866,10 +2947,10 @@
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"dev": true,
"requires": {
- "co": "^4.6.0",
- "fast-deep-equal": "^1.0.0",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.3.0"
+ "co": "4.6.0",
+ "fast-deep-equal": "1.1.0",
+ "fast-json-stable-stringify": "2.1.0",
+ "json-schema-traverse": "0.3.1"
},
"dependencies": {
"fast-deep-equal": {
@@ -2887,9 +2968,9 @@
}
},
"ajv-keywords": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.1.tgz",
- "integrity": "sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==",
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true
},
"align-text": {
@@ -2898,24 +2979,18 @@
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
"dev": true,
"requires": {
- "kind-of": "^3.0.2",
- "longest": "^1.0.1",
- "repeat-string": "^1.5.2"
+ "kind-of": "3.2.2",
+ "longest": "1.0.1",
+ "repeat-string": "1.6.1"
},
"dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
@@ -2933,12 +3008,12 @@
"dev": true
},
"ansi-escapes": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
- "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
"dev": true,
"requires": {
- "type-fest": "^0.11.0"
+ "type-fest": "0.21.3"
}
},
"ansi-gray": {
@@ -2968,7 +3043,7 @@
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
- "color-convert": "^1.9.0"
+ "color-convert": "1.9.3"
}
},
"ansi-wrap": {
@@ -2978,13 +3053,13 @@
"dev": true
},
"anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
"dev": true,
"requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
+ "normalize-path": "3.0.0",
+ "picomatch": "2.3.0"
}
},
"append-buffer": {
@@ -2993,31 +3068,22 @@
"integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
"dev": true,
"requires": {
- "buffer-equal": "^1.0.0"
- }
- },
- "append-transform": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
- "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
- "dev": true,
- "requires": {
- "default-require-extensions": "^1.0.0"
+ "buffer-equal": "1.0.0"
}
},
"archiver": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/archiver/-/archiver-4.0.2.tgz",
- "integrity": "sha512-B9IZjlGwaxF33UN4oPbfBkyA4V1SxNLeIhR1qY8sRXSsbdUkEHrrOvwlYFPx+8uQeCe9M+FG6KgO+imDmQ79CQ==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz",
+ "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==",
"dev": true,
"requires": {
- "archiver-utils": "^2.1.0",
- "async": "^3.2.0",
- "buffer-crc32": "^0.2.1",
- "glob": "^7.1.6",
- "readable-stream": "^3.6.0",
- "tar-stream": "^2.1.2",
- "zip-stream": "^3.0.1"
+ "archiver-utils": "2.1.0",
+ "async": "3.2.0",
+ "buffer-crc32": "0.2.13",
+ "readable-stream": "3.6.0",
+ "readdir-glob": "1.1.1",
+ "tar-stream": "2.2.0",
+ "zip-stream": "4.1.0"
},
"dependencies": {
"async": {
@@ -3034,16 +3100,16 @@
"integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
"dev": true,
"requires": {
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.0",
- "lazystream": "^1.0.0",
- "lodash.defaults": "^4.2.0",
- "lodash.difference": "^4.5.0",
- "lodash.flatten": "^4.4.0",
- "lodash.isplainobject": "^4.0.6",
- "lodash.union": "^4.6.0",
- "normalize-path": "^3.0.0",
- "readable-stream": "^2.0.0"
+ "glob": "7.1.7",
+ "graceful-fs": "4.2.6",
+ "lazystream": "1.0.0",
+ "lodash.defaults": "4.2.0",
+ "lodash.difference": "4.5.0",
+ "lodash.flatten": "4.4.0",
+ "lodash.isplainobject": "4.0.6",
+ "lodash.union": "4.6.0",
+ "normalize-path": "3.0.0",
+ "readable-stream": "2.3.7"
},
"dependencies": {
"readable-stream": {
@@ -3052,13 +3118,22 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
@@ -3070,12 +3145,19 @@
"dev": true
},
"argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "aria-query": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
+ "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
"dev": true,
"requires": {
- "sprintf-js": "~1.0.2"
+ "@babel/runtime": "7.14.6",
+ "@babel/runtime-corejs3": "7.14.7"
}
},
"arr-diff": {
@@ -3090,7 +3172,7 @@
"integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
"dev": true,
"requires": {
- "make-iterator": "^1.0.0"
+ "make-iterator": "1.0.1"
}
},
"arr-flatten": {
@@ -3105,7 +3187,7 @@
"integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
"dev": true,
"requires": {
- "make-iterator": "^1.0.0"
+ "make-iterator": "1.0.1"
}
},
"arr-union": {
@@ -3126,18 +3208,6 @@
"integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
"dev": true
},
- "array-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
- "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
- "dev": true
- },
- "array-filter": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz",
- "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=",
- "dev": true
- },
"array-find-index": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
@@ -3155,15 +3225,23 @@
"integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=",
"dev": true
},
+ "array-ify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
+ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
+ "dev": true
+ },
"array-includes": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
- "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz",
+ "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==",
"dev": true,
"requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0",
- "is-string": "^1.0.5"
+ "call-bind": "1.0.2",
+ "define-properties": "1.1.3",
+ "es-abstract": "1.18.3",
+ "get-intrinsic": "1.1.1",
+ "is-string": "1.0.6"
}
},
"array-initial": {
@@ -3172,8 +3250,8 @@
"integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
"dev": true,
"requires": {
- "array-slice": "^1.0.0",
- "is-number": "^4.0.0"
+ "array-slice": "1.1.0",
+ "is-number": "4.0.0"
},
"dependencies": {
"is-number": {
@@ -3190,7 +3268,7 @@
"integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
"dev": true,
"requires": {
- "is-number": "^4.0.0"
+ "is-number": "4.0.0"
},
"dependencies": {
"is-number": {
@@ -3213,9 +3291,9 @@
"integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
"dev": true,
"requires": {
- "default-compare": "^1.0.0",
- "get-value": "^2.0.6",
- "kind-of": "^5.0.2"
+ "default-compare": "1.0.0",
+ "get-value": "2.0.6",
+ "kind-of": "5.1.0"
},
"dependencies": {
"kind-of": {
@@ -3239,31 +3317,20 @@
"dev": true
},
"array.prototype.flat": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
- "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- }
- },
- "array.prototype.map": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz",
- "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz",
+ "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==",
"dev": true,
"requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "es-array-method-boxes-properly": "^1.0.0",
- "is-string": "^1.0.4"
+ "call-bind": "1.0.2",
+ "define-properties": "1.1.3",
+ "es-abstract": "1.18.3"
}
},
- "arraybuffer.slice": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
- "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
"dev": true
},
"asn1": {
@@ -3272,24 +3339,25 @@
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"dev": true,
"requires": {
- "safer-buffer": "~2.1.0"
+ "safer-buffer": "2.1.2"
}
},
"asn1.js": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
- "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
"dev": true,
"requires": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
+ "bn.js": "4.12.0",
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.1",
+ "safer-buffer": "2.1.2"
},
"dependencies": {
"bn.js": {
- "version": "4.11.9",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
- "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
"dev": true
}
}
@@ -3300,7 +3368,7 @@
"integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
"dev": true,
"requires": {
- "object-assign": "^4.1.1",
+ "object-assign": "4.1.1",
"util": "0.10.3"
},
"dependencies": {
@@ -3340,9 +3408,9 @@
"dev": true
},
"astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true
},
"async": {
@@ -3357,10 +3425,10 @@
"integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
"dev": true,
"requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.2",
- "process-nextick-args": "^2.0.0",
- "stream-exhaust": "^1.0.1"
+ "end-of-stream": "1.4.4",
+ "once": "1.4.0",
+ "process-nextick-args": "2.0.1",
+ "stream-exhaust": "1.0.2"
}
},
"async-each": {
@@ -3387,7 +3455,7 @@
"integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
"dev": true,
"requires": {
- "async-done": "^1.2.2"
+ "async-done": "1.3.2"
}
},
"asynckit": {
@@ -3396,12 +3464,6 @@
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
},
- "at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true
- },
"atob": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
@@ -3409,13 +3471,10 @@
"dev": true
},
"available-typed-arrays": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz",
- "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==",
- "dev": true,
- "requires": {
- "array-filter": "^1.0.0"
- }
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz",
+ "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==",
+ "dev": true
},
"aws-sign2": {
"version": "0.7.0",
@@ -3424,9 +3483,9 @@
"dev": true
},
"aws4": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
- "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==",
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
"dev": true
},
"babel-code-frame": {
@@ -3435,9 +3494,9 @@
"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
"dev": true,
"requires": {
- "chalk": "^1.1.3",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.2"
+ "chalk": "1.1.3",
+ "esutils": "2.0.3",
+ "js-tokens": "3.0.2"
},
"dependencies": {
"ansi-regex": {
@@ -3458,11 +3517,11 @@
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
}
},
"js-tokens": {
@@ -3477,7 +3536,7 @@
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
- "ansi-regex": "^2.0.0"
+ "ansi-regex": "2.1.1"
}
},
"supports-color": {
@@ -3488,3599 +3547,2826 @@
}
}
},
- "babel-core": {
- "version": "6.26.3",
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
- "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.26.0",
- "babel-generator": "^6.26.0",
- "babel-helpers": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-register": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "convert-source-map": "^1.5.1",
- "debug": "^2.6.9",
- "json5": "^0.5.1",
- "lodash": "^4.17.4",
- "minimatch": "^3.0.4",
- "path-is-absolute": "^1.0.1",
- "private": "^0.1.8",
- "slash": "^1.0.0",
- "source-map": "^0.5.7"
+ "babel-loader": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz",
+ "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==",
+ "dev": true,
+ "requires": {
+ "find-cache-dir": "3.3.1",
+ "loader-utils": "1.4.0",
+ "make-dir": "3.1.0",
+ "schema-utils": "2.7.1"
},
"dependencies": {
"json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "1.2.5"
+ }
},
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
- "dev": true
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "5.2.2",
+ "emojis-list": "3.0.0",
+ "json5": "1.0.1"
+ }
}
}
},
- "babel-generator": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
- "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
"dev": true,
"requires": {
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "detect-indent": "^4.0.0",
- "jsesc": "^1.3.0",
- "lodash": "^4.17.4",
- "source-map": "^0.5.7",
- "trim-right": "^1.0.1"
- },
- "dependencies": {
- "jsesc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
- "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
- "dev": true
- }
+ "object.assign": "4.1.2"
}
},
- "babel-helper-bindify-decorators": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
- "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
+ "babel-plugin-polyfill-corejs2": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz",
+ "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==",
"dev": true,
"requires": {
- "babel-runtime": "^6.22.0",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
+ "@babel/compat-data": "7.14.7",
+ "@babel/helper-define-polyfill-provider": "0.2.3",
+ "semver": "6.3.0"
}
},
- "babel-helper-builder-binary-assignment-operator-visitor": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
- "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+ "babel-plugin-polyfill-corejs3": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz",
+ "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==",
"dev": true,
"requires": {
- "babel-helper-explode-assignable-expression": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
+ "@babel/helper-define-polyfill-provider": "0.2.3",
+ "core-js-compat": "3.15.1"
}
},
- "babel-helper-builder-react-jsx": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz",
- "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=",
+ "babel-plugin-polyfill-regenerator": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz",
+ "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==",
"dev": true,
"requires": {
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "esutils": "^2.0.2"
+ "@babel/helper-define-polyfill-provider": "0.2.3"
}
},
- "babel-helper-call-delegate": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
- "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
- "dev": true,
+ "babel-plugin-transform-object-assign": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz",
+ "integrity": "sha1-+Z0vZvGgsNSY40bFNZaEdAyqILo=",
"requires": {
- "babel-helper-hoist-variables": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
+ "babel-runtime": "6.26.0"
}
},
- "babel-helper-define-map": {
+ "babel-runtime": {
"version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
- "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
- "dev": true,
- "requires": {
- "babel-helper-function-name": "^6.24.1",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "lodash": "^4.17.4"
- }
- },
- "babel-helper-explode-assignable-expression": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
- "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-explode-class": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
- "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
- "dev": true,
- "requires": {
- "babel-helper-bindify-decorators": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-function-name": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
- "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
- "dev": true,
- "requires": {
- "babel-helper-get-function-arity": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-get-function-arity": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
- "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-hoist-variables": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
- "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-helper-optimise-call-expression": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
- "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
+ "core-js": "2.6.12",
+ "regenerator-runtime": "0.11.1"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+ }
}
},
- "babel-helper-regex": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
- "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "lodash": "^4.17.4"
- }
+ "babelify": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz",
+ "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==",
+ "dev": true
},
- "babel-helper-remap-async-to-generator": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
- "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+ "bach": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
+ "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
"dev": true,
"requires": {
- "babel-helper-function-name": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
+ "arr-filter": "1.1.2",
+ "arr-flatten": "1.1.0",
+ "arr-map": "2.0.2",
+ "array-each": "1.0.1",
+ "array-initial": "1.1.0",
+ "array-last": "1.3.0",
+ "async-done": "1.3.2",
+ "async-settle": "1.0.0",
+ "now-and-later": "2.0.1"
}
},
- "babel-helper-replace-supers": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
- "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
- "dev": true,
- "requires": {
- "babel-helper-optimise-call-expression": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
+ "bail": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
+ "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
+ "dev": true
},
- "babel-helpers": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
- "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
},
- "babel-jest": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz",
- "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==",
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
"dev": true,
"requires": {
- "@jest/transform": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/babel__core": "^7.1.0",
- "babel-plugin-istanbul": "^5.1.0",
- "babel-preset-jest": "^24.9.0",
- "chalk": "^2.4.2",
- "slash": "^2.0.0"
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.3.0",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.2",
+ "pascalcase": "0.1.1"
},
"dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "is-descriptor": "1.0.2"
}
},
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- }
- }
- },
- "babel-loader": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
- "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
- "dev": true,
- "requires": {
- "find-cache-dir": "^2.1.0",
- "loader-utils": "^1.4.0",
- "mkdirp": "^0.5.3",
- "pify": "^4.0.1",
- "schema-utils": "^2.6.5"
- },
- "dependencies": {
- "json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"dev": true,
"requires": {
- "minimist": "^1.2.0"
+ "kind-of": "6.0.3"
}
},
- "loader-utils": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
- "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"dev": true,
"requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
+ "kind-of": "6.0.3"
}
},
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
"dev": true,
"requires": {
- "minimist": "^1.2.5"
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.3"
}
- },
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true
}
}
},
- "babel-messages": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
- "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "base64-arraybuffer": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
+ "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true
+ },
+ "base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+ "dev": true
+ },
+ "basic-auth": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
+ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
"dev": true,
"requires": {
- "babel-runtime": "^6.22.0"
+ "safe-buffer": "5.1.2"
}
},
- "babel-plugin-check-es2015-constants": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
- "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+ "batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"dev": true,
"requires": {
- "babel-runtime": "^6.22.0"
+ "tweetnacl": "0.14.5"
}
},
- "babel-plugin-dynamic-import-node": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
- "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
- "dev": true,
- "requires": {
- "object.assign": "^4.1.0"
- }
- },
- "babel-plugin-istanbul": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz",
- "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "find-up": "^3.0.0",
- "istanbul-lib-instrument": "^3.3.0",
- "test-exclude": "^5.2.3"
- },
- "dependencies": {
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "istanbul-lib-coverage": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
- "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
- "dev": true
- },
- "istanbul-lib-instrument": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
- "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
- "dev": true,
- "requires": {
- "@babel/generator": "^7.4.0",
- "@babel/parser": "^7.4.3",
- "@babel/template": "^7.4.0",
- "@babel/traverse": "^7.4.3",
- "@babel/types": "^7.4.0",
- "istanbul-lib-coverage": "^2.0.5",
- "semver": "^6.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
+ "beeper": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
+ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+ "dev": true
},
- "babel-plugin-jest-hoist": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz",
- "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==",
+ "bfj": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz",
+ "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==",
"dev": true,
"requires": {
- "@types/babel__traverse": "^7.0.6"
+ "bluebird": "3.7.2",
+ "check-types": "8.0.3",
+ "hoopy": "0.1.4",
+ "tryer": "1.0.1"
}
},
- "babel-plugin-syntax-async-functions": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
- "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
- "dev": true
- },
- "babel-plugin-syntax-async-generators": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
- "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
- "dev": true
- },
- "babel-plugin-syntax-class-constructor-call": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz",
- "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=",
- "dev": true
- },
- "babel-plugin-syntax-class-properties": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
- "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
- "dev": true
- },
- "babel-plugin-syntax-decorators": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
- "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
- "dev": true
- },
- "babel-plugin-syntax-do-expressions": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz",
- "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=",
- "dev": true
- },
- "babel-plugin-syntax-dynamic-import": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
- "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
- "dev": true
- },
- "babel-plugin-syntax-exponentiation-operator": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
- "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
- "dev": true
- },
- "babel-plugin-syntax-export-extensions": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz",
- "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=",
- "dev": true
- },
- "babel-plugin-syntax-flow": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz",
- "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=",
+ "big-integer": {
+ "version": "1.6.48",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz",
+ "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==",
"dev": true
},
- "babel-plugin-syntax-function-bind": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz",
- "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=",
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
"dev": true
},
- "babel-plugin-syntax-jsx": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
- "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=",
- "dev": true
+ "binary": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
+ "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
+ "dev": true,
+ "requires": {
+ "buffers": "0.1.1",
+ "chainsaw": "0.1.0"
+ }
},
- "babel-plugin-syntax-object-rest-spread": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
- "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true
},
- "babel-plugin-syntax-trailing-function-commas": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
- "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+ "binaryextensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz",
+ "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==",
"dev": true
},
- "babel-plugin-system-import-transformer": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-system-import-transformer/-/babel-plugin-system-import-transformer-3.1.0.tgz",
- "integrity": "sha1-038Mro5h7zkGAggzHZMbXmMNfF8=",
+ "bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"dev": true,
+ "optional": true,
"requires": {
- "babel-plugin-syntax-dynamic-import": "^6.18.0"
+ "file-uri-to-path": "1.0.0"
}
},
- "babel-plugin-transform-async-generator-functions": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
- "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+ "bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dev": true,
"requires": {
- "babel-helper-remap-async-to-generator": "^6.24.1",
- "babel-plugin-syntax-async-generators": "^6.5.0",
- "babel-runtime": "^6.22.0"
+ "buffer": "5.7.1",
+ "inherits": "2.0.4",
+ "readable-stream": "3.6.0"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ }
}
},
- "babel-plugin-transform-async-to-generator": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
- "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
- "dev": true,
- "requires": {
- "babel-helper-remap-async-to-generator": "^6.24.1",
- "babel-plugin-syntax-async-functions": "^6.8.0",
- "babel-runtime": "^6.22.0"
- }
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
},
- "babel-plugin-transform-class-constructor-call": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz",
- "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=",
- "dev": true,
- "requires": {
- "babel-plugin-syntax-class-constructor-call": "^6.18.0",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
+ "bn.js": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz",
+ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==",
+ "dev": true
},
- "babel-plugin-transform-class-properties": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
- "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
+ "body": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz",
+ "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=",
"dev": true,
"requires": {
- "babel-helper-function-name": "^6.24.1",
- "babel-plugin-syntax-class-properties": "^6.8.0",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
+ "continuable-cache": "0.3.1",
+ "error": "7.2.1",
+ "raw-body": "1.1.7",
+ "safe-json-parse": "1.0.1"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
+ "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
+ "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
+ "dev": true,
+ "requires": {
+ "bytes": "1.0.0",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
}
},
- "babel-plugin-transform-decorators": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
- "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
- "dev": true,
+ "body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"requires": {
- "babel-helper-explode-class": "^6.24.1",
- "babel-plugin-syntax-decorators": "^6.13.0",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-types": "^6.24.1"
+ "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.18"
}
},
- "babel-plugin-transform-decorators-legacy": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz",
- "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==",
+ "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,
"requires": {
- "babel-plugin-syntax-decorators": "^6.1.18",
- "babel-runtime": "^6.2.0",
- "babel-template": "^6.3.0"
+ "balanced-match": "1.0.2",
+ "concat-map": "0.0.1"
}
},
- "babel-plugin-transform-do-expressions": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz",
- "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "babel-plugin-syntax-do-expressions": "^6.8.0",
- "babel-runtime": "^6.22.0"
+ "fill-range": "7.0.1"
}
},
- "babel-plugin-transform-es2015-arrow-functions": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
- "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+ "dev": true
},
- "babel-plugin-transform-es2015-block-scoped-functions": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
- "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "browser-resolve": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
+ "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
"dev": true,
"requires": {
- "babel-runtime": "^6.22.0"
+ "resolve": "1.1.7"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+ "dev": true
+ }
}
},
- "babel-plugin-transform-es2015-block-scoping": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
- "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
"dev": true,
"requires": {
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "lodash": "^4.17.4"
+ "buffer-xor": "1.0.3",
+ "cipher-base": "1.0.4",
+ "create-hash": "1.2.0",
+ "evp_bytestokey": "1.0.3",
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
}
},
- "babel-plugin-transform-es2015-classes": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
- "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
"dev": true,
"requires": {
- "babel-helper-define-map": "^6.24.1",
- "babel-helper-function-name": "^6.24.1",
- "babel-helper-optimise-call-expression": "^6.24.1",
- "babel-helper-replace-supers": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
+ "browserify-aes": "1.2.0",
+ "browserify-des": "1.0.2",
+ "evp_bytestokey": "1.0.3"
}
},
- "babel-plugin-transform-es2015-computed-properties": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
- "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
"dev": true,
"requires": {
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
+ "cipher-base": "1.0.4",
+ "des.js": "1.0.1",
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
}
},
- "babel-plugin-transform-es2015-destructuring": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
- "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "browserify-rsa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+ "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
"dev": true,
"requires": {
- "babel-runtime": "^6.22.0"
+ "bn.js": "5.2.0",
+ "randombytes": "2.1.0"
}
},
- "babel-plugin-transform-es2015-duplicate-keys": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
- "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
"dev": true,
"requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
+ "bn.js": "5.2.0",
+ "browserify-rsa": "4.1.0",
+ "create-hash": "1.2.0",
+ "create-hmac": "1.1.7",
+ "elliptic": "6.5.4",
+ "inherits": "2.0.4",
+ "parse-asn1": "5.1.6",
+ "readable-stream": "3.6.0",
+ "safe-buffer": "5.2.1"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ }
}
},
- "babel-plugin-transform-es2015-for-of": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
- "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
"dev": true,
"requires": {
- "babel-runtime": "^6.22.0"
+ "pako": "1.0.11"
}
},
- "babel-plugin-transform-es2015-function-name": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
- "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "browserslist": {
+ "version": "4.16.6",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
+ "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
"dev": true,
"requires": {
- "babel-helper-function-name": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
+ "caniuse-lite": "1.0.30001239",
+ "colorette": "1.2.2",
+ "electron-to-chromium": "1.3.755",
+ "escalade": "3.1.1",
+ "node-releases": "1.1.73"
}
},
- "babel-plugin-transform-es2015-literals": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
- "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "browserstack": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz",
+ "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==",
"dev": true,
"requires": {
- "babel-runtime": "^6.22.0"
+ "https-proxy-agent": "2.2.4"
+ },
+ "dependencies": {
+ "agent-base": {
+ "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"
+ }
+ },
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.3"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
+ "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
+ "dev": true,
+ "requires": {
+ "agent-base": "4.3.0",
+ "debug": "3.2.7"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ }
}
},
- "babel-plugin-transform-es2015-modules-amd": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
- "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "browserstack-local": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.4.8.tgz",
+ "integrity": "sha512-s+mc3gTOJwELdLWi4qFVKtGwMbb5JWsR+JxKlMaJkRJxoZ0gg3WREgPxAN0bm6iU5+S4Bi0sz0oxBRZT8BiNsQ==",
"dev": true,
"requires": {
- "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
+ "https-proxy-agent": "4.0.0",
+ "is-running": "2.1.0",
+ "ps-tree": "1.2.0",
+ "temp-fs": "0.9.9"
}
},
- "babel-plugin-transform-es2015-modules-commonjs": {
- "version": "6.26.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
- "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+ "browserstacktunnel-wrapper": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-2.0.4.tgz",
+ "integrity": "sha512-GCV599FUUxNOCFl3WgPnfc5dcqq9XTmMXoxWpqkvmk0R9TOIoqmjENNU6LY6DtgIL6WfBVbg/jmWtnM5K6UYSg==",
"dev": true,
"requires": {
- "babel-plugin-transform-strict-mode": "^6.24.1",
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-types": "^6.26.0"
+ "https-proxy-agent": "2.2.4",
+ "unzipper": "0.9.15"
+ },
+ "dependencies": {
+ "agent-base": {
+ "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"
+ }
+ },
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.3"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
+ "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
+ "dev": true,
+ "requires": {
+ "agent-base": "4.3.0",
+ "debug": "3.2.7"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ }
}
},
- "babel-plugin-transform-es2015-modules-systemjs": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
- "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"requires": {
- "babel-helper-hoist-variables": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
+ "base64-js": "1.5.1",
+ "ieee754": "1.2.1"
}
},
- "babel-plugin-transform-es2015-modules-umd": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
- "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
- "dev": true,
- "requires": {
- "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "dev": true
},
- "babel-plugin-transform-es2015-object-super": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
- "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
- "dev": true,
- "requires": {
- "babel-helper-replace-supers": "^6.24.1",
- "babel-runtime": "^6.22.0"
- }
+ "buffer-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
+ "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
+ "dev": true
},
- "babel-plugin-transform-es2015-parameters": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
- "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
- "dev": true,
- "requires": {
- "babel-helper-call-delegate": "^6.24.1",
- "babel-helper-get-function-arity": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
+ "buffer-from": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "dev": true
},
- "babel-plugin-transform-es2015-shorthand-properties": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
- "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
+ "buffer-indexof-polyfill": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz",
+ "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==",
+ "dev": true
},
- "babel-plugin-transform-es2015-spread": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
- "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
+ "buffer-shims": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
+ "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=",
+ "dev": true
},
- "babel-plugin-transform-es2015-sticky-regex": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
- "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
- "dev": true,
- "requires": {
- "babel-helper-regex": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+ "dev": true
},
- "babel-plugin-transform-es2015-template-literals": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
- "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
+ "buffers": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
+ "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=",
+ "dev": true
},
- "babel-plugin-transform-es2015-typeof-symbol": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
- "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+ "dev": true
+ },
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
- "babel-plugin-transform-es2015-unicode-regex": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
- "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "cac": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-3.0.4.tgz",
+ "integrity": "sha1-bSTO7Dcu/lybeYgIvH9JtHJCpO8=",
"dev": true,
"requires": {
- "babel-helper-regex": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "regexpu-core": "^2.0.0"
+ "camelcase-keys": "3.0.0",
+ "chalk": "1.1.3",
+ "indent-string": "3.2.0",
+ "minimist": "1.2.5",
+ "read-pkg-up": "1.0.1",
+ "suffix": "0.1.1",
+ "text-table": "0.2.0"
},
"dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
},
- "regexpu-core": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
- "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
- "regenerate": "^1.2.1",
- "regjsgen": "^0.2.0",
- "regjsparser": "^0.1.4"
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
}
},
- "regjsgen": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
- "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
- "dev": true
- },
- "regjsparser": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
- "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
- "jsesc": "~0.5.0"
+ "ansi-regex": "2.1.1"
}
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
}
}
},
- "babel-plugin-transform-exponentiation-operator": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
- "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
"dev": true,
"requires": {
- "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
- "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
- "babel-runtime": "^6.22.0"
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.3.0",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.1",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.1",
+ "unset-value": "1.0.0"
}
},
- "babel-plugin-transform-export-extensions": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz",
- "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=",
+ "cacheable-lookup": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
+ "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
+ "dev": true
+ },
+ "cacheable-request": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
+ "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
"dev": true,
"requires": {
- "babel-plugin-syntax-export-extensions": "^6.8.0",
- "babel-runtime": "^6.22.0"
+ "clone-response": "1.0.2",
+ "get-stream": "5.2.0",
+ "http-cache-semantics": "4.1.0",
+ "keyv": "4.0.3",
+ "lowercase-keys": "2.0.0",
+ "normalize-url": "6.1.0",
+ "responselike": "2.0.0"
}
},
- "babel-plugin-transform-flow-strip-types": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz",
- "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=",
+ "cached-path-relative": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz",
+ "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==",
+ "dev": true
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"requires": {
- "babel-plugin-syntax-flow": "^6.18.0",
- "babel-runtime": "^6.22.0"
+ "function-bind": "1.1.1",
+ "get-intrinsic": "1.1.1"
}
},
- "babel-plugin-transform-function-bind": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz",
- "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=",
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
"dev": true,
"requires": {
- "babel-plugin-syntax-function-bind": "^6.8.0",
- "babel-runtime": "^6.22.0"
+ "callsites": "0.2.0"
+ },
+ "dependencies": {
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ }
}
},
- "babel-plugin-transform-object-assign": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz",
- "integrity": "sha1-+Z0vZvGgsNSY40bFNZaEdAyqILo=",
- "requires": {
- "babel-runtime": "^6.22.0"
- }
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
},
- "babel-plugin-transform-object-rest-spread": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
- "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
- "dev": true,
- "requires": {
- "babel-plugin-syntax-object-rest-spread": "^6.8.0",
- "babel-runtime": "^6.26.0"
- }
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true
},
- "babel-plugin-transform-react-display-name": {
- "version": "6.25.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz",
- "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=",
+ "camelcase-keys": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-3.0.0.tgz",
+ "integrity": "sha1-/AxsNgNj9zd+N5O5oWvM8QcMHKQ=",
"dev": true,
"requires": {
- "babel-runtime": "^6.22.0"
+ "camelcase": "3.0.0",
+ "map-obj": "1.0.1"
}
},
- "babel-plugin-transform-react-jsx": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz",
- "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
+ "caniuse-lite": {
+ "version": "1.0.30001239",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz",
+ "integrity": "sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "ccount": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz",
+ "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==",
+ "dev": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
"dev": true,
"requires": {
- "babel-helper-builder-react-jsx": "^6.24.1",
- "babel-plugin-syntax-jsx": "^6.8.0",
- "babel-runtime": "^6.22.0"
+ "align-text": "0.1.4",
+ "lazy-cache": "1.0.4"
}
},
- "babel-plugin-transform-react-jsx-self": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz",
- "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=",
+ "chai": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz",
+ "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==",
"dev": true,
"requires": {
- "babel-plugin-syntax-jsx": "^6.8.0",
- "babel-runtime": "^6.22.0"
+ "assertion-error": "1.1.0",
+ "check-error": "1.0.2",
+ "deep-eql": "3.0.1",
+ "get-func-name": "2.0.0",
+ "pathval": "1.1.1",
+ "type-detect": "4.0.8"
}
},
- "babel-plugin-transform-react-jsx-source": {
- "version": "6.22.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz",
- "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=",
+ "chainsaw": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
+ "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
"dev": true,
"requires": {
- "babel-plugin-syntax-jsx": "^6.8.0",
- "babel-runtime": "^6.22.0"
+ "traverse": "0.3.9"
}
},
- "babel-plugin-transform-regenerator": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
- "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
- "regenerator-transform": "^0.10.0"
- },
- "dependencies": {
- "regenerator-transform": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
- "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.18.0",
- "babel-types": "^6.19.0",
- "private": "^0.1.6"
- }
- }
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.5.0"
}
},
- "babel-plugin-transform-strict-mode": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
- "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "babel-preset-env": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
- "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
- "dev": true,
- "requires": {
- "babel-plugin-check-es2015-constants": "^6.22.0",
- "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
- "babel-plugin-transform-async-to-generator": "^6.22.0",
- "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
- "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
- "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
- "babel-plugin-transform-es2015-classes": "^6.23.0",
- "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
- "babel-plugin-transform-es2015-destructuring": "^6.23.0",
- "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
- "babel-plugin-transform-es2015-for-of": "^6.23.0",
- "babel-plugin-transform-es2015-function-name": "^6.22.0",
- "babel-plugin-transform-es2015-literals": "^6.22.0",
- "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
- "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
- "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
- "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
- "babel-plugin-transform-es2015-object-super": "^6.22.0",
- "babel-plugin-transform-es2015-parameters": "^6.23.0",
- "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
- "babel-plugin-transform-es2015-spread": "^6.22.0",
- "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
- "babel-plugin-transform-es2015-template-literals": "^6.22.0",
- "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
- "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
- "babel-plugin-transform-exponentiation-operator": "^6.22.0",
- "babel-plugin-transform-regenerator": "^6.22.0",
- "browserslist": "^3.2.6",
- "invariant": "^2.2.2",
- "semver": "^5.3.0"
- },
- "dependencies": {
- "browserslist": {
- "version": "3.2.8",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
- "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
- "dev": true,
- "requires": {
- "caniuse-lite": "^1.0.30000844",
- "electron-to-chromium": "^1.3.47"
- }
- }
- }
+ "character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
+ "dev": true
},
- "babel-preset-flow": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz",
- "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=",
- "dev": true,
- "requires": {
- "babel-plugin-transform-flow-strip-types": "^6.22.0"
- }
+ "character-entities-html4": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
+ "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==",
+ "dev": true
},
- "babel-preset-jest": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz",
- "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==",
- "dev": true,
- "requires": {
- "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
- "babel-plugin-jest-hoist": "^24.9.0"
- }
+ "character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
+ "dev": true
},
- "babel-preset-react": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz",
- "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=",
- "dev": true,
- "requires": {
- "babel-plugin-syntax-jsx": "^6.3.13",
- "babel-plugin-transform-react-display-name": "^6.23.0",
- "babel-plugin-transform-react-jsx": "^6.24.1",
- "babel-plugin-transform-react-jsx-self": "^6.22.0",
- "babel-plugin-transform-react-jsx-source": "^6.22.0",
- "babel-preset-flow": "^6.23.0"
- }
+ "character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+ "dev": true
},
- "babel-preset-stage-0": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz",
- "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=",
- "dev": true,
- "requires": {
- "babel-plugin-transform-do-expressions": "^6.22.0",
- "babel-plugin-transform-function-bind": "^6.22.0",
- "babel-preset-stage-1": "^6.24.1"
- }
+ "chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
},
- "babel-preset-stage-1": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz",
- "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=",
- "dev": true,
- "requires": {
- "babel-plugin-transform-class-constructor-call": "^6.24.1",
- "babel-plugin-transform-export-extensions": "^6.22.0",
- "babel-preset-stage-2": "^6.24.1"
- }
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
},
- "babel-preset-stage-2": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
- "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
- "dev": true,
- "requires": {
- "babel-plugin-syntax-dynamic-import": "^6.18.0",
- "babel-plugin-transform-class-properties": "^6.24.1",
- "babel-plugin-transform-decorators": "^6.24.1",
- "babel-preset-stage-3": "^6.24.1"
- }
+ "check-types": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz",
+ "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==",
+ "dev": true
},
- "babel-preset-stage-3": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
- "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
+ "chokidar": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
"dev": true,
"requires": {
- "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
- "babel-plugin-transform-async-generator-functions": "^6.24.1",
- "babel-plugin-transform-async-to-generator": "^6.24.1",
- "babel-plugin-transform-exponentiation-operator": "^6.24.1",
- "babel-plugin-transform-object-rest-spread": "^6.22.0"
+ "anymatch": "3.1.2",
+ "braces": "3.0.2",
+ "fsevents": "2.3.2",
+ "glob-parent": "5.1.2",
+ "is-binary-path": "2.1.0",
+ "is-glob": "4.0.1",
+ "normalize-path": "3.0.0",
+ "readdirp": "3.6.0"
}
},
- "babel-register": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
- "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "dev": true
+ },
+ "chrome-launcher": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.14.0.tgz",
+ "integrity": "sha512-W//HpflaW6qBGrmuskup7g+XJZN6w03ko9QSIe5CtcTal2u0up5SeReK3Ll1Why4Ey8dPkv8XSodZyHPnGbVHQ==",
"dev": true,
"requires": {
- "babel-core": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "core-js": "^2.5.0",
- "home-or-tmp": "^2.0.0",
- "lodash": "^4.17.4",
- "mkdirp": "^0.5.1",
- "source-map-support": "^0.4.15"
+ "@types/node": "15.12.4",
+ "escape-string-regexp": "4.0.0",
+ "is-wsl": "2.2.0",
+ "lighthouse-logger": "1.2.0"
},
"dependencies": {
- "core-js": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
- "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
}
}
},
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dev": true,
"requires": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.11.0"
- },
- "dependencies": {
- "core-js": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
- "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
- }
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
}
},
- "babel-template": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
- "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "dev": true
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
"dev": true,
"requires": {
- "babel-runtime": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "lodash": "^4.17.4"
- }
- },
- "babel-traverse": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
- "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.26.0",
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "debug": "^2.6.8",
- "globals": "^9.18.0",
- "invariant": "^2.2.2",
- "lodash": "^4.17.4"
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
},
"dependencies": {
- "globals": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
- "dev": true
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
}
}
},
- "babel-types": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
- "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
"dev": true,
"requires": {
- "babel-runtime": "^6.26.0",
- "esutils": "^2.0.2",
- "lodash": "^4.17.4",
- "to-fast-properties": "^1.0.3"
- },
- "dependencies": {
- "to-fast-properties": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
- "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
- "dev": true
- }
+ "restore-cursor": "3.1.0"
}
},
- "babelify": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/babelify/-/babelify-8.0.0.tgz",
- "integrity": "sha512-xVr63fKEvMWUrrIbqlHYsMcc5Zdw4FSVesAHgkgajyCE1W8gbm9rbMakqavhxKvikGYMhEcqxTwB/gQmQ6lBtw==",
+ "cli-spinners": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz",
+ "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==",
"dev": true
},
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
"dev": true
},
- "bach": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
- "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
"requires": {
- "arr-filter": "^1.1.1",
- "arr-flatten": "^1.0.1",
- "arr-map": "^2.0.0",
- "array-each": "^1.0.0",
- "array-initial": "^1.0.0",
- "array-last": "^1.1.1",
- "async-done": "^1.2.2",
- "async-settle": "^1.0.0",
- "now-and-later": "^2.0.0"
+ "string-width": "4.2.2",
+ "strip-ansi": "6.0.0",
+ "wrap-ansi": "7.0.0"
}
},
- "backo2": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
- "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
"dev": true
},
- "bail": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
- "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
+ "clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
"dev": true
},
- "balanced-match": {
+ "clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+ "dev": true,
+ "requires": {
+ "mimic-response": "1.0.1"
+ }
+ },
+ "clone-stats": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
"dev": true
},
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "cloneable-readable": {
+ "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": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
+ "inherits": "2.0.3",
+ "process-nextick-args": "2.0.1",
+ "readable-stream": "2.3.7"
},
"dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "kind-of": "^6.0.0"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
}
},
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "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==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
+ "safe-buffer": "5.1.2"
}
}
}
},
- "base64-arraybuffer": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
- "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
"dev": true
},
- "base64-js": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
- "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
+ "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=",
"dev": true
},
- "base64id": {
+ "collection-map": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
- "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
- "dev": true
- },
- "basic-auth": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
- "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
+ "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
+ "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
"dev": true,
"requires": {
- "safe-buffer": "5.1.2"
+ "arr-map": "2.0.2",
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
}
},
- "batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
- "dev": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
"dev": true,
"requires": {
- "tweetnacl": "^0.14.3"
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
}
},
- "beeper": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
- "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
- "dev": true
- },
- "better-assert": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
- "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
- "callsite": "1.0.0"
+ "color-name": "1.1.3"
}
},
- "bfj": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz",
- "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==",
- "dev": true,
- "requires": {
- "bluebird": "^3.5.5",
- "check-types": "^8.0.3",
- "hoopy": "^0.1.4",
- "tryer": "^1.0.1"
- }
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
},
- "big-integer": {
- "version": "1.6.48",
- "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz",
- "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==",
+ "color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
"dev": true
},
- "big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
"dev": true
},
- "binary": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
- "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
+ "colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+ "dev": true
+ },
+ "combined-stream": {
+ "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": {
- "buffers": "~0.1.1",
- "chainsaw": "~0.1.0"
+ "delayed-stream": "1.0.0"
}
},
- "binary-extensions": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
- "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+ "comma-separated-tokens": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
+ "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
"dev": true
},
- "binaryextensions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz",
- "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==",
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
- "bindings": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
- "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "file-uri-to-path": "1.0.0"
- }
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "dev": true
},
- "bl": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz",
- "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==",
+ "compare-func": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
+ "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
"dev": true,
"requires": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- }
+ "array-ify": "1.0.0",
+ "dot-prop": "5.3.0"
}
},
- "blob": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
- "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==",
+ "component-emitter": {
+ "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
},
- "bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true
+ "compress-commons": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz",
+ "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "crc32-stream": "4.0.2",
+ "normalize-path": "3.0.0",
+ "readable-stream": "3.6.0"
+ }
},
- "bn.js": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz",
- "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==",
+ "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
},
- "body": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz",
- "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=",
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
"dev": true,
"requires": {
- "continuable-cache": "^0.3.1",
- "error": "^7.0.0",
- "raw-body": "~1.1.0",
- "safe-json-parse": "~1.0.1"
+ "buffer-from": "1.1.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.7",
+ "typedarray": "0.0.6"
},
"dependencies": {
- "bytes": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
- "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
- "dev": true
- },
- "raw-body": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
- "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "bytes": "1",
- "string_decoder": "0.10"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
}
},
"string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.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==",
+ "concat-with-sourcemaps": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+ "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+ "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"
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "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==",
+ "connect": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
"dev": true,
"requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "debug": "2.6.9",
+ "finalhandler": "1.1.2",
+ "parseurl": "1.3.3",
+ "utils-merge": "1.0.1"
}
},
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "connect-livereload": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz",
+ "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==",
+ "dev": true
+ },
+ "console-browserify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+ "dev": true
+ },
+ "consolidate": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.16.0.tgz",
+ "integrity": "sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==",
"dev": true,
+ "optional": true,
"requires": {
- "fill-range": "^7.0.1"
+ "bluebird": "3.7.2"
}
},
- "brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
- "dev": true
- },
- "browser-process-hrtime": {
+ "constants-browserify": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
- "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
"dev": true
},
- "browser-resolve": {
- "version": "1.11.3",
- "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
- "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
- "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==",
"requires": {
- "resolve": "1.1.7"
- },
- "dependencies": {
- "resolve": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
- "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
- "dev": true
- }
+ "safe-buffer": "5.1.2"
}
},
- "browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ },
+ "continuable-cache": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz",
+ "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
"dev": true
},
- "browserify-aes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
- "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "conventional-changelog": {
+ "version": "3.1.24",
+ "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.24.tgz",
+ "integrity": "sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg==",
"dev": true,
"requires": {
- "buffer-xor": "^1.0.3",
- "cipher-base": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.3",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
+ "conventional-changelog-angular": "5.0.12",
+ "conventional-changelog-atom": "2.0.8",
+ "conventional-changelog-codemirror": "2.0.8",
+ "conventional-changelog-conventionalcommits": "4.5.0",
+ "conventional-changelog-core": "4.2.2",
+ "conventional-changelog-ember": "2.0.9",
+ "conventional-changelog-eslint": "3.0.9",
+ "conventional-changelog-express": "2.0.6",
+ "conventional-changelog-jquery": "3.0.11",
+ "conventional-changelog-jshint": "2.0.9",
+ "conventional-changelog-preset-loader": "2.3.4"
}
},
- "browserify-cipher": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
- "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "conventional-changelog-angular": {
+ "version": "5.0.12",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz",
+ "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==",
"dev": true,
"requires": {
- "browserify-aes": "^1.0.4",
- "browserify-des": "^1.0.0",
- "evp_bytestokey": "^1.0.0"
+ "compare-func": "2.0.0",
+ "q": "1.5.1"
}
},
- "browserify-des": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
- "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "conventional-changelog-atom": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz",
+ "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==",
"dev": true,
"requires": {
- "cipher-base": "^1.0.1",
- "des.js": "^1.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
+ "q": "1.5.1"
}
},
- "browserify-rsa": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
- "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+ "conventional-changelog-codemirror": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz",
+ "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==",
"dev": true,
"requires": {
- "bn.js": "^4.1.0",
- "randombytes": "^2.0.1"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.11.9",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
- "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
- "dev": true
- }
+ "q": "1.5.1"
}
},
- "browserify-sign": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz",
- "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==",
- "dev": true,
- "requires": {
- "bn.js": "^5.1.1",
- "browserify-rsa": "^4.0.1",
- "create-hash": "^1.2.0",
- "create-hmac": "^1.1.7",
- "elliptic": "^6.5.2",
- "inherits": "^2.0.4",
- "parse-asn1": "^5.1.5",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
+ "conventional-changelog-config-spec": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz",
+ "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==",
+ "dev": true
+ },
+ "conventional-changelog-conventionalcommits": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz",
+ "integrity": "sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw==",
+ "dev": true,
+ "requires": {
+ "compare-func": "2.0.0",
+ "lodash": "4.17.21",
+ "q": "1.5.1"
+ }
+ },
+ "conventional-changelog-core": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.2.tgz",
+ "integrity": "sha512-7pDpRUiobQDNkwHyJG7k9f6maPo9tfPzkSWbRq97GGiZqisElhnvUZSvyQH20ogfOjntB5aadvv6NNcKL1sReg==",
+ "dev": true,
+ "requires": {
+ "add-stream": "1.0.0",
+ "conventional-changelog-writer": "4.1.0",
+ "conventional-commits-parser": "3.2.1",
+ "dateformat": "3.0.3",
+ "get-pkg-repo": "1.4.0",
+ "git-raw-commits": "2.0.10",
+ "git-remote-origin-url": "2.0.0",
+ "git-semver-tags": "4.1.1",
+ "lodash": "4.17.21",
+ "normalize-package-data": "3.0.2",
+ "q": "1.5.1",
+ "read-pkg": "3.0.0",
+ "read-pkg-up": "3.0.0",
+ "shelljs": "0.8.4",
+ "through2": "4.0.2"
},
"dependencies": {
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "2.0.0"
+ }
},
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true
- }
- }
- },
- "browserify-zlib": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
- "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
- "dev": true,
- "requires": {
- "pako": "~1.0.5"
- }
- },
- "browserslist": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz",
- "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==",
- "dev": true,
- "requires": {
- "caniuse-lite": "^1.0.30001093",
- "electron-to-chromium": "^1.3.488",
- "escalade": "^3.0.1",
- "node-releases": "^1.1.58"
- }
- },
- "browserstack": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz",
- "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==",
- "dev": true,
- "requires": {
- "https-proxy-agent": "^2.2.1"
- },
- "dependencies": {
- "agent-base": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
- "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
+ "hosted-git-info": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
+ "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
"dev": true,
"requires": {
- "es6-promisify": "^5.0.0"
+ "lru-cache": "6.0.0"
}
},
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "graceful-fs": "4.2.6",
+ "parse-json": "4.0.0",
+ "pify": "3.0.0",
+ "strip-bom": "3.0.0"
}
},
- "https-proxy-agent": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
- "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"dev": true,
"requires": {
- "agent-base": "^4.3.0",
- "debug": "^3.1.0"
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
}
},
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "4.0.0"
+ }
+ },
+ "normalize-package-data": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz",
+ "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "4.0.2",
+ "resolve": "1.20.0",
+ "semver": "7.3.5",
+ "validate-npm-package-license": "3.0.4"
+ }
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "requires": {
+ "p-try": "1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "1.3.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
"dev": true
- }
- }
- },
- "browserstack-local": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.4.5.tgz",
- "integrity": "sha512-0/VdSv2YVXmcnwBb64XThMvjM1HnZJnPdv7CUgQbC5y/N9Wsr0Fu+j1oknE9fC/VPx9CpoSC6CJ0kza42skMSA==",
- "dev": true,
- "requires": {
- "https-proxy-agent": "^4.0.0",
- "is-running": "^2.1.0",
- "ps-tree": "=1.2.0",
- "temp-fs": "^0.9.9"
- }
- },
- "browserstacktunnel-wrapper": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-2.0.4.tgz",
- "integrity": "sha512-GCV599FUUxNOCFl3WgPnfc5dcqq9XTmMXoxWpqkvmk0R9TOIoqmjENNU6LY6DtgIL6WfBVbg/jmWtnM5K6UYSg==",
- "dev": true,
- "requires": {
- "https-proxy-agent": "^2.2.1",
- "unzipper": "^0.9.3"
- },
- "dependencies": {
- "agent-base": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
- "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
"dev": true,
"requires": {
- "es6-promisify": "^5.0.0"
+ "error-ex": "1.3.2",
+ "json-parse-better-errors": "1.0.2"
}
},
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "pify": "3.0.0"
}
},
- "https-proxy-agent": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
- "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "4.0.0",
+ "normalize-package-data": "2.5.0",
+ "path-type": "3.0.0"
+ },
+ "dependencies": {
+ "hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.8.9",
+ "resolve": "1.20.0",
+ "semver": "5.7.1",
+ "validate-npm-package-license": "3.0.4"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
+ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
"dev": true,
"requires": {
- "agent-base": "^4.3.0",
- "debug": "^3.1.0"
+ "find-up": "2.1.0",
+ "read-pkg": "3.0.0"
}
},
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "6.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
}
}
},
- "bser": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
- "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "conventional-changelog-ember": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz",
+ "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==",
"dev": true,
"requires": {
- "node-int64": "^0.4.0"
+ "q": "1.5.1"
}
},
- "buffer": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
- "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
+ "conventional-changelog-eslint": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz",
+ "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==",
"dev": true,
"requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4"
+ "q": "1.5.1"
}
},
- "buffer-alloc": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
- "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+ "conventional-changelog-express": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz",
+ "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==",
"dev": true,
"requires": {
- "buffer-alloc-unsafe": "^1.1.0",
- "buffer-fill": "^1.0.0"
+ "q": "1.5.1"
}
},
- "buffer-alloc-unsafe": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
- "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
- "dev": true
- },
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
- "dev": true
- },
- "buffer-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
- "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
- "dev": true
- },
- "buffer-fill": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
- "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
- "dev": true
- },
- "buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
- "dev": true
- },
- "buffer-indexof-polyfill": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz",
- "integrity": "sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8=",
- "dev": true
+ "conventional-changelog-jquery": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz",
+ "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==",
+ "dev": true,
+ "requires": {
+ "q": "1.5.1"
+ }
},
- "buffer-shims": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
- "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=",
- "dev": true
+ "conventional-changelog-jshint": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz",
+ "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==",
+ "dev": true,
+ "requires": {
+ "compare-func": "2.0.0",
+ "q": "1.5.1"
+ }
},
- "buffer-xor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+ "conventional-changelog-preset-loader": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz",
+ "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==",
"dev": true
},
- "buffers": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
- "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=",
- "dev": true
+ "conventional-changelog-writer": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz",
+ "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==",
+ "dev": true,
+ "requires": {
+ "compare-func": "2.0.0",
+ "conventional-commits-filter": "2.0.7",
+ "dateformat": "3.0.3",
+ "handlebars": "4.7.7",
+ "json-stringify-safe": "5.0.1",
+ "lodash": "4.17.21",
+ "meow": "8.1.2",
+ "semver": "6.3.0",
+ "split": "1.0.1",
+ "through2": "4.0.2"
+ },
+ "dependencies": {
+ "split": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
+ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+ "dev": true,
+ "requires": {
+ "through": "2.3.8"
+ }
+ }
+ }
},
- "builtin-status-codes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
- "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
- "dev": true
+ "conventional-commits-filter": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz",
+ "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==",
+ "dev": true,
+ "requires": {
+ "lodash.ismatch": "4.4.0",
+ "modify-values": "1.0.1"
+ }
},
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ "conventional-commits-parser": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz",
+ "integrity": "sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "1.3.5",
+ "is-text-path": "1.0.1",
+ "lodash": "4.17.21",
+ "meow": "8.1.2",
+ "split2": "3.2.2",
+ "through2": "4.0.2",
+ "trim-off-newlines": "1.0.1"
+ }
},
- "cac": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/cac/-/cac-3.0.4.tgz",
- "integrity": "sha1-bSTO7Dcu/lybeYgIvH9JtHJCpO8=",
+ "conventional-recommended-bump": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz",
+ "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==",
"dev": true,
"requires": {
- "camelcase-keys": "^3.0.0",
- "chalk": "^1.1.3",
- "indent-string": "^3.0.0",
- "minimist": "^1.2.0",
- "read-pkg-up": "^1.0.1",
- "suffix": "^0.1.0",
- "text-table": "^0.2.0"
+ "concat-stream": "2.0.0",
+ "conventional-changelog-preset-loader": "2.3.4",
+ "conventional-commits-filter": "2.0.7",
+ "conventional-commits-parser": "3.2.1",
+ "git-raw-commits": "2.0.10",
+ "git-semver-tags": "4.1.1",
+ "meow": "8.1.2",
+ "q": "1.5.1"
},
"dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "concat-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+ "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
"dev": true,
"requires": {
- "ansi-regex": "^2.0.0"
+ "buffer-from": "1.1.1",
+ "inherits": "2.0.3",
+ "readable-stream": "3.6.0",
+ "typedarray": "0.0.6"
}
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
}
}
},
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "convert-source-map": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
+ "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
"dev": true,
"requires": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
+ "safe-buffer": "5.1.2"
}
},
- "cacheable-lookup": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz",
- "integrity": "sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w==",
- "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=="
},
- "cacheable-request": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz",
- "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==",
- "dev": true,
- "requires": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^4.1.0",
- "responselike": "^2.0.0"
- }
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
- "caller-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
- "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "copy-props": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz",
+ "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==",
"dev": true,
"requires": {
- "callsites": "^0.2.0"
+ "each-props": "1.3.2",
+ "is-plain-object": "5.0.0"
},
"dependencies": {
- "callsites": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
- "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"dev": true
}
}
},
- "callsite": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
- "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
- "dev": true
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
+ "core-js": {
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.1.tgz",
+ "integrity": "sha512-h8VbZYnc9pDzueiS2610IULDkpFFPunHwIpl8yRwFahAEEdSpHlTy3h3z3rKq5h11CaUdBEeRViu9AYvbxiMeg=="
},
- "camelcase-keys": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-3.0.0.tgz",
- "integrity": "sha1-/AxsNgNj9zd+N5O5oWvM8QcMHKQ=",
+ "core-js-compat": {
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.1.tgz",
+ "integrity": "sha512-xGhzYMX6y7oEGQGAJmP2TmtBLvR4nZmRGEcFa3ubHOq5YEp51gGN9AovVa0AoujGZIq+Wm6dISiYyGNfdflYww==",
"dev": true,
"requires": {
- "camelcase": "^3.0.0",
- "map-obj": "^1.0.0"
+ "browserslist": "4.16.6",
+ "semver": "7.0.0"
},
"dependencies": {
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
"dev": true
}
}
},
- "caniuse-lite": {
- "version": "1.0.30001105",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001105.tgz",
- "integrity": "sha512-JupOe6+dGMr7E20siZHIZQwYqrllxotAhiaej96y6x00b/48rPt42o+SzOSCPbrpsDWvRja40Hwrj0g0q6LZJg==",
+ "core-js-pure": {
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.15.1.tgz",
+ "integrity": "sha512-OZuWHDlYcIda8sJLY4Ec6nWq2hRjlyCqCZ+jCflyleMkVt3tPedDVErvHslyS2nbO+SlBFMSBJYvtLMwxnrzjA=="
+ },
+ "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=",
"dev": true
},
- "capture-exit": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
- "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
+ "cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"dev": true,
"requires": {
- "rsvp": "^4.8.4"
+ "object-assign": "4.1.1",
+ "vary": "1.1.2"
}
},
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "dev": true
- },
- "ccount": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz",
- "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==",
- "dev": true
- },
- "center-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "coveralls": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz",
+ "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==",
"dev": true,
"requires": {
- "align-text": "^0.1.3",
- "lazy-cache": "^1.0.3"
+ "js-yaml": "3.14.1",
+ "lcov-parse": "1.0.0",
+ "log-driver": "1.2.7",
+ "minimist": "1.2.5",
+ "request": "2.88.2"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.10",
+ "esprima": "4.0.1"
+ }
+ }
}
},
- "chai": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
- "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
+ "crc-32": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
+ "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
"dev": true,
"requires": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.2",
- "deep-eql": "^3.0.1",
- "get-func-name": "^2.0.0",
- "pathval": "^1.1.0",
- "type-detect": "^4.0.5"
+ "exit-on-epipe": "1.0.1",
+ "printj": "1.1.2"
}
},
- "chainsaw": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
- "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
+ "crc32-stream": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz",
+ "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==",
"dev": true,
"requires": {
- "traverse": ">=0.3.0 <0.4"
+ "crc-32": "1.2.0",
+ "readable-stream": "3.6.0"
}
},
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
+ "bn.js": "4.12.0",
+ "elliptic": "6.5.4"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
}
},
- "character-entities": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
- "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
- "dev": true
- },
- "character-entities-html4": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
- "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==",
- "dev": true
- },
- "character-entities-legacy": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
- "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
- "dev": true
- },
- "character-reference-invalid": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
- "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
- "dev": true
- },
- "chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
- "dev": true
- },
- "check-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
- "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
- "dev": true
- },
- "check-types": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz",
- "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==",
- "dev": true
+ "create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "requires": {
+ "cipher-base": "1.0.4",
+ "inherits": "2.0.3",
+ "md5.js": "1.3.5",
+ "ripemd160": "2.0.2",
+ "sha.js": "2.4.11"
+ }
},
- "chokidar": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz",
- "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==",
+ "create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
"dev": true,
"requires": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "fsevents": "~2.1.2",
- "glob-parent": "~5.1.0",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.4.0"
+ "cipher-base": "1.0.4",
+ "create-hash": "1.2.0",
+ "inherits": "2.0.3",
+ "ripemd160": "2.0.2",
+ "safe-buffer": "5.1.2",
+ "sha.js": "2.4.11"
}
},
- "chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
- "dev": true
+ "criteo-direct-rsa-validate": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/criteo-direct-rsa-validate/-/criteo-direct-rsa-validate-1.1.0.tgz",
+ "integrity": "sha512-7gQ3zX+d+hS/vOxzLrZ4aRAceB7qNJ0VzaGNpcWjDCmtOpASB50USJDupTik/H2nHgiSAA3VNZ3SFuONs8LR9Q=="
},
- "chrome-launcher": {
- "version": "0.13.4",
- "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.13.4.tgz",
- "integrity": "sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A==",
+ "cross-spawn": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
+ "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
"dev": true,
"requires": {
- "@types/node": "*",
- "escape-string-regexp": "^1.0.5",
- "is-wsl": "^2.2.0",
- "lighthouse-logger": "^1.0.0",
- "mkdirp": "^0.5.3",
- "rimraf": "^3.0.2"
+ "lru-cache": "4.1.5",
+ "which": "1.3.1"
},
"dependencies": {
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
- "glob": "^7.1.3"
+ "isexe": "2.0.0"
}
}
}
},
- "ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
- },
- "cipher-base": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
"dev": true,
"requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
+ "browserify-cipher": "1.0.1",
+ "browserify-sign": "4.2.1",
+ "create-ecdh": "4.0.4",
+ "create-hash": "1.2.0",
+ "create-hmac": "1.1.7",
+ "diffie-hellman": "5.0.3",
+ "inherits": "2.0.3",
+ "pbkdf2": "3.1.2",
+ "public-encrypt": "4.0.3",
+ "randombytes": "2.1.0",
+ "randomfill": "1.0.4"
}
},
- "circular-json": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
- "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
- "dev": true
- },
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "crypto-js": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz",
+ "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q=="
+ },
+ "css": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz",
+ "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==",
"dev": true,
"requires": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
+ "inherits": "2.0.4",
+ "source-map": "0.6.1",
+ "source-map-resolve": "0.6.0"
},
"dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz",
+ "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==",
"dev": true,
"requires": {
- "is-descriptor": "^0.1.0"
+ "atob": "2.1.2",
+ "decode-uri-component": "0.2.0"
}
}
}
},
- "cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "css-shorthand-properties": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz",
+ "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==",
+ "dev": true
+ },
+ "css-value": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz",
+ "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=",
+ "dev": true
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
"dev": true,
"requires": {
- "restore-cursor": "^3.1.0"
+ "array-find-index": "1.0.2"
}
},
- "cli-spinners": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz",
- "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==",
+ "custom-event": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
"dev": true
},
- "cli-width": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
- "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "d": {
+ "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.53",
+ "type": "1.2.0"
+ }
+ },
+ "dargs": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
+ "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==",
"dev": true
},
- "cliui": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
- "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"dev": true,
"requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^6.2.0"
+ "assert-plus": "1.0.0"
}
},
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "date-format": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz",
+ "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==",
"dev": true
},
- "clone-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
- "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+ "dateformat": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
+ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
"dev": true
},
- "clone-response": {
+ "de-indent": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+ "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+ "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
"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==",
"requires": {
- "mimic-response": "^1.0.0"
+ "ms": "2.0.0"
}
},
- "clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
- "dev": true
- },
- "cloneable-readable": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
- "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
+ "debug-fabulous": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz",
+ "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==",
"dev": true,
"requires": {
- "inherits": "^2.0.1",
- "process-nextick-args": "^2.0.0",
- "readable-stream": "^2.3.5"
+ "debug": "3.2.7",
+ "memoizee": "0.4.15",
+ "object-assign": "4.1.1"
},
"dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "ms": "2.1.3"
}
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
}
}
},
- "co": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
"dev": true
},
- "code-point-at": {
+ "decamelize-keys": {
"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
- },
- "collapse-white-space": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
- "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
- "dev": true
- },
- "collection-map": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
- "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
+ "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
"dev": true,
"requires": {
- "arr-map": "^2.0.2",
- "for-own": "^1.0.0",
- "make-iterator": "^1.0.0"
+ "decamelize": "1.2.0",
+ "map-obj": "1.0.1"
+ },
+ "dependencies": {
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ }
}
},
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
"requires": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
+ "mimic-response": "3.1.0"
+ },
+ "dependencies": {
+ "mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "dev": true
+ }
}
},
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
"dev": true,
"requires": {
- "color-name": "1.1.3"
+ "type-detect": "4.0.8"
}
},
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
+ "deep-equal": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz",
+ "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "1.0.2",
+ "es-get-iterator": "1.1.2",
+ "get-intrinsic": "1.1.1",
+ "is-arguments": "1.1.0",
+ "is-date-object": "1.0.4",
+ "is-regex": "1.1.3",
+ "isarray": "2.0.5",
+ "object-is": "1.1.5",
+ "object-keys": "1.1.1",
+ "object.assign": "4.1.2",
+ "regexp.prototype.flags": "1.3.1",
+ "side-channel": "1.0.4",
+ "which-boxed-primitive": "1.0.2",
+ "which-collection": "1.0.1",
+ "which-typed-array": "1.1.4"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ }
+ }
},
- "color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
- "colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
"dev": true
},
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "default-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
+ "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
"dev": true,
"requires": {
- "delayed-stream": "~1.0.0"
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
}
},
- "comma-separated-tokens": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
- "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
+ "default-resolution": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
+ "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
"dev": true
},
- "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
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.4"
+ }
},
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
"dev": true
},
- "component-bind": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
- "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
- "dev": true
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "1.1.1"
+ }
},
- "component-emitter": {
- "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": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
- "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
- "dev": true
- },
- "compress-commons": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-3.0.0.tgz",
- "integrity": "sha512-FyDqr8TKX5/X0qo+aVfaZ+PVmNJHJeckFBlq8jZGSJOgnynhfifoyl24qaqdUdDIBe0EVTHByN6NAkqYvE/2Xg==",
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
"dev": true,
"requires": {
- "buffer-crc32": "^0.2.13",
- "crc32-stream": "^3.0.1",
- "normalize-path": "^3.0.0",
- "readable-stream": "^2.3.7"
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
},
"dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "kind-of": "6.0.3"
}
- }
- }
- },
- "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
- },
- "concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "kind-of": "6.0.3"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.3"
}
}
}
},
- "concat-with-sourcemaps": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
- "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
- "dev": true,
- "requires": {
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "connect": {
- "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.2",
- "parseurl": "~1.3.3",
- "utils-merge": "1.0.1"
- }
- },
- "connect-livereload": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz",
- "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==",
- "dev": true
- },
- "console-browserify": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
- "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
"dev": true
},
- "constants-browserify": {
+ "delayed-stream": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
- "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true
},
- "contains-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
- "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
- "dev": true
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
- "content-disposition": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
- "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "des.js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+ "dev": true,
"requires": {
- "safe-buffer": "5.1.2"
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.1"
}
},
- "content-type": {
+ "destroy": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
- "continuable-cache": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz",
- "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=",
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
"dev": true
},
- "convert-source-map": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
- "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ "detect-indent": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
+ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
+ "dev": true
},
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ "detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
+ "dev": true
},
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
"dev": true
},
- "copy-props": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz",
- "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==",
+ "detective": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
+ "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
"dev": true,
"requires": {
- "each-props": "^1.3.0",
- "is-plain-object": "^2.0.1"
+ "acorn-node": "1.8.2",
+ "defined": "1.0.0",
+ "minimist": "1.2.5"
}
},
- "core-js": {
- "version": "3.6.5",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
- "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
- },
- "core-js-compat": {
- "version": "3.6.5",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
- "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
+ "devtools": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.7.4.tgz",
+ "integrity": "sha512-rkO9k6yOA2XzFTph9y+gO/387653jou0La7QSLd57XTQiM3D/UODqLBt+fMVu8w3fdQzZHVAlIIvP4B8rkXY1Q==",
"dev": true,
"requires": {
- "browserslist": "^4.8.5",
- "semver": "7.0.0"
+ "@types/node": "14.17.4",
+ "@wdio/config": "7.7.3",
+ "@wdio/logger": "7.7.0",
+ "@wdio/protocols": "7.7.4",
+ "@wdio/types": "7.7.3",
+ "@wdio/utils": "7.7.3",
+ "chrome-launcher": "0.14.0",
+ "edge-paths": "2.2.1",
+ "puppeteer-core": "9.1.1",
+ "query-selector-shadow-dom": "1.0.0",
+ "ua-parser-js": "0.7.28",
+ "uuid": "8.3.2"
},
"dependencies": {
- "semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "@types/node": {
+ "version": "14.17.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.4.tgz",
+ "integrity": "sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A==",
+ "dev": true
+ },
+ "@wdio/logger": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.7.0.tgz",
+ "integrity": "sha512-XX/OkC8NlvsBdhKsb9j7ZbuQtF/Vuo0xf38PXdqYtVezOrYbDuba0hPG++g/IGNuAF34ZbSi+49cvz4u5w92kQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "4.1.1",
+ "loglevel": "1.7.1",
+ "loglevel-plugin-prefix": "0.8.4",
+ "strip-ansi": "6.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "4.0.0"
+ }
}
}
},
- "core-js-pure": {
- "version": "3.6.5",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz",
- "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA=="
+ "devtools-protocol": {
+ "version": "0.0.892017",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.892017.tgz",
+ "integrity": "sha512-23yn1+zeMBlWiZTtrCViNQt+W+FRDw5rEetI19bMuyKIYeK11xo/dS+Hmuu8ifGJnJvXUU3Y79IoxSPWZWcVOA==",
+ "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=",
+ "di": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+ "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
"dev": true
},
- "coveralls": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz",
- "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==",
+ "diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true
+ },
+ "diff-sequences": {
+ "version": "27.0.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.1.tgz",
+ "integrity": "sha512-XPLijkfJUh/PIBnfkcSHgvD6tlYixmcMAn3osTk6jt+H0v/mgURto1XUiD9DKuGX5NDoVS6dSlA23gd9FUaCFg==",
+ "dev": true
+ },
+ "diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
"dev": true,
"requires": {
- "js-yaml": "^3.13.1",
- "lcov-parse": "^1.0.0",
- "log-driver": "^1.2.7",
- "minimist": "^1.2.5",
- "request": "^2.88.2"
+ "bn.js": "4.12.0",
+ "miller-rabin": "4.0.1",
+ "randombytes": "2.1.0"
+ },
+ "dependencies": {
+ "bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ }
}
},
- "crc": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
- "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
+ "dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
"requires": {
- "buffer": "^5.1.0"
+ "esutils": "2.0.3"
}
},
- "crc32-stream": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz",
- "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==",
+ "doctrine-temporary-fork": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine-temporary-fork/-/doctrine-temporary-fork-2.1.0.tgz",
+ "integrity": "sha512-nliqOv5NkE4zMON4UA6AMJE6As35afs8aYXATpU4pTUdIKiARZwrJVEP1boA3Rx1ZXHVkwxkhcq4VkqvsuRLsA==",
"dev": true,
"requires": {
- "crc": "^3.4.4",
- "readable-stream": "^3.4.0"
+ "esutils": "2.0.3"
}
},
- "create-ecdh": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
- "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
- "dev": true,
- "requires": {
- "bn.js": "^4.1.0",
- "elliptic": "^6.0.0"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.11.9",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
- "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "documentation": {
+ "version": "13.2.5",
+ "resolved": "https://registry.npmjs.org/documentation/-/documentation-13.2.5.tgz",
+ "integrity": "sha512-d1TrfrHXYZR63xrOzkYwwe297vkSwBoEhyyMBOi20T+7Ohe1aX1dW4nqXncQmdmE5MxluSaxxa3BW1dCvbF5AQ==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "7.12.3",
+ "@babel/generator": "7.12.1",
+ "@babel/parser": "7.12.3",
+ "@babel/traverse": "7.14.7",
+ "@babel/types": "7.14.5",
+ "@vue/compiler-sfc": "3.1.2",
+ "ansi-html": "0.0.7",
+ "babelify": "10.0.0",
+ "chalk": "2.4.2",
+ "chokidar": "3.5.2",
+ "concat-stream": "1.6.2",
+ "diff": "4.0.2",
+ "doctrine-temporary-fork": "2.1.0",
+ "get-port": "5.1.1",
+ "git-url-parse": "11.4.4",
+ "github-slugger": "1.2.0",
+ "glob": "7.1.7",
+ "globals-docs": "2.4.1",
+ "highlight.js": "10.7.3",
+ "ini": "1.3.8",
+ "js-yaml": "3.14.1",
+ "lodash": "4.17.21",
+ "mdast-util-find-and-replace": "1.1.1",
+ "mdast-util-inject": "1.1.0",
+ "micromatch": "3.1.10",
+ "mime": "2.5.2",
+ "module-deps-sortable": "5.0.3",
+ "parse-filepath": "1.0.2",
+ "pify": "5.0.0",
+ "read-pkg-up": "4.0.0",
+ "remark": "13.0.0",
+ "remark-gfm": "1.0.0",
+ "remark-html": "13.0.1",
+ "remark-reference-links": "5.0.0",
+ "remark-toc": "7.2.0",
+ "resolve": "1.20.0",
+ "stream-array": "1.1.2",
+ "strip-json-comments": "2.0.1",
+ "tiny-lr": "1.1.1",
+ "unist-builder": "2.0.3",
+ "unist-util-visit": "2.0.3",
+ "vfile": "4.2.1",
+ "vfile-reporter": "6.0.2",
+ "vfile-sort": "2.2.2",
+ "vinyl": "2.2.1",
+ "vinyl-fs": "3.0.3",
+ "vue-template-compiler": "2.6.14",
+ "yargs": "15.4.1"
+ },
+ "dependencies": {
+ "@babel/core": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz",
+ "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.14.5",
+ "@babel/generator": "7.12.1",
+ "@babel/helper-module-transforms": "7.14.5",
+ "@babel/helpers": "7.14.6",
+ "@babel/parser": "7.12.3",
+ "@babel/template": "7.14.5",
+ "@babel/traverse": "7.14.7",
+ "@babel/types": "7.14.5",
+ "convert-source-map": "1.8.0",
+ "debug": "4.3.1",
+ "gensync": "1.0.0-beta.2",
+ "json5": "2.2.0",
+ "lodash": "4.17.21",
+ "resolve": "1.20.0",
+ "semver": "5.7.1",
+ "source-map": "0.5.7"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+ "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.14.5",
+ "jsesc": "2.5.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
"dev": true
- }
- }
- },
- "create-hash": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
- "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
- "dev": true,
- "requires": {
- "cipher-base": "^1.0.1",
- "inherits": "^2.0.1",
- "md5.js": "^1.3.4",
- "ripemd160": "^2.0.1",
- "sha.js": "^2.4.0"
- }
- },
- "create-hmac": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
- "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
- "dev": true,
- "requires": {
- "cipher-base": "^1.0.3",
- "create-hash": "^1.1.0",
- "inherits": "^2.0.1",
- "ripemd160": "^2.0.0",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "criteo-direct-rsa-validate": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/criteo-direct-rsa-validate/-/criteo-direct-rsa-validate-1.1.0.tgz",
- "integrity": "sha512-7gQ3zX+d+hS/vOxzLrZ4aRAceB7qNJ0VzaGNpcWjDCmtOpASB50USJDupTik/H2nHgiSAA3VNZ3SFuONs8LR9Q=="
- },
- "cross-spawn": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
- "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
- "dev": true,
- "requires": {
- "lru-cache": "^4.0.1",
- "which": "^1.2.9"
- }
- },
- "crypto-browserify": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
- "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
- "dev": true,
- "requires": {
- "browserify-cipher": "^1.0.0",
- "browserify-sign": "^4.0.0",
- "create-ecdh": "^4.0.0",
- "create-hash": "^1.1.0",
- "create-hmac": "^1.1.0",
- "diffie-hellman": "^5.0.0",
- "inherits": "^2.0.1",
- "pbkdf2": "^3.0.3",
- "public-encrypt": "^4.0.0",
- "randombytes": "^2.0.0",
- "randomfill": "^1.0.3"
- }
- },
- "crypto-js": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz",
- "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q=="
- },
- "css": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
- "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "source-map": "^0.6.1",
- "source-map-resolve": "^0.5.2",
- "urix": "^0.1.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.4",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
- }
- }
- },
- "css-value": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz",
- "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=",
- "dev": true
- },
- "cssom": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
- "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
- "dev": true
- },
- "cssstyle": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz",
- "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==",
- "dev": true,
- "requires": {
- "cssom": "0.3.x"
- }
- },
- "currently-unhandled": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
- "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
- "dev": true,
- "requires": {
- "array-find-index": "^1.0.1"
- }
- },
- "custom-event": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
- "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
- "dev": true
- },
- "d": {
- "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.50",
- "type": "^1.0.1"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "data-urls": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
- "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
- "dev": true,
- "requires": {
- "abab": "^2.0.0",
- "whatwg-mimetype": "^2.2.0",
- "whatwg-url": "^7.0.0"
- },
- "dependencies": {
- "whatwg-url": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
- "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ },
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": true,
"requires": {
- "lodash.sortby": "^4.7.0",
- "tr46": "^1.0.1",
- "webidl-conversions": "^4.0.2"
+ "string-width": "4.2.2",
+ "strip-ansi": "6.0.0",
+ "wrap-ansi": "6.2.0"
}
- }
- }
- },
- "date-format": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz",
- "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==",
- "dev": true
- },
- "dateformat": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
- "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
- "dev": true,
- "requires": {
- "get-stdin": "^4.0.1",
- "meow": "^3.3.0"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "debug-fabulous": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz",
- "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==",
- "dev": true,
- "requires": {
- "debug": "3.X",
- "memoizee": "0.4.X",
- "object-assign": "4.X"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "color-name": "1.1.4"
}
},
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
- }
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
- "dev": true
- },
- "decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dev": true,
- "requires": {
- "mimic-response": "^3.1.0"
- },
- "dependencies": {
- "mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ },
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
- }
- }
- },
- "deep-eql": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
- "dev": true,
- "requires": {
- "type-detect": "^4.0.0"
- }
- },
- "deep-equal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.3.tgz",
- "integrity": "sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA==",
- "dev": true,
- "requires": {
- "es-abstract": "^1.17.5",
- "es-get-iterator": "^1.1.0",
- "is-arguments": "^1.0.4",
- "is-date-object": "^1.0.2",
- "is-regex": "^1.0.5",
- "isarray": "^2.0.5",
- "object-is": "^1.1.2",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "regexp.prototype.flags": "^1.3.0",
- "side-channel": "^1.0.2",
- "which-boxed-primitive": "^1.0.1",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.2"
- },
- "dependencies": {
- "isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ },
+ "diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true
- }
- }
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
- },
- "deepmerge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
- "dev": true
- },
- "default-compare": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
- "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
- "dev": true,
- "requires": {
- "kind-of": "^5.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "default-require-extensions": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz",
- "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
- "dev": true,
- "requires": {
- "strip-bom": "^2.0.0"
- }
- },
- "default-resolution": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
- "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
- "dev": true
- },
- "defaults": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
- "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
- "dev": true,
- "optional": true,
- "requires": {
- "clone": "^1.0.2"
- }
- },
- "defer-to-connect": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz",
- "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==",
- "dev": true
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
},
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
"dev": true,
"requires": {
- "kind-of": "^6.0.0"
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
}
},
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
+ "locate-path": "3.0.0"
}
- }
- }
- },
- "defined": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
- "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
- "dev": true
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "des.js": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
- "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
- },
- "detab": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.3.tgz",
- "integrity": "sha512-Up8P0clUVwq0FnFjDclzZsy9PadzRn5FFxrr47tQQvMHqyiFYVbpH8oXDzWtF0Q7pYy3l+RPmtBl+BsFF6wH0A==",
- "dev": true,
- "requires": {
- "repeat-string": "^1.5.4"
- }
- },
- "detect-file": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
- "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
- "dev": true
- },
- "detect-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
- "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
- "dev": true,
- "requires": {
- "repeating": "^2.0.0"
- }
- },
- "detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
- "dev": true
- },
- "detect-newline": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
- "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
- "dev": true
- },
- "detective": {
- "version": "4.7.1",
- "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz",
- "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==",
- "dev": true,
- "requires": {
- "acorn": "^5.2.1",
- "defined": "^1.0.0"
- }
- },
- "devtools": {
- "version": "6.3.4",
- "resolved": "https://registry.npmjs.org/devtools/-/devtools-6.3.4.tgz",
- "integrity": "sha512-dOcLdArp5/dJBzD8T5wcT2YgqkA22Mkqo0OS9cXz7JkHNgwOx1FI2Bq9GvP6o0TENHifYSYg3G0K/z0bacekqg==",
- "dev": true,
- "requires": {
- "@wdio/config": "6.1.14",
- "@wdio/logger": "6.0.16",
- "@wdio/protocols": "6.3.0",
- "@wdio/utils": "6.3.0",
- "chrome-launcher": "^0.13.1",
- "puppeteer-core": "^5.1.0",
- "ua-parser-js": "^0.7.21",
- "uuid": "^8.0.0"
- }
- },
- "devtools-protocol": {
- "version": "0.0.781568",
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.781568.tgz",
- "integrity": "sha512-9Uqnzy6m6zEStluH9iyJ3iHyaQziFnMnLeC8vK0eN6smiJmIx7+yB64d67C2lH/LZra+5cGscJAJsNXO+MdPMg==",
- "dev": true
- },
- "di": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
- "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
- "dev": true
- },
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "diff-sequences": {
- "version": "26.0.0",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.0.0.tgz",
- "integrity": "sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==",
- "dev": true
- },
- "diffie-hellman": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
- "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
- "dev": true,
- "requires": {
- "bn.js": "^4.1.0",
- "miller-rabin": "^4.0.0",
- "randombytes": "^2.0.0"
- },
- "dependencies": {
- "bn.js": {
- "version": "4.11.9",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
- "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
- "dev": true
- }
- }
- },
- "disparity": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/disparity/-/disparity-2.0.0.tgz",
- "integrity": "sha1-V92stHMkrl9Y0swNqIbbTOnutxg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.0.1",
- "diff": "^1.3.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "diff": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz",
- "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=",
- "dev": true
- }
- }
- },
- "dlv": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
- "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
- },
- "doctrine": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
- "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2",
- "isarray": "^1.0.0"
- }
- },
- "doctrine-temporary-fork": {
- "version": "2.0.0-alpha-allowarrayindex",
- "resolved": "https://registry.npmjs.org/doctrine-temporary-fork/-/doctrine-temporary-fork-2.0.0-alpha-allowarrayindex.tgz",
- "integrity": "sha1-QAFahn6yfnWybIKLcVJPE3+J+fA=",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2",
- "isarray": "^1.0.0"
- }
- },
- "documentation": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/documentation/-/documentation-5.5.0.tgz",
- "integrity": "sha512-Aod3HOI+8zMhwWztDlECRsDfJ8SFu4oADvipOLq3gnWKy4Cpg2oF5AWT+U6PcX85KuguDI6c+q+2YwYEx99B/A==",
- "dev": true,
- "requires": {
- "ansi-html": "^0.0.7",
- "babel-core": "^6.26.0",
- "babel-generator": "^6.26.0",
- "babel-plugin-system-import-transformer": "3.1.0",
- "babel-plugin-transform-decorators-legacy": "^1.3.4",
- "babel-preset-env": "^1.6.1",
- "babel-preset-react": "^6.24.1",
- "babel-preset-stage-0": "^6.24.1",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babelify": "^8.0.0",
- "babylon": "^6.18.0",
- "chalk": "^2.3.0",
- "chokidar": "^2.0.0",
- "concat-stream": "^1.6.0",
- "disparity": "^2.0.0",
- "doctrine-temporary-fork": "2.0.0-alpha-allowarrayindex",
- "get-port": "^3.2.0",
- "git-url-parse": "^8.0.0",
- "github-slugger": "1.2.0",
- "glob": "^7.1.2",
- "globals-docs": "^2.4.0",
- "highlight.js": "^9.12.0",
- "js-yaml": "^3.10.0",
- "lodash": "^4.17.4",
- "mdast-util-inject": "^1.1.0",
- "micromatch": "^3.1.5",
- "mime": "^1.4.1",
- "module-deps-sortable": "4.0.6",
- "parse-filepath": "^1.0.2",
- "pify": "^3.0.0",
- "read-pkg-up": "^3.0.0",
- "remark": "^9.0.0",
- "remark-html": "7.0.0",
- "remark-reference-links": "^4.0.1",
- "remark-toc": "^5.0.0",
- "remote-origin-url": "0.4.0",
- "shelljs": "^0.8.1",
- "stream-array": "^1.1.2",
- "strip-json-comments": "^2.0.1",
- "tiny-lr": "^1.1.0",
- "unist-builder": "^1.0.2",
- "unist-util-visit": "^1.3.0",
- "vfile": "^2.3.0",
- "vfile-reporter": "^4.0.0",
- "vfile-sort": "^2.1.0",
- "vinyl": "^2.1.0",
- "vinyl-fs": "^3.0.2",
- "yargs": "^9.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
},
- "anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
"requires": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
+ "kind-of": "3.2.2"
},
"dependencies": {
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "remove-trailing-separator": "^1.0.1"
+ "is-buffer": "1.1.6"
}
}
}
},
- "binary-extensions": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
- "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
- "dev": true
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
- "dev": true
- },
- "chokidar": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
- "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
- "dev": true,
- "requires": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "fsevents": "^1.2.7",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
- }
- },
- "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"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "fsevents": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
- "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
- "dev": true,
- "optional": true,
- "requires": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1"
- }
- },
- "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
- },
- "get-port": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
- "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=",
- "dev": true
- },
- "glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
- "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
- "dev": true,
- "requires": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
- },
- "dependencies": {
- "is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.0"
- }
- }
- }
- },
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "dev": true,
- "requires": {
- "binary-extensions": "^1.0.0"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "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"
- }
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
+ "argparse": "1.0.10",
+ "esprima": "4.0.1"
}
},
"load-json-file": {
@@ -7089,20 +6375,28 @@
"integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^4.0.0",
- "pify": "^3.0.0",
- "strip-bom": "^3.0.0"
+ "graceful-fs": "4.2.6",
+ "parse-json": "4.0.0",
+ "pify": "3.0.0",
+ "strip-bom": "3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
}
},
"locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
"requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
+ "p-locate": "3.0.0",
+ "path-exists": "3.0.0"
}
},
"micromatch": {
@@ -7111,53 +6405,50 @@
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
"dev": true,
"requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.3",
+ "nanomatch": "1.2.13",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
}
},
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "requires": {
- "p-try": "^1.0.0"
- }
+ "mime": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
+ "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
},
"p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
"requires": {
- "p-limit": "^1.1.0"
+ "p-limit": "2.3.0"
}
},
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
- "dev": true
- },
"parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
"dev": true,
"requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
+ "error-ex": "1.3.2",
+ "json-parse-better-errors": "1.0.2"
}
},
"path-exists": {
@@ -7172,13 +6463,21 @@
"integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
"dev": true,
"requires": {
- "pify": "^3.0.0"
+ "pify": "3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
}
},
"pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
+ "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==",
"dev": true
},
"read-pkg": {
@@ -7187,233 +6486,129 @@
"integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
"dev": true,
"requires": {
- "load-json-file": "^4.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^3.0.0"
+ "load-json-file": "4.0.0",
+ "normalize-package-data": "2.5.0",
+ "path-type": "3.0.0"
}
},
"read-pkg-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
- "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
+ "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
"dev": true,
"requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^3.0.0"
+ "find-up": "3.0.0",
+ "read-pkg": "3.0.0"
}
},
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
}
},
- "readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
+ "ansi-styles": "4.3.0",
+ "string-width": "4.2.2",
+ "strip-ansi": "6.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=",
+ "y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"dev": true
},
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"dev": true,
"requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
+ "cliui": "6.0.0",
+ "decamelize": "1.2.0",
+ "find-up": "4.1.0",
+ "get-caller-file": "2.0.5",
+ "require-directory": "2.1.1",
+ "require-main-filename": "2.0.0",
+ "set-blocking": "2.0.0",
+ "string-width": "4.2.2",
+ "which-module": "2.0.0",
+ "y18n": "4.0.3",
+ "yargs-parser": "18.1.3"
},
"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
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "5.0.0",
+ "path-exists": "4.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=",
- "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"
- }
- }
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
- },
- "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=",
- "dev": true
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "dev": true,
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- },
- "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"
- }
- }
- }
- },
- "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",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz",
- "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=",
- "dev": true,
- "requires": {
- "camelcase": "^4.1.0",
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "os-locale": "^2.0.0",
- "read-pkg-up": "^2.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",
- "yargs-parser": "^7.0.0"
- },
- "dependencies": {
- "load-json-file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
- "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "strip-bom": "^3.0.0"
- }
- },
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
- "error-ex": "^1.2.0"
+ "p-locate": "4.1.0"
}
},
- "path-type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
- "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
- "pify": "^2.0.0"
+ "p-limit": "2.3.0"
}
},
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true
- },
- "read-pkg": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
- "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
- "dev": true,
- "requires": {
- "load-json-file": "^2.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^2.0.0"
- }
- },
- "read-pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
- "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
- "dev": true,
- "requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^2.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=",
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dev": true,
"requires": {
- "camelcase": "^4.1.0"
+ "camelcase": "5.3.1",
+ "decamelize": "1.2.0"
}
}
}
@@ -7424,10 +6619,10 @@
"integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
"dev": true,
"requires": {
- "custom-event": "~1.0.0",
- "ent": "~2.2.0",
- "extend": "^3.0.0",
- "void-elements": "^2.0.0"
+ "custom-event": "1.0.1",
+ "ent": "2.2.0",
+ "extend": "3.0.2",
+ "void-elements": "2.0.1"
}
},
"domain-browser": {
@@ -7436,13 +6631,59 @@
"integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
"dev": true
},
- "domexception": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
- "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
+ "dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "requires": {
+ "is-obj": "2.0.0"
+ }
+ },
+ "dotgitignore": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz",
+ "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==",
"dev": true,
"requires": {
- "webidl-conversions": "^4.0.2"
+ "find-up": "3.0.0",
+ "minimatch": "3.0.4"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "3.0.0",
+ "path-exists": "3.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "2.3.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ }
}
},
"dset": {
@@ -7451,9 +6692,9 @@
"integrity": "sha512-nI29OZMRYq36hOcifB6HTjajNAAiBKSXsyWZrq+VniusseuP2OpNlTiYgsaNRSGvpyq5Wjbc2gQLyBdTyWqhnQ=="
},
"duplexer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
- "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
"dev": true
},
"duplexer2": {
@@ -7462,7 +6703,7 @@
"integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
"dev": true,
"requires": {
- "readable-stream": "^2.0.2"
+ "readable-stream": "2.3.7"
},
"dependencies": {
"readable-stream": {
@@ -7471,33 +6712,36 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
},
- "duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
- "dev": true
- },
"duplexify": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
"integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
"dev": true,
"requires": {
- "end-of-stream": "^1.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0",
- "stream-shift": "^1.0.0"
+ "end-of-stream": "1.4.4",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.7",
+ "stream-shift": "1.0.1"
},
"dependencies": {
"readable-stream": {
@@ -7506,13 +6750,22 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
@@ -7523,8 +6776,8 @@
"integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
"dev": true,
"requires": {
- "is-plain-object": "^2.0.1",
- "object.defaults": "^1.1.0"
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0"
}
},
"easy-table": {
@@ -7533,8 +6786,8 @@
"integrity": "sha512-C9Lvm0WFcn2RgxbMnTbXZenMIWcBtkzMr+dWqq/JsVoGFSVUVlPqeOa5LP5kM0I3zoOazFpckOEb2/0LDFfToQ==",
"dev": true,
"requires": {
- "ansi-regex": "^3.0.0",
- "wcwidth": ">=1.0.1"
+ "ansi-regex": "3.0.0",
+ "wcwidth": "1.0.1"
},
"dependencies": {
"ansi-regex": {
@@ -7551,15 +6804,19 @@
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"dev": true,
"requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
+ "jsbn": "0.1.1",
+ "safer-buffer": "2.1.2"
}
},
- "editions": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz",
- "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==",
- "dev": true
+ "edge-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-2.2.1.tgz",
+ "integrity": "sha512-AI5fC7dfDmCdKo3m5y7PkYE8m6bMqR6pvVpgtrZkkhcJXFLelUgkjrhk3kXXx8Kbw2cRaTT4LkOR7hqf39KJdw==",
+ "dev": true,
+ "requires": {
+ "@types/which": "1.3.2",
+ "which": "2.0.2"
+ }
},
"ee-first": {
"version": "1.1.1",
@@ -7567,39 +6824,45 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"ejs": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.3.tgz",
- "integrity": "sha512-wmtrUGyfSC23GC/B1SMv2ogAUgbQEtDmTIhfqielrG5ExIM9TP4UoYdi90jLF1aTcsWCJNEO0UrgKzP0y3nTSg==",
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz",
+ "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==",
"dev": true,
"requires": {
- "jake": "^10.6.1"
+ "jake": "10.8.2"
}
},
"electron-to-chromium": {
- "version": "1.3.505",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.505.tgz",
- "integrity": "sha512-Aunrp3HWtmdiJLIl+IPSFtEvJ/4Q9a3eKaxmzCthaZF1gbTbpHUTCU2zOVnFPH7r/AD7zQXyuFidYXzSHXBdsw==",
+ "version": "1.3.755",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.755.tgz",
+ "integrity": "sha512-BJ1s/kuUuOeo1bF/EM2E4yqW9te0Hpof3wgwBx40AWJE18zsD1Tqo0kr7ijnOc+lRsrlrqKPauJAHqaxOItoUA==",
"dev": true
},
"elliptic": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
- "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
- "dev": true,
- "requires": {
- "bn.js": "^4.4.0",
- "brorand": "^1.0.1",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.0"
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.12.0",
+ "brorand": "1.1.0",
+ "hash.js": "1.1.7",
+ "hmac-drbg": "1.0.1",
+ "inherits": "2.0.4",
+ "minimalistic-assert": "1.0.1",
+ "minimalistic-crypto-utils": "1.0.1"
},
"dependencies": {
"bn.js": {
- "version": "4.11.9",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
- "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
}
}
@@ -7627,109 +6890,60 @@
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
"requires": {
- "once": "^1.4.0"
+ "once": "1.4.0"
}
},
"engine.io": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz",
- "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.1.tgz",
+ "integrity": "sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w==",
"dev": true,
"requires": {
- "accepts": "~1.3.4",
- "base64id": "1.0.0",
- "cookie": "0.3.1",
- "debug": "~3.1.0",
- "engine.io-parser": "~2.1.0",
- "ws": "~3.3.1"
+ "accepts": "1.3.7",
+ "base64id": "2.0.0",
+ "cookie": "0.4.1",
+ "cors": "2.8.5",
+ "debug": "4.3.1",
+ "engine.io-parser": "4.0.2",
+ "ws": "7.4.6"
},
"dependencies": {
"cookie": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
- "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
"dev": true
},
"debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "2.1.2"
}
},
- "ws": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
- "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
- "dev": true,
- "requires": {
- "async-limiter": "~1.0.0",
- "safe-buffer": "~5.1.0",
- "ultron": "~1.1.0"
- }
- }
- }
- },
- "engine.io-client": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
- "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==",
- "dev": true,
- "requires": {
- "component-emitter": "1.2.1",
- "component-inherit": "0.0.3",
- "debug": "~3.1.0",
- "engine.io-parser": "~2.1.1",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "ws": "~3.3.1",
- "xmlhttprequest-ssl": "~1.5.4",
- "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=",
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
"ws": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
- "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
- "dev": true,
- "requires": {
- "async-limiter": "~1.0.0",
- "safe-buffer": "~5.1.0",
- "ultron": "~1.1.0"
- }
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "dev": true
}
}
},
"engine.io-parser": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz",
- "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz",
+ "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==",
"dev": true,
"requires": {
- "after": "0.8.2",
- "arraybuffer.slice": "~0.0.7",
- "base64-arraybuffer": "0.1.5",
- "blob": "0.0.5",
- "has-binary2": "~1.0.2"
+ "base64-arraybuffer": "0.1.4"
}
},
"enhanced-resolve": {
@@ -7738,10 +6952,19 @@
"integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "memory-fs": "^0.4.0",
- "object-assign": "^4.0.1",
- "tapable": "^0.2.7"
+ "graceful-fs": "4.2.6",
+ "memory-fs": "0.4.1",
+ "object-assign": "4.1.1",
+ "tapable": "0.2.9"
+ }
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "4.1.1"
}
},
"ent": {
@@ -7751,12 +6974,12 @@
"dev": true
},
"errno": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
- "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
"dev": true,
"requires": {
- "prr": "~1.0.1"
+ "prr": "1.0.1"
}
},
"error": {
@@ -7765,7 +6988,7 @@
"integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==",
"dev": true,
"requires": {
- "string-template": "~0.2.1"
+ "string-template": "0.2.1"
}
},
"error-ex": {
@@ -7774,58 +6997,47 @@
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
"requires": {
- "is-arrayish": "^0.2.1"
+ "is-arrayish": "0.2.1"
}
},
"es-abstract": {
- "version": "1.17.5",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
- "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
- },
- "dependencies": {
- "is-regex": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
- "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
- "dev": true,
- "requires": {
- "has-symbols": "^1.0.1"
- }
- }
+ "version": "1.18.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz",
+ "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "1.0.2",
+ "es-to-primitive": "1.2.1",
+ "function-bind": "1.1.1",
+ "get-intrinsic": "1.1.1",
+ "has": "1.0.3",
+ "has-symbols": "1.0.2",
+ "is-callable": "1.2.3",
+ "is-negative-zero": "2.0.1",
+ "is-regex": "1.1.3",
+ "is-string": "1.0.6",
+ "object-inspect": "1.10.3",
+ "object-keys": "1.1.1",
+ "object.assign": "4.1.2",
+ "string.prototype.trimend": "1.0.4",
+ "string.prototype.trimstart": "1.0.4",
+ "unbox-primitive": "1.0.1"
}
},
- "es-array-method-boxes-properly": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
- "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
- "dev": true
- },
"es-get-iterator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz",
- "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
+ "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
"dev": true,
"requires": {
- "es-abstract": "^1.17.4",
- "has-symbols": "^1.0.1",
- "is-arguments": "^1.0.4",
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-string": "^1.0.5",
- "isarray": "^2.0.5"
+ "call-bind": "1.0.2",
+ "get-intrinsic": "1.1.1",
+ "has-symbols": "1.0.2",
+ "is-arguments": "1.1.0",
+ "is-map": "2.0.2",
+ "is-set": "2.0.2",
+ "is-string": "1.0.6",
+ "isarray": "2.0.5"
},
"dependencies": {
"isarray": {
@@ -7842,9 +7054,9 @@
"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"dev": true,
"requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
+ "is-callable": "1.2.3",
+ "is-date-object": "1.0.4",
+ "is-symbol": "1.0.4"
}
},
"es5-ext": {
@@ -7853,15 +7065,15 @@
"integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
"dev": true,
"requires": {
- "es6-iterator": "~2.0.3",
- "es6-symbol": "~3.1.3",
- "next-tick": "~1.0.0"
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.3",
+ "next-tick": "1.0.0"
}
},
"es5-shim": {
- "version": "4.5.14",
- "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.14.tgz",
- "integrity": "sha512-7SwlpL+2JpymWTt8sNLuC2zdhhc+wrfe5cMPI2j0o6WsPdfAiPwmFy2f0AocPB4RQVBOZ9kNTgi5YF7TdhkvEg==",
+ "version": "4.5.15",
+ "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.15.tgz",
+ "integrity": "sha512-FYpuxEjMeDvU4rulKqFdukQyZSTpzhg4ScQHrAosrlVpR6GFyaw14f74yn2+4BugniIS0Frpg7TvwZocU4ZMTw==",
"dev": true
},
"es6-iterator": {
@@ -7870,9 +7082,9 @@
"integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
"dev": true,
"requires": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
+ "d": "1.0.1",
+ "es5-ext": "0.10.53",
+ "es6-symbol": "3.1.3"
}
},
"es6-map": {
@@ -7881,12 +7093,12 @@
"integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
"dev": true,
"requires": {
- "d": "1",
- "es5-ext": "~0.10.14",
- "es6-iterator": "~2.0.1",
- "es6-set": "~0.1.5",
- "es6-symbol": "~3.1.1",
- "event-emitter": "~0.3.5"
+ "d": "1.0.1",
+ "es5-ext": "0.10.53",
+ "es6-iterator": "2.0.3",
+ "es6-set": "0.1.5",
+ "es6-symbol": "3.1.3",
+ "event-emitter": "0.3.5"
}
},
"es6-promise": {
@@ -7901,7 +7113,7 @@
"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
"dev": true,
"requires": {
- "es6-promise": "^4.0.3"
+ "es6-promise": "4.2.8"
}
},
"es6-set": {
@@ -7910,11 +7122,11 @@
"integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
"dev": true,
"requires": {
- "d": "1",
- "es5-ext": "~0.10.14",
- "es6-iterator": "~2.0.1",
+ "d": "1.0.1",
+ "es5-ext": "0.10.53",
+ "es6-iterator": "2.0.3",
"es6-symbol": "3.1.1",
- "event-emitter": "~0.3.5"
+ "event-emitter": "0.3.5"
},
"dependencies": {
"es6-symbol": {
@@ -7923,8 +7135,8 @@
"integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
"dev": true,
"requires": {
- "d": "1",
- "es5-ext": "~0.10.14"
+ "d": "1.0.1",
+ "es5-ext": "0.10.53"
}
}
}
@@ -7935,8 +7147,8 @@
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
"dev": true,
"requires": {
- "d": "^1.0.1",
- "ext": "^1.1.2"
+ "d": "1.0.1",
+ "ext": "1.4.0"
}
},
"es6-weak-map": {
@@ -7945,16 +7157,16 @@
"integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
"dev": true,
"requires": {
- "d": "1",
- "es5-ext": "^0.10.46",
- "es6-iterator": "^2.0.3",
- "es6-symbol": "^3.1.1"
+ "d": "1.0.1",
+ "es5-ext": "0.10.53",
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.3"
}
},
"escalade": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz",
- "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true
},
"escape-html": {
@@ -7969,24 +7181,78 @@
"dev": true
},
"escodegen": {
- "version": "1.14.3",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
- "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
+ "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
"dev": true,
"requires": {
- "esprima": "^4.0.1",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1",
- "source-map": "~0.6.1"
+ "esprima": "2.7.3",
+ "estraverse": "1.9.3",
+ "esutils": "2.0.3",
+ "optionator": "0.8.3",
+ "source-map": "0.2.0"
},
"dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+ "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "word-wrap": "1.2.3"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
"source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+ "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
"dev": true,
- "optional": true
+ "optional": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
}
}
},
@@ -7996,237 +7262,217 @@
"integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
"dev": true,
"requires": {
- "es6-map": "^0.1.3",
- "es6-weak-map": "^2.0.1",
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
+ "es6-map": "0.1.5",
+ "es6-weak-map": "2.0.3",
+ "esrecurse": "4.3.0",
+ "estraverse": "4.3.0"
}
},
"eslint": {
- "version": "4.19.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
- "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
- "dev": true,
- "requires": {
- "ajv": "^5.3.0",
- "babel-code-frame": "^6.22.0",
- "chalk": "^2.1.0",
- "concat-stream": "^1.6.0",
- "cross-spawn": "^5.1.0",
- "debug": "^3.1.0",
- "doctrine": "^2.1.0",
- "eslint-scope": "^3.7.1",
- "eslint-visitor-keys": "^1.0.0",
- "espree": "^3.5.4",
- "esquery": "^1.0.0",
- "esutils": "^2.0.2",
- "file-entry-cache": "^2.0.0",
- "functional-red-black-tree": "^1.0.1",
- "glob": "^7.1.2",
- "globals": "^11.0.1",
- "ignore": "^3.3.3",
- "imurmurhash": "^0.1.4",
- "inquirer": "^3.0.6",
- "is-resolvable": "^1.0.0",
- "js-yaml": "^3.9.1",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.3.0",
- "lodash": "^4.17.4",
- "minimatch": "^3.0.2",
- "mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "optionator": "^0.8.2",
- "path-is-inside": "^1.0.2",
- "pluralize": "^7.0.0",
- "progress": "^2.0.0",
- "regexpp": "^1.0.1",
- "require-uncached": "^1.0.3",
- "semver": "^5.3.0",
- "strip-ansi": "^4.0.0",
- "strip-json-comments": "~2.0.1",
- "table": "4.0.2",
- "text-table": "~0.2.0"
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz",
+ "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "0.4.2",
+ "ajv": "6.12.6",
+ "chalk": "4.1.1",
+ "cross-spawn": "7.0.3",
+ "debug": "4.3.1",
+ "doctrine": "3.0.0",
+ "enquirer": "2.3.6",
+ "escape-string-regexp": "4.0.0",
+ "eslint-scope": "5.1.1",
+ "eslint-utils": "2.1.0",
+ "eslint-visitor-keys": "2.1.0",
+ "espree": "7.3.1",
+ "esquery": "1.4.0",
+ "esutils": "2.0.3",
+ "fast-deep-equal": "3.1.3",
+ "file-entry-cache": "6.0.1",
+ "functional-red-black-tree": "1.0.1",
+ "glob-parent": "5.1.2",
+ "globals": "13.9.0",
+ "ignore": "4.0.6",
+ "import-fresh": "3.3.0",
+ "imurmurhash": "0.1.4",
+ "is-glob": "4.0.1",
+ "js-yaml": "3.14.1",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.4.1",
+ "lodash.merge": "4.6.2",
+ "minimatch": "3.0.4",
+ "natural-compare": "1.4.0",
+ "optionator": "0.9.1",
+ "progress": "2.0.3",
+ "regexpp": "3.2.0",
+ "semver": "7.3.5",
+ "strip-ansi": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "table": "6.7.1",
+ "text-table": "0.2.0",
+ "v8-compile-cache": "2.3.0"
},
"dependencies": {
- "ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
- "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
- },
- "chardet": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
- "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
- "dev": true
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"dev": true,
"requires": {
- "restore-cursor": "^2.0.0"
+ "@babel/highlight": "7.14.5"
}
},
- "cli-width": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
- "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
- "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=",
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
+ "fast-deep-equal": "3.1.3",
+ "fast-json-stable-stringify": "2.1.0",
+ "json-schema-traverse": "0.4.1",
+ "uri-js": "4.4.1"
}
},
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "color-convert": "2.0.1"
}
},
- "doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
- "esutils": "^2.0.2"
+ "sprintf-js": "1.0.3"
}
},
- "external-editor": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
- "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
- "chardet": "^0.4.0",
- "iconv-lite": "^0.4.17",
- "tmp": "^0.0.33"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "escape-string-regexp": "^1.0.5"
+ "color-name": "1.1.4"
}
},
- "inquirer": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
- "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"requires": {
- "ansi-escapes": "^3.0.0",
- "chalk": "^2.0.0",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^2.0.4",
- "figures": "^2.0.0",
- "lodash": "^4.3.0",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rx-lite": "^4.0.8",
- "rx-lite-aggregates": "^4.0.8",
- "string-width": "^2.1.0",
- "strip-ansi": "^4.0.0",
- "through": "^2.3.6"
+ "path-key": "3.1.1",
+ "shebang-command": "2.0.0",
+ "which": "2.0.2"
}
},
- "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
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
},
- "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==",
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true
},
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "globals": {
+ "version": "13.9.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz",
+ "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==",
"dev": true,
"requires": {
- "minimist": "^1.2.5"
+ "type-fest": "0.20.2"
}
},
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
- "mimic-fn": "^1.0.0"
+ "argparse": "1.0.10",
+ "esprima": "4.0.1"
}
},
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"requires": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
+ "yallist": "4.0.0"
}
},
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
+ "lru-cache": "6.0.0"
}
},
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "ansi-regex": "^3.0.0"
+ "has-flag": "4.0.0"
}
},
- "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=",
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
}
}
@@ -8243,27 +7489,36 @@
"integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
"dev": true,
"requires": {
- "debug": "^2.6.9",
- "resolve": "^1.13.1"
+ "debug": "2.6.9",
+ "resolve": "1.20.0"
}
},
"eslint-module-utils": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
- "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz",
+ "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==",
"dev": true,
"requires": {
- "debug": "^2.6.9",
- "pkg-dir": "^2.0.0"
+ "debug": "3.2.7",
+ "pkg-dir": "2.0.0"
},
"dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.3"
+ }
+ },
"find-up": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"dev": true,
"requires": {
- "locate-path": "^2.0.0"
+ "locate-path": "2.0.0"
}
},
"locate-path": {
@@ -8272,17 +7527,23 @@
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"dev": true,
"requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
}
},
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
"p-limit": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"dev": true,
"requires": {
- "p-try": "^1.0.0"
+ "p-try": "1.0.0"
}
},
"p-locate": {
@@ -8291,7 +7552,7 @@
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
"dev": true,
"requires": {
- "p-limit": "^1.1.0"
+ "p-limit": "1.3.0"
}
},
"p-try": {
@@ -8312,51 +7573,72 @@
"integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
"dev": true,
"requires": {
- "find-up": "^2.1.0"
+ "find-up": "2.1.0"
}
}
}
},
+ "eslint-plugin-es": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+ "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "2.1.0",
+ "regexpp": "3.2.0"
+ }
+ },
"eslint-plugin-import": {
- "version": "2.22.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz",
- "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==",
- "dev": true,
- "requires": {
- "array-includes": "^3.1.1",
- "array.prototype.flat": "^1.2.3",
- "contains-path": "^0.1.0",
- "debug": "^2.6.9",
- "doctrine": "1.5.0",
- "eslint-import-resolver-node": "^0.3.3",
- "eslint-module-utils": "^2.6.0",
- "has": "^1.0.3",
- "minimatch": "^3.0.4",
- "object.values": "^1.1.1",
- "read-pkg-up": "^2.0.0",
- "resolve": "^1.17.0",
- "tsconfig-paths": "^3.9.0"
+ "version": "2.23.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz",
+ "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==",
+ "dev": true,
+ "requires": {
+ "array-includes": "3.1.3",
+ "array.prototype.flat": "1.2.4",
+ "debug": "2.6.9",
+ "doctrine": "2.1.0",
+ "eslint-import-resolver-node": "0.3.4",
+ "eslint-module-utils": "2.6.1",
+ "find-up": "2.1.0",
+ "has": "1.0.3",
+ "is-core-module": "2.4.0",
+ "minimatch": "3.0.4",
+ "object.values": "1.1.4",
+ "pkg-up": "2.0.0",
+ "read-pkg-up": "3.0.0",
+ "resolve": "1.20.0",
+ "tsconfig-paths": "3.9.0"
},
"dependencies": {
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.3"
+ }
+ },
"find-up": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"dev": true,
"requires": {
- "locate-path": "^2.0.0"
+ "locate-path": "2.0.0"
}
},
"load-json-file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
- "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "strip-bom": "^3.0.0"
+ "graceful-fs": "4.2.6",
+ "parse-json": "4.0.0",
+ "pify": "3.0.0",
+ "strip-bom": "3.0.0"
}
},
"locate-path": {
@@ -8365,8 +7647,8 @@
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"dev": true,
"requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
}
},
"p-limit": {
@@ -8375,7 +7657,7 @@
"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"dev": true,
"requires": {
- "p-try": "^1.0.0"
+ "p-try": "1.0.0"
}
},
"p-locate": {
@@ -8384,7 +7666,7 @@
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
"dev": true,
"requires": {
- "p-limit": "^1.1.0"
+ "p-limit": "1.3.0"
}
},
"p-try": {
@@ -8393,6 +7675,16 @@
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
"dev": true
},
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "requires": {
+ "error-ex": "1.3.2",
+ "json-parse-better-errors": "1.0.2"
+ }
+ },
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
@@ -8400,33 +7692,39 @@
"dev": true
},
"path-type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
- "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
"dev": true,
"requires": {
- "pify": "^2.0.0"
+ "pify": "3.0.0"
}
},
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
"read-pkg": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
- "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
"dev": true,
"requires": {
- "load-json-file": "^2.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^2.0.0"
+ "load-json-file": "4.0.0",
+ "normalize-package-data": "2.5.0",
+ "path-type": "3.0.0"
}
},
"read-pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
- "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
+ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
"dev": true,
"requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^2.0.0"
+ "find-up": "2.1.0",
+ "read-pkg": "3.0.0"
}
},
"strip-bom": {
@@ -8438,21 +7736,23 @@
}
},
"eslint-plugin-node": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz",
- "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==",
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
+ "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
"dev": true,
"requires": {
- "ignore": "^3.3.6",
- "minimatch": "^3.0.4",
- "resolve": "^1.3.3",
- "semver": "5.3.0"
+ "eslint-plugin-es": "3.0.1",
+ "eslint-utils": "2.1.0",
+ "ignore": "5.1.8",
+ "minimatch": "3.0.4",
+ "resolve": "1.20.0",
+ "semver": "6.3.0"
},
"dependencies": {
- "semver": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
- "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true
}
}
@@ -8462,9 +7762,9 @@
"dev": true
},
"eslint-plugin-promise": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz",
- "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz",
+ "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==",
"dev": true
},
"eslint-plugin-standard": {
@@ -8474,29 +7774,55 @@
"dev": true
},
"eslint-scope": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz",
- "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "4.3.0",
+ "estraverse": "4.3.0"
+ }
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
"dev": true,
"requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
+ "eslint-visitor-keys": "1.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
}
},
"eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
"dev": true
},
"espree": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
- "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
"requires": {
- "acorn": "^5.5.0",
- "acorn-jsx": "^3.0.0"
+ "acorn": "7.4.1",
+ "acorn-jsx": "5.3.1",
+ "eslint-visitor-keys": "1.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
}
},
"esprima": {
@@ -8506,29 +7832,37 @@
"dev": true
},
"esquery": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
- "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
"requires": {
- "estraverse": "^5.1.0"
+ "estraverse": "5.2.0"
},
"dependencies": {
"estraverse": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
- "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
"dev": true
}
}
},
"esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
- "estraverse": "^4.1.0"
+ "estraverse": "5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
}
},
"estraverse": {
@@ -8537,6 +7871,12 @@
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true
},
+ "estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
"esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
@@ -8554,8 +7894,8 @@
"integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
"dev": true,
"requires": {
- "d": "1",
- "es5-ext": "~0.10.14"
+ "d": "1.0.1",
+ "es5-ext": "0.10.53"
}
},
"event-stream": {
@@ -8564,25 +7904,25 @@
"integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
"dev": true,
"requires": {
- "duplexer": "~0.1.1",
- "from": "~0",
- "map-stream": "~0.1.0",
+ "duplexer": "0.1.2",
+ "from": "0.1.7",
+ "map-stream": "0.1.0",
"pause-stream": "0.0.11",
- "split": "0.3",
- "stream-combiner": "~0.0.4",
- "through": "~2.3.1"
+ "split": "0.3.3",
+ "stream-combiner": "0.0.4",
+ "through": "2.3.8"
}
},
"eventemitter3": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
- "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"dev": true
},
"events": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
- "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"dev": true
},
"evp_bytestokey": {
@@ -8591,29 +7931,23 @@
"integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
"dev": true,
"requires": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
+ "md5.js": "1.3.5",
+ "safe-buffer": "5.1.2"
}
},
- "exec-sh": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz",
- "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==",
- "dev": true
- },
"execa": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
"integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
"dev": true,
"requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.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"
+ "cross-spawn": "6.0.5",
+ "get-stream": "4.1.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.3",
+ "strip-eof": "1.0.0"
},
"dependencies": {
"cross-spawn": {
@@ -8622,11 +7956,11 @@
"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"
+ "nice-try": "1.0.5",
+ "path-key": "2.0.1",
+ "semver": "5.7.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.1"
}
},
"get-stream": {
@@ -8635,30 +7969,66 @@
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"requires": {
- "pump": "^3.0.0"
+ "pump": "3.0.0"
}
- }
- }
- },
- "exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
- "dev": true
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ }
+ }
+ },
+ "exit-on-epipe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
+ "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
"requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
},
"dependencies": {
"define-property": {
@@ -8667,7 +8037,7 @@
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "^0.1.0"
+ "is-descriptor": "0.1.6"
}
},
"extend-shallow": {
@@ -8676,7 +8046,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -8687,7 +8057,7 @@
"integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
"dev": true,
"requires": {
- "fill-range": "^2.1.0"
+ "fill-range": "2.2.4"
},
"dependencies": {
"fill-range": {
@@ -8696,26 +8066,20 @@
"integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
"dev": true,
"requires": {
- "is-number": "^2.1.0",
- "isobject": "^2.0.0",
- "randomatic": "^3.0.0",
- "repeat-element": "^1.1.2",
- "repeat-string": "^1.5.2"
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "3.1.1",
+ "repeat-element": "1.1.4",
+ "repeat-string": "1.6.1"
}
},
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
"is-number": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
"integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "kind-of": "3.2.2"
}
},
"isobject": {
@@ -8733,7 +8097,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
@@ -8744,58 +8108,39 @@
"integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
"dev": true,
"requires": {
- "homedir-polyfill": "^1.0.1"
+ "homedir-polyfill": "1.0.3"
}
},
"expect": {
- "version": "26.1.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-26.1.0.tgz",
- "integrity": "sha512-QbH4LZXDsno9AACrN9eM0zfnby9G+OsdNgZUohjg/P0mLy1O+/bzTAJGT6VSIjVCe8yKM6SzEl/ckEOFBT7Vnw==",
+ "version": "27.0.2",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.2.tgz",
+ "integrity": "sha512-YJFNJe2+P2DqH+ZrXy+ydRQYO87oxRUonZImpDodR1G7qo3NYd3pL+NQ9Keqpez3cehczYwZDBC3A7xk3n7M/w==",
"dev": true,
"requires": {
- "@jest/types": "^26.1.0",
- "ansi-styles": "^4.0.0",
- "jest-get-type": "^26.0.0",
- "jest-matcher-utils": "^26.1.0",
- "jest-message-util": "^26.1.0",
- "jest-regex-util": "^26.0.0"
+ "@jest/types": "27.0.2",
+ "ansi-styles": "5.2.0",
+ "jest-get-type": "27.0.1",
+ "jest-matcher-utils": "27.0.2",
+ "jest-message-util": "27.0.2",
+ "jest-regex-util": "27.0.1"
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true
}
}
},
"expect-webdriverio": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-1.2.0.tgz",
- "integrity": "sha512-nis1EL4LJSKvhqES6ojx1QqAZYtWAUHaVtwilXBXJELN2YZhwOcrfBT0AvxDvJXYKzgDDTED9STc9MwcK8KbYg==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-3.1.0.tgz",
+ "integrity": "sha512-Kn4Rtu5vKbDo95WNcjZ9XVz/qTPGZzumP9w7VSV4OxY5z6BAqSI2jb85EsqPxpavs33P+9Qse4Z+d5ilDD/dQw==",
"dev": true,
"requires": {
- "expect": "^26.0.1",
- "jest-matcher-utils": "^26.0.1"
+ "expect": "27.0.2",
+ "jest-matcher-utils": "27.0.2"
}
},
"express": {
@@ -8803,36 +8148,36 @@
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"requires": {
- "accepts": "~1.3.7",
+ "accepts": "1.3.7",
"array-flatten": "1.1.1",
"body-parser": "1.19.0",
"content-disposition": "0.5.3",
- "content-type": "~1.0.4",
+ "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",
+ "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",
+ "methods": "1.1.2",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.3",
"path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.5",
+ "proxy-addr": "2.0.7",
"qs": "6.7.0",
- "range-parser": "~1.2.1",
+ "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",
+ "statuses": "1.5.0",
+ "type-is": "1.6.18",
"utils-merge": "1.0.1",
- "vary": "~1.1.2"
+ "vary": "1.1.2"
}
},
"ext": {
@@ -8841,13 +8186,13 @@
"integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
"dev": true,
"requires": {
- "type": "^2.0.0"
+ "type": "2.5.0"
},
"dependencies": {
"type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
- "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz",
+ "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==",
"dev": true
}
}
@@ -8864,8 +8209,8 @@
"integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
"dev": true,
"requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
},
"dependencies": {
"is-extendable": {
@@ -8874,7 +8219,7 @@
"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
"dev": true,
"requires": {
- "is-plain-object": "^2.0.4"
+ "is-plain-object": "2.0.4"
}
}
}
@@ -8885,9 +8230,9 @@
"integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
"dev": true,
"requires": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
+ "chardet": "0.7.0",
+ "iconv-lite": "0.4.24",
+ "tmp": "0.0.33"
}
},
"extglob": {
@@ -8896,14 +8241,14 @@
"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
"dev": true,
"requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
},
"dependencies": {
"define-property": {
@@ -8912,7 +8257,7 @@
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
"dev": true,
"requires": {
- "is-descriptor": "^1.0.0"
+ "is-descriptor": "1.0.2"
}
},
"extend-shallow": {
@@ -8921,7 +8266,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
},
"is-accessor-descriptor": {
@@ -8930,7 +8275,7 @@
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"dev": true,
"requires": {
- "kind-of": "^6.0.0"
+ "kind-of": "6.0.3"
}
},
"is-data-descriptor": {
@@ -8939,7 +8284,7 @@
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"dev": true,
"requires": {
- "kind-of": "^6.0.0"
+ "kind-of": "6.0.3"
}
},
"is-descriptor": {
@@ -8948,9 +8293,9 @@
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.3"
}
}
}
@@ -8961,19 +8306,19 @@
"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
"dev": true,
"requires": {
- "@types/yauzl": "^2.9.1",
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
+ "@types/yauzl": "2.9.1",
+ "debug": "4.3.1",
+ "get-stream": "5.2.0",
+ "yauzl": "2.10.0"
},
"dependencies": {
"debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.2"
}
},
"ms": {
@@ -8991,9 +8336,9 @@
"dev": true
},
"faker": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/faker/-/faker-3.1.0.tgz",
- "integrity": "sha1-D5CPr05uwCUk5UpX5DLFwBPgjJ8=",
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz",
+ "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==",
"dev": true
},
"fancy-log": {
@@ -9002,10 +8347,10 @@
"integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
"dev": true,
"requires": {
- "ansi-gray": "^0.1.1",
- "color-support": "^1.1.3",
- "parse-node-version": "^1.0.0",
- "time-stamp": "^1.0.0"
+ "ansi-gray": "0.1.1",
+ "color-support": "1.1.3",
+ "parse-node-version": "1.0.1",
+ "time-stamp": "1.1.0"
}
},
"fast-deep-equal": {
@@ -9032,16 +8377,7 @@
"integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
"dev": true,
"requires": {
- "websocket-driver": ">=0.5.1"
- }
- },
- "fb-watchman": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
- "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
- "dev": true,
- "requires": {
- "bser": "2.1.1"
+ "websocket-driver": "0.7.4"
}
},
"fd-slicer": {
@@ -9050,16 +8386,16 @@
"integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
"dev": true,
"requires": {
- "pend": "~1.2.0"
+ "pend": "1.2.0"
}
},
"fibers": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/fibers/-/fibers-4.0.3.tgz",
- "integrity": "sha512-MW5VrDtTOLpKK7lzw4qD7Z9tXaAhdOmOED5RHzg3+HjUk+ibkjVW0Py2ERtdqgTXaerLkVkBy2AEmJiT6RMyzg==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.0.tgz",
+ "integrity": "sha512-UpGv/YAZp7mhKHxDvC1tColrroGRX90sSvh8RMZV9leo+e5+EkRVgCEZPlmXeo3BUNQTZxUaVdLskq1Q2FyCPg==",
"dev": true,
"requires": {
- "detect-libc": "^1.0.3"
+ "detect-libc": "1.0.3"
}
},
"figures": {
@@ -9068,17 +8404,16 @@
"integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
"dev": true,
"requires": {
- "escape-string-regexp": "^1.0.5"
+ "escape-string-regexp": "1.0.5"
}
},
"file-entry-cache": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
- "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"requires": {
- "flat-cache": "^1.2.1",
- "object-assign": "^4.0.1"
+ "flat-cache": "3.0.4"
}
},
"file-uri-to-path": {
@@ -9089,12 +8424,12 @@
"optional": true
},
"filelist": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.1.tgz",
- "integrity": "sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz",
+ "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==",
"dev": true,
"requires": {
- "minimatch": "^3.0.4"
+ "minimatch": "3.0.4"
}
},
"filename-regex": {
@@ -9103,16 +8438,6 @@
"integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
"dev": true
},
- "fileset": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
- "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
- "dev": true,
- "requires": {
- "glob": "^7.0.3",
- "minimatch": "^3.0.3"
- }
- },
"filesize": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
@@ -9125,77 +8450,38 @@
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
- "to-regex-range": "^5.0.1"
+ "to-regex-range": "5.0.1"
}
},
+ "filter-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
+ "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=",
+ "dev": true
+ },
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"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"
+ "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"
}
},
"find-cache-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
- "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
+ "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
"dev": true,
"requires": {
- "commondir": "^1.0.1",
- "make-dir": "^2.0.0",
- "pkg-dir": "^3.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- },
- "pkg-dir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
- "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
- "dev": true,
- "requires": {
- "find-up": "^3.0.0"
- }
- }
+ "commondir": "1.0.1",
+ "make-dir": "3.1.0",
+ "pkg-dir": "4.2.0"
}
},
"find-up": {
@@ -9204,8 +8490,8 @@
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
+ "locate-path": "5.0.0",
+ "path-exists": "4.0.0"
}
},
"findup-sync": {
@@ -9214,10 +8500,10 @@
"integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
"dev": true,
"requires": {
- "detect-file": "^1.0.0",
- "is-glob": "^4.0.0",
- "micromatch": "^3.0.4",
- "resolve-dir": "^1.0.1"
+ "detect-file": "1.0.0",
+ "is-glob": "4.0.1",
+ "micromatch": "3.1.10",
+ "resolve-dir": "1.0.1"
},
"dependencies": {
"braces": {
@@ -9226,16 +8512,16 @@
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
"dev": true,
"requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.4",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
},
"dependencies": {
"extend-shallow": {
@@ -9244,7 +8530,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -9255,10 +8541,10 @@
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
"dev": true,
"requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
},
"dependencies": {
"extend-shallow": {
@@ -9267,24 +8553,18 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
},
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "kind-of": "3.2.2"
},
"dependencies": {
"kind-of": {
@@ -9293,7 +8573,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
@@ -9304,19 +8584,19 @@
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
"dev": true,
"requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.3",
+ "nanomatch": "1.2.13",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
}
},
"to-regex-range": {
@@ -9325,8 +8605,8 @@
"integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
"dev": true,
"requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
}
}
}
@@ -9337,11 +8617,11 @@
"integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
"dev": true,
"requires": {
- "expand-tilde": "^2.0.2",
- "is-plain-object": "^2.0.3",
- "object.defaults": "^1.1.0",
- "object.pick": "^1.2.0",
- "parse-filepath": "^1.0.1"
+ "expand-tilde": "2.0.2",
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0",
+ "object.pick": "1.3.0",
+ "parse-filepath": "1.0.2"
}
},
"flagged-respawn": {
@@ -9351,41 +8631,36 @@
"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"
- }
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true
},
"flat-cache": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
- "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
- "circular-json": "^0.3.1",
- "graceful-fs": "^4.1.2",
- "rimraf": "~2.6.2",
- "write": "^0.2.1"
+ "flatted": "3.1.1",
+ "rimraf": "3.0.2"
},
"dependencies": {
"rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
- "glob": "^7.1.3"
+ "glob": "7.1.7"
}
}
}
},
"flatted": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
- "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
"dev": true
},
"flush-write-stream": {
@@ -9394,8 +8669,8 @@
"integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
"dev": true,
"requires": {
- "inherits": "^2.0.3",
- "readable-stream": "^2.3.6"
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.7"
},
"dependencies": {
"readable-stream": {
@@ -9404,21 +8679,30 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
},
"follow-redirects": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz",
- "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz",
+ "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==",
"dev": true
},
"for-in": {
@@ -9433,7 +8717,7 @@
"integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
"dev": true,
"requires": {
- "for-in": "^1.0.1"
+ "for-in": "1.0.2"
}
},
"foreach": {
@@ -9466,15 +8750,15 @@
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dev": true,
"requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.8",
+ "mime-types": "2.1.31"
}
},
"forwarded": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
- "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
},
"fragment-cache": {
"version": "0.2.1",
@@ -9482,7 +8766,7 @@
"integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
"dev": true,
"requires": {
- "map-cache": "^0.2.2"
+ "map-cache": "0.2.2"
}
},
"fresh": {
@@ -9496,40 +8780,13 @@
"integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
"dev": true
},
- "from2": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
- "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- }
- }
- },
"fs-access": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz",
"integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=",
"dev": true,
"requires": {
- "null-check": "^1.0.0"
+ "null-check": "1.0.0"
}
},
"fs-constants": {
@@ -9539,15 +8796,14 @@
"dev": true
},
"fs-extra": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
- "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+ "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
"dev": true,
"requires": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^1.0.0"
+ "graceful-fs": "4.2.6",
+ "jsonfile": "6.1.0",
+ "universalify": "2.0.0"
}
},
"fs-mkdirp-stream": {
@@ -9556,8 +8812,44 @@
"integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.11",
- "through2": "^2.0.3"
+ "graceful-fs": "4.2.6",
+ "through2": "2.0.5"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
+ }
+ }
}
},
"fs.extra": {
@@ -9566,9 +8858,9 @@
"integrity": "sha1-3QI/kwE77iRTHxszUUw3sg/ZM0k=",
"dev": true,
"requires": {
- "fs-extra": "~0.6.1",
- "mkdirp": "~0.3.5",
- "walk": "^2.3.9"
+ "fs-extra": "0.6.4",
+ "mkdirp": "0.3.5",
+ "walk": "2.3.14"
},
"dependencies": {
"fs-extra": {
@@ -9577,10 +8869,10 @@
"integrity": "sha1-9G8MdbeEH40gCzNIzU1pHVoJnRU=",
"dev": true,
"requires": {
- "jsonfile": "~1.0.1",
- "mkdirp": "0.3.x",
- "ncp": "~0.4.2",
- "rimraf": "~2.2.0"
+ "jsonfile": "1.0.1",
+ "mkdirp": "0.3.5",
+ "ncp": "0.4.2",
+ "rimraf": "2.2.8"
}
},
"jsonfile": {
@@ -9610,9 +8902,9 @@
"dev": true
},
"fsevents": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
- "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"optional": true
},
@@ -9622,10 +8914,10 @@
"integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "inherits": "~2.0.0",
- "mkdirp": ">=0.5 0",
- "rimraf": "2"
+ "graceful-fs": "4.2.6",
+ "inherits": "2.0.3",
+ "mkdirp": "0.5.5",
+ "rimraf": "2.5.4"
},
"dependencies": {
"mkdirp": {
@@ -9634,17 +8926,17 @@
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
- "minimist": "^1.2.5"
+ "minimist": "1.2.5"
}
}
}
},
"fun-hooks": {
- "version": "0.9.9",
- "resolved": "https://registry.npmjs.org/fun-hooks/-/fun-hooks-0.9.9.tgz",
- "integrity": "sha512-821UhoYfO9Sg01wAl/QsDRB088BW0aeOqzC1PXLxSlB+kaUVbK+Vp6wMDHU5huZZopYxmMmv5jDkEYqDpK3hqg==",
+ "version": "0.9.10",
+ "resolved": "https://registry.npmjs.org/fun-hooks/-/fun-hooks-0.9.10.tgz",
+ "integrity": "sha512-7xBjdT+oMYOPWgwFxNiNzF4ubeUvim4zs1DnQqSSGyxu8UD7AW/6Z0iFsVRwuVSIZKUks2en2VHHotmNfj3ipw==",
"requires": {
- "typescript-tuple": "^2.2.1"
+ "typescript-tuple": "2.2.1"
}
},
"function-bind": {
@@ -9665,13 +8957,47 @@
"integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
"dev": true,
"requires": {
- "globule": "^1.0.0"
+ "globule": "1.3.2"
+ }
+ },
+ "generic-names": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz",
+ "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "loader-utils": "1.4.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimist": "1.2.5"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "big.js": "5.2.2",
+ "emojis-list": "3.0.0",
+ "json5": "1.0.1"
+ }
+ }
}
},
"gensync": {
- "version": "1.0.0-beta.1",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
- "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true
},
"get-caller-file": {
@@ -9686,69 +9012,244 @@
"integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
"dev": true
},
- "get-port": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
- "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==",
- "dev": true
- },
- "get-stdin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
- "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
- "dev": true
- },
- "get-stream": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
- "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "dev": true
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "git-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/git-up/-/git-up-2.1.0.tgz",
- "integrity": "sha512-MJgwfcSd9qxgDyEYpRU/CDxNpUadrK80JHuEQDG4Urn0m7tpSOgCBrtiSIa9S9KH8Tbuo/TN8SSQmJBvsw1HkA==",
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"dev": true,
"requires": {
- "is-ssh": "^1.3.0",
- "parse-url": "^3.0.2"
+ "function-bind": "1.1.1",
+ "has": "1.0.3",
+ "has-symbols": "1.0.2"
}
},
- "git-url-parse": {
- "version": "8.3.1",
- "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-8.3.1.tgz",
- "integrity": "sha512-r/FxXIdfgdSO+V2zl4ZK1JGYkHT9nqVRSzom5WsYPLg3XzeBeKPl3R/6X9E9ZJRx/sE/dXwXtfl+Zp7YL8ktWQ==",
+ "get-pkg-repo": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz",
+ "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=",
"dev": true,
"requires": {
- "git-up": "^2.0.0",
- "parse-domain": "^2.0.0"
- }
- },
- "github-slugger": {
- "version": "1.2.0",
+ "hosted-git-info": "2.8.9",
+ "meow": "3.7.0",
+ "normalize-package-data": "2.5.0",
+ "parse-github-repo-url": "1.4.1",
+ "through2": "2.0.5"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.5",
+ "normalize-package-data": "2.5.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ }
+ }
+ },
+ "get-port": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
+ "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "requires": {
+ "pump": "3.0.0"
+ }
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "git-raw-commits": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz",
+ "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==",
+ "dev": true,
+ "requires": {
+ "dargs": "7.0.0",
+ "lodash": "4.17.21",
+ "meow": "8.1.2",
+ "split2": "3.2.2",
+ "through2": "4.0.2"
+ }
+ },
+ "git-remote-origin-url": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
+ "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=",
+ "dev": true,
+ "requires": {
+ "gitconfiglocal": "1.0.0",
+ "pify": "2.3.0"
+ }
+ },
+ "git-semver-tags": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz",
+ "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==",
+ "dev": true,
+ "requires": {
+ "meow": "8.1.2",
+ "semver": "6.3.0"
+ }
+ },
+ "git-up": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz",
+ "integrity": "sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ==",
+ "dev": true,
+ "requires": {
+ "is-ssh": "1.3.3",
+ "parse-url": "5.0.5"
+ }
+ },
+ "git-url-parse": {
+ "version": "11.4.4",
+ "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.4.4.tgz",
+ "integrity": "sha512-Y4o9o7vQngQDIU9IjyCmRJBin5iYjI5u9ZITnddRZpD7dcCFQj2sL2XuMNbLRE4b4B/4ENPsp2Q8P44fjAZ0Pw==",
+ "dev": true,
+ "requires": {
+ "git-up": "4.0.2"
+ }
+ },
+ "gitconfiglocal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
+ "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=",
+ "dev": true,
+ "requires": {
+ "ini": "1.3.8"
+ }
+ },
+ "github-slugger": {
+ "version": "1.2.0",
"resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.0.tgz",
"integrity": "sha512-wIaa75k1vZhyPm9yWrD08A5Xnx/V+RmzGrpjQuLemGKSb77Qukiaei58Bogrl/LZSADDfPzKJX8jhLs4CRTl7Q==",
"dev": true,
"requires": {
- "emoji-regex": ">=6.0.0 <=6.1.1"
+ "emoji-regex": "6.1.1"
},
"dependencies": {
"emoji-regex": {
@@ -9760,17 +9261,17 @@
}
},
"glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
"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"
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
}
},
"glob-base": {
@@ -9779,8 +9280,8 @@
"integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
"dev": true,
"requires": {
- "glob-parent": "^2.0.0",
- "is-glob": "^2.0.0"
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
},
"dependencies": {
"glob-parent": {
@@ -9789,7 +9290,7 @@
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"dev": true,
"requires": {
- "is-glob": "^2.0.0"
+ "is-glob": "2.0.1"
}
},
"is-extglob": {
@@ -9804,18 +9305,18 @@
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
"requires": {
- "is-extglob": "^1.0.0"
+ "is-extglob": "1.0.0"
}
}
}
},
"glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
- "is-glob": "^4.0.1"
+ "is-glob": "4.0.1"
}
},
"glob-stream": {
@@ -9824,16 +9325,16 @@
"integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
"dev": true,
"requires": {
- "extend": "^3.0.0",
- "glob": "^7.1.1",
- "glob-parent": "^3.1.0",
- "is-negated-glob": "^1.0.0",
- "ordered-read-streams": "^1.0.0",
- "pumpify": "^1.3.5",
- "readable-stream": "^2.1.5",
- "remove-trailing-separator": "^1.0.1",
- "to-absolute-glob": "^2.0.0",
- "unique-stream": "^2.0.2"
+ "extend": "3.0.2",
+ "glob": "7.1.7",
+ "glob-parent": "3.1.0",
+ "is-negated-glob": "1.0.0",
+ "ordered-read-streams": "1.0.1",
+ "pumpify": "1.5.1",
+ "readable-stream": "2.3.7",
+ "remove-trailing-separator": "1.1.0",
+ "to-absolute-glob": "2.0.2",
+ "unique-stream": "2.3.1"
},
"dependencies": {
"glob-parent": {
@@ -9842,8 +9343,8 @@
"integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
"dev": true,
"requires": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
}
},
"is-glob": {
@@ -9852,7 +9353,7 @@
"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
"dev": true,
"requires": {
- "is-extglob": "^2.1.0"
+ "is-extglob": "2.1.1"
}
},
"readable-stream": {
@@ -9861,13 +9362,22 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
@@ -9878,13 +9388,13 @@
"integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==",
"dev": true,
"requires": {
- "anymatch": "^2.0.0",
- "async-done": "^1.2.0",
- "chokidar": "^2.0.0",
- "is-negated-glob": "^1.0.0",
- "just-debounce": "^1.0.0",
- "normalize-path": "^3.0.0",
- "object.defaults": "^1.1.0"
+ "anymatch": "2.0.0",
+ "async-done": "1.3.2",
+ "chokidar": "2.1.8",
+ "is-negated-glob": "1.0.0",
+ "just-debounce": "1.1.0",
+ "normalize-path": "3.0.0",
+ "object.defaults": "1.1.0"
},
"dependencies": {
"anymatch": {
@@ -9893,8 +9403,8 @@
"integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
"dev": true,
"requires": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
+ "micromatch": "3.1.10",
+ "normalize-path": "2.1.1"
},
"dependencies": {
"normalize-path": {
@@ -9903,7 +9413,7 @@
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
"dev": true,
"requires": {
- "remove-trailing-separator": "^1.0.1"
+ "remove-trailing-separator": "1.1.0"
}
}
}
@@ -9920,16 +9430,16 @@
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
"dev": true,
"requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.4",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
},
"dependencies": {
"extend-shallow": {
@@ -9938,7 +9448,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -9949,18 +9459,18 @@
"integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
"dev": true,
"requires": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "fsevents": "^1.2.7",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
+ "anymatch": "2.0.0",
+ "async-each": "1.0.3",
+ "braces": "2.3.2",
+ "fsevents": "1.2.13",
+ "glob-parent": "3.1.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "4.0.1",
+ "normalize-path": "3.0.0",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.2.1",
+ "upath": "1.2.0"
}
},
"fill-range": {
@@ -9969,10 +9479,10 @@
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
"dev": true,
"requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
},
"dependencies": {
"extend-shallow": {
@@ -9981,7 +9491,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -9993,8 +9503,8 @@
"dev": true,
"optional": true,
"requires": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1"
+ "bindings": "1.5.0",
+ "nan": "2.14.2"
}
},
"glob-parent": {
@@ -10003,8 +9513,8 @@
"integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
"dev": true,
"requires": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
},
"dependencies": {
"is-glob": {
@@ -10013,7 +9523,7 @@
"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
"dev": true,
"requires": {
- "is-extglob": "^2.1.0"
+ "is-extglob": "2.1.1"
}
}
}
@@ -10024,22 +9534,16 @@
"integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
"dev": true,
"requires": {
- "binary-extensions": "^1.0.0"
+ "binary-extensions": "1.13.1"
}
},
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "kind-of": "3.2.2"
},
"dependencies": {
"kind-of": {
@@ -10048,7 +9552,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
@@ -10059,19 +9563,19 @@
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
"dev": true,
"requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.3",
+ "nanomatch": "1.2.13",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
}
},
"readable-stream": {
@@ -10080,13 +9584,13 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
}
},
"readdirp": {
@@ -10095,9 +9599,18 @@
"integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
+ "graceful-fs": "4.2.6",
+ "micromatch": "3.1.10",
+ "readable-stream": "2.3.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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
},
"to-regex-range": {
@@ -10106,8 +9619,8 @@
"integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
"dev": true,
"requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
}
}
}
@@ -10118,9 +9631,9 @@
"integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
"dev": true,
"requires": {
- "global-prefix": "^1.0.1",
- "is-windows": "^1.0.1",
- "resolve-dir": "^1.0.0"
+ "global-prefix": "1.0.2",
+ "is-windows": "1.0.2",
+ "resolve-dir": "1.0.1"
}
},
"global-prefix": {
@@ -10129,11 +9642,22 @@
"integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
"dev": true,
"requires": {
- "expand-tilde": "^2.0.2",
- "homedir-polyfill": "^1.0.1",
- "ini": "^1.3.4",
- "is-windows": "^1.0.1",
- "which": "^1.2.14"
+ "expand-tilde": "2.0.2",
+ "homedir-polyfill": "1.0.3",
+ "ini": "1.3.8",
+ "is-windows": "1.0.2",
+ "which": "1.3.1"
+ },
+ "dependencies": {
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ }
}
},
"globals": {
@@ -10154,9 +9678,9 @@
"integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==",
"dev": true,
"requires": {
- "glob": "~7.1.1",
- "lodash": "~4.17.10",
- "minimatch": "~3.0.2"
+ "glob": "7.1.7",
+ "lodash": "4.17.21",
+ "minimatch": "3.0.4"
}
},
"glogg": {
@@ -10165,32 +9689,32 @@
"integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
"dev": true,
"requires": {
- "sparkles": "^1.0.0"
+ "sparkles": "1.0.1"
}
},
"got": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/got/-/got-11.5.1.tgz",
- "integrity": "sha512-reQEZcEBMTGnujmQ+Wm97mJs/OK6INtO6HmLI+xt3+9CvnRwWjXutUvb2mqr+Ao4Lu05Rx6+udx9sOQAmExMxA==",
+ "version": "11.8.2",
+ "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz",
+ "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==",
"dev": true,
"requires": {
- "@sindresorhus/is": "^3.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.1",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.0",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
+ "@sindresorhus/is": "4.0.1",
+ "@szmarczak/http-timer": "4.0.5",
+ "@types/cacheable-request": "6.0.1",
+ "@types/responselike": "1.0.0",
+ "cacheable-lookup": "5.0.4",
+ "cacheable-request": "7.0.2",
+ "decompress-response": "6.0.0",
+ "http2-wrapper": "1.0.3",
+ "lowercase-keys": "2.0.0",
+ "p-cancelable": "2.1.1",
+ "responselike": "2.0.0"
}
},
"graceful-fs": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
- "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
+ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
"dev": true
},
"grapheme-splitter": {
@@ -10205,22 +9729,16 @@
"integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
"dev": true
},
- "growly": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
- "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
- "dev": true
- },
"gulp": {
"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.3",
- "gulp-cli": "^2.2.0",
- "undertaker": "^1.2.1",
- "vinyl-fs": "^3.0.0"
+ "glob-watcher": "5.0.5",
+ "gulp-cli": "2.3.0",
+ "undertaker": "1.3.0",
+ "vinyl-fs": "3.0.3"
},
"dependencies": {
"ansi-colors": {
@@ -10229,7 +9747,7 @@
"integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
"dev": true,
"requires": {
- "ansi-wrap": "^0.1.0"
+ "ansi-wrap": "0.1.0"
}
},
"ansi-regex": {
@@ -10238,23 +9756,23 @@
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
},
- "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"
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
}
},
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
"get-caller-file": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
@@ -10267,24 +9785,24 @@
"integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==",
"dev": true,
"requires": {
- "ansi-colors": "^1.0.1",
- "archy": "^1.0.0",
- "array-sort": "^1.0.0",
- "color-support": "^1.1.3",
- "concat-stream": "^1.6.0",
- "copy-props": "^2.0.1",
- "fancy-log": "^1.3.2",
- "gulplog": "^1.0.0",
- "interpret": "^1.4.0",
- "isobject": "^3.0.1",
- "liftoff": "^3.1.0",
- "matchdep": "^2.0.0",
- "mute-stdout": "^1.0.0",
- "pretty-hrtime": "^1.0.0",
- "replace-homedir": "^1.0.0",
- "semver-greatest-satisfied-range": "^1.1.0",
- "v8flags": "^3.2.0",
- "yargs": "^7.1.0"
+ "ansi-colors": "1.1.0",
+ "archy": "1.0.0",
+ "array-sort": "1.0.0",
+ "color-support": "1.1.3",
+ "concat-stream": "1.6.2",
+ "copy-props": "2.0.5",
+ "fancy-log": "1.3.3",
+ "gulplog": "1.0.0",
+ "interpret": "1.4.0",
+ "isobject": "3.0.1",
+ "liftoff": "3.1.0",
+ "matchdep": "2.0.0",
+ "mute-stdout": "1.0.1",
+ "pretty-hrtime": "1.0.3",
+ "replace-homedir": "1.0.0",
+ "semver-greatest-satisfied-range": "1.1.0",
+ "v8flags": "3.2.0",
+ "yargs": "7.1.2"
}
},
"is-fullwidth-code-point": {
@@ -10293,16 +9811,7 @@
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
- "dev": true,
- "requires": {
- "lcid": "^1.0.0"
+ "number-is-nan": "1.0.1"
}
},
"require-main-filename": {
@@ -10317,9 +9826,9 @@
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
}
},
"strip-ansi": {
@@ -10328,7 +9837,7 @@
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
- "ansi-regex": "^2.0.0"
+ "ansi-regex": "2.1.1"
}
},
"which-module": {
@@ -10343,45 +9852,45 @@
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"dev": true,
"requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
}
},
"y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+ "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==",
"dev": true
},
"yargs": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz",
- "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==",
- "dev": true,
- "requires": {
- "camelcase": "^3.0.0",
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "os-locale": "^1.4.0",
- "read-pkg-up": "^1.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^1.0.2",
- "which-module": "^1.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "5.0.0-security.0"
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz",
+ "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==",
+ "dev": true,
+ "requires": {
+ "camelcase": "3.0.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.3",
+ "os-locale": "1.4.0",
+ "read-pkg-up": "1.0.1",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "1.0.2",
+ "which-module": "1.0.0",
+ "y18n": "3.2.2",
+ "yargs-parser": "5.0.1"
}
},
"yargs-parser": {
- "version": "5.0.0-security.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz",
- "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz",
+ "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==",
"dev": true,
"requires": {
- "camelcase": "^3.0.0",
- "object.assign": "^4.1.0"
+ "camelcase": "3.0.0",
+ "object.assign": "4.1.2"
}
}
}
@@ -10392,9 +9901,9 @@
"integrity": "sha1-o0fUc6zqQBgvk1WHpFGUFnGSgQI=",
"dev": true,
"requires": {
- "gulp-util": "^2.2.14",
- "rimraf": "^2.2.8",
- "through2": "^0.4.2"
+ "gulp-util": "2.2.20",
+ "rimraf": "2.5.4",
+ "through2": "0.4.2"
},
"dependencies": {
"ansi-regex": {
@@ -10409,17 +9918,33 @@
"integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=",
"dev": true
},
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
"chalk": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
"integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
"dev": true,
"requires": {
- "ansi-styles": "^1.1.0",
- "escape-string-regexp": "^1.0.0",
- "has-ansi": "^0.1.0",
- "strip-ansi": "^0.3.0",
- "supports-color": "^0.2.0"
+ "ansi-styles": "1.1.0",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "0.1.0",
+ "strip-ansi": "0.3.0",
+ "supports-color": "0.2.0"
}
},
"clone-stats": {
@@ -10428,20 +9953,36 @@
"integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
"dev": true
},
+ "dateformat": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
+ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1",
+ "meow": "3.7.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
"gulp-util": {
"version": "2.2.20",
"resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz",
"integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=",
"dev": true,
"requires": {
- "chalk": "^0.5.0",
- "dateformat": "^1.0.7-1.2.3",
- "lodash._reinterpolate": "^2.4.1",
- "lodash.template": "^2.4.1",
- "minimist": "^0.2.0",
- "multipipe": "^0.1.0",
- "through2": "^0.5.0",
- "vinyl": "^0.2.1"
+ "chalk": "0.5.1",
+ "dateformat": "1.0.12",
+ "lodash._reinterpolate": "2.4.1",
+ "lodash.template": "2.4.1",
+ "minimist": "0.2.1",
+ "multipipe": "0.1.2",
+ "through2": "0.5.1",
+ "vinyl": "0.2.3"
},
"dependencies": {
"through2": {
@@ -10450,8 +9991,8 @@
"integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=",
"dev": true,
"requires": {
- "readable-stream": "~1.0.17",
- "xtend": "~3.0.0"
+ "readable-stream": "1.0.34",
+ "xtend": "3.0.0"
}
}
}
@@ -10462,7 +10003,16 @@
"integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
"dev": true,
"requires": {
- "ansi-regex": "^0.2.0"
+ "ansi-regex": "0.2.1"
+ }
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
}
},
"isarray": {
@@ -10471,6 +10021,32 @@
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
"dev": true
},
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.5",
+ "normalize-package-data": "2.5.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ }
+ }
+ },
"minimist": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.1.tgz",
@@ -10489,10 +10065,20 @@
"integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
"isarray": "0.0.1",
- "string_decoder": "~0.10.x"
+ "string_decoder": "0.10.31"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
}
},
"string_decoder": {
@@ -10507,7 +10093,16 @@
"integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
"dev": true,
"requires": {
- "ansi-regex": "^0.2.1"
+ "ansi-regex": "0.2.1"
+ }
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
}
},
"supports-color": {
@@ -10522,8 +10117,8 @@
"integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=",
"dev": true,
"requires": {
- "readable-stream": "~1.0.17",
- "xtend": "~2.1.1"
+ "readable-stream": "1.0.34",
+ "xtend": "2.1.2"
},
"dependencies": {
"xtend": {
@@ -10532,18 +10127,24 @@
"integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
"dev": true,
"requires": {
- "object-keys": "~0.4.0"
+ "object-keys": "0.4.0"
}
}
}
},
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
"vinyl": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz",
"integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=",
"dev": true,
"requires": {
- "clone-stats": "~0.0.1"
+ "clone-stats": "0.0.1"
}
},
"xtend": {
@@ -10560,44 +10161,80 @@
"integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
"dev": true,
"requires": {
- "concat-with-sourcemaps": "^1.0.0",
- "through2": "^2.0.0",
- "vinyl": "^2.0.0"
- }
- },
- "gulp-connect": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/gulp-connect/-/gulp-connect-5.7.0.tgz",
- "integrity": "sha512-8tRcC6wgXMLakpPw9M7GRJIhxkYdgZsXwn7n56BA2bQYGLR9NOPhMzx7js+qYDy6vhNkbApGKURjAw1FjY4pNA==",
- "dev": true,
- "requires": {
- "ansi-colors": "^2.0.5",
- "connect": "^3.6.6",
- "connect-livereload": "^0.6.0",
- "fancy-log": "^1.3.2",
- "map-stream": "^0.0.7",
- "send": "^0.16.2",
- "serve-index": "^1.9.1",
- "serve-static": "^1.13.2",
- "tiny-lr": "^1.1.1"
+ "concat-with-sourcemaps": "1.1.0",
+ "through2": "2.0.5",
+ "vinyl": "2.2.1"
},
"dependencies": {
- "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==",
- "dev": true
- },
- "http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "depd": "~1.1.2",
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
+ }
+ }
+ }
+ },
+ "gulp-connect": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/gulp-connect/-/gulp-connect-5.7.0.tgz",
+ "integrity": "sha512-8tRcC6wgXMLakpPw9M7GRJIhxkYdgZsXwn7n56BA2bQYGLR9NOPhMzx7js+qYDy6vhNkbApGKURjAw1FjY4pNA==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "2.0.5",
+ "connect": "3.7.0",
+ "connect-livereload": "0.6.1",
+ "fancy-log": "1.3.3",
+ "map-stream": "0.0.7",
+ "send": "0.16.2",
+ "serve-index": "1.9.1",
+ "serve-static": "1.14.1",
+ "tiny-lr": "1.1.1"
+ },
+ "dependencies": {
+ "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==",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
+ "statuses": "1.4.0"
}
},
"map-stream": {
@@ -10619,18 +10256,18 @@
"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",
+ "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.6.2",
+ "http-errors": "1.6.3",
"mime": "1.4.1",
"ms": "2.0.0",
- "on-finished": "~2.3.0",
- "range-parser": "~1.2.0",
- "statuses": "~1.4.0"
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.1",
+ "statuses": "1.4.0"
}
},
"setprototypeof": {
@@ -10653,344 +10290,462 @@
"integrity": "sha512-fcFUQzFsN6dJ6KZlG+qPOEkqfcevRUXgztkYCvhNvJeSvOicC8ucutN4qR/ID8LmNZx9YPIkBzazTNnVvbh8wg==",
"dev": true,
"requires": {
- "eslint": "^4.0.0",
- "fancy-log": "^1.3.2",
- "plugin-error": "^1.0.0"
- }
- },
- "gulp-footer": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/gulp-footer/-/gulp-footer-2.0.2.tgz",
- "integrity": "sha512-HsG5VOgKHFRqZXnHGI6oGhPDg70p9pobM+dYOnjBZVLMQUHzLG6bfaPNRJ7XG707E+vWO3TfN0CND9UrYhk94g==",
- "dev": true,
- "requires": {
- "lodash._reescape": "^3.0.0",
- "lodash._reevaluate": "^3.0.0",
- "lodash._reinterpolate": "^3.0.0",
- "lodash.template": "^3.6.2",
- "map-stream": "0.0.7"
+ "eslint": "4.19.1",
+ "fancy-log": "1.3.3",
+ "plugin-error": "1.0.1"
},
"dependencies": {
- "lodash._reinterpolate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
- "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+ "acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+ "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
"dev": true
},
- "lodash.escape": {
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ }
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true
+ },
+ "ansi-escapes": {
"version": "3.2.0",
- "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
- "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+ "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
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
- "lodash._root": "^3.0.0"
+ "sprintf-js": "1.0.3"
}
},
- "lodash.keys": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
- "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
"dev": true,
"requires": {
- "lodash._getnative": "^3.0.0",
- "lodash.isarguments": "^3.0.0",
- "lodash.isarray": "^3.0.0"
+ "restore-cursor": "2.0.0"
}
},
- "lodash.template": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
- "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+ "cli-width": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
+ "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
+ "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": {
- "lodash._basecopy": "^3.0.0",
- "lodash._basetostring": "^3.0.0",
- "lodash._basevalues": "^3.0.0",
- "lodash._isiterateecall": "^3.0.0",
- "lodash._reinterpolate": "^3.0.0",
- "lodash.escape": "^3.0.0",
- "lodash.keys": "^3.0.0",
- "lodash.restparam": "^3.0.0",
- "lodash.templatesettings": "^3.0.0"
+ "lru-cache": "4.1.5",
+ "shebang-command": "1.2.0",
+ "which": "1.3.1"
}
},
- "lodash.templatesettings": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
- "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
- "lodash._reinterpolate": "^3.0.0",
- "lodash.escape": "^3.0.0"
+ "ms": "2.1.3"
}
},
- "map-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
- "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=",
- "dev": true
- }
- }
- },
- "gulp-header": {
- "version": "1.8.12",
- "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz",
- "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==",
- "dev": true,
- "requires": {
- "concat-with-sourcemaps": "*",
- "lodash.template": "^4.4.0",
- "through2": "^2.0.0"
- },
- "dependencies": {
- "lodash._reinterpolate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
- "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.3"
+ }
+ },
+ "eslint": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
+ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.4.2",
+ "concat-stream": "1.6.2",
+ "cross-spawn": "5.1.0",
+ "debug": "3.2.7",
+ "doctrine": "2.1.0",
+ "eslint-scope": "3.7.3",
+ "eslint-visitor-keys": "1.3.0",
+ "espree": "3.5.4",
+ "esquery": "1.4.0",
+ "esutils": "2.0.3",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.7",
+ "globals": "11.12.0",
+ "ignore": "3.3.10",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.3.0",
+ "is-resolvable": "1.1.0",
+ "js-yaml": "3.14.1",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.21",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.5",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.3",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.3",
+ "regexpp": "1.1.0",
+ "require-uncached": "1.0.3",
+ "semver": "5.7.1",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ }
+ },
+ "eslint-scope": {
+ "version": "3.7.3",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz",
+ "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "4.3.0",
+ "estraverse": "4.3.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
"dev": true
},
- "lodash.template": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
- "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+ "espree": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
"dev": true,
"requires": {
- "lodash._reinterpolate": "^3.0.0",
- "lodash.templatesettings": "^4.0.0"
+ "acorn": "5.7.4",
+ "acorn-jsx": "3.0.1"
}
},
- "lodash.templatesettings": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
- "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+ "external-editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
"dev": true,
"requires": {
- "lodash._reinterpolate": "^3.0.0"
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.24",
+ "tmp": "0.0.33"
}
- }
- }
- },
- "gulp-if": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
- "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
- "dev": true,
- "requires": {
- "gulp-match": "^1.0.3",
- "ternary-stream": "^2.0.1",
- "through2": "^2.0.1"
- }
- },
- "gulp-js-escape": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gulp-js-escape/-/gulp-js-escape-1.0.1.tgz",
- "integrity": "sha1-HNRF+9AJ4Np2lZoDp/SbNWav+Gg=",
- "dev": true,
- "requires": {
- "through2": "^0.6.3"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "1.3.4",
+ "object-assign": "4.1.1"
+ }
+ },
+ "flat-cache": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
+ "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==",
+ "dev": true,
+ "requires": {
+ "circular-json": "0.3.3",
+ "graceful-fs": "4.2.6",
+ "rimraf": "2.6.3",
+ "write": "0.2.1"
+ }
+ },
+ "ignore": {
+ "version": "3.3.10",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
"dev": true
},
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
+ "ansi-escapes": "3.2.0",
+ "chalk": "2.4.2",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.1",
+ "external-editor": "2.2.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.21",
+ "mute-stream": "0.0.7",
+ "run-async": "2.4.1",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
}
},
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "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
},
- "through2": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
- "readable-stream": ">=1.0.33-1 <1.1.0-0",
- "xtend": ">=4.0.0 <4.1.0-0"
+ "argparse": "1.0.10",
+ "esprima": "4.0.1"
}
- }
- }
- },
- "gulp-match": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.1.0.tgz",
- "integrity": "sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==",
- "dev": true,
- "requires": {
- "minimatch": "^3.0.3"
- }
- },
- "gulp-replace": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.0.0.tgz",
- "integrity": "sha512-lgdmrFSI1SdhNMXZQbrC75MOl1UjYWlOWNbNRnz+F/KHmgxt3l6XstBoAYIdadwETFyG/6i+vWUSCawdC3pqOw==",
- "dev": true,
- "requires": {
- "istextorbinary": "2.2.1",
- "readable-stream": "^2.0.1",
- "replacestream": "^4.0.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
}
- }
- }
- },
- "gulp-shell": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.5.2.tgz",
- "integrity": "sha1-pJWcoGUa0ce7/nCy0K27tOGuqY0=",
- "dev": true,
- "requires": {
- "async": "^1.5.0",
- "gulp-util": "^3.0.7",
- "lodash": "^4.0.0",
- "through2": "^2.0.0"
- },
- "dependencies": {
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
- "dev": true
- }
- }
- },
- "gulp-sourcemaps": {
- "version": "2.6.5",
- "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz",
- "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==",
- "dev": true,
- "requires": {
- "@gulp-sourcemaps/identity-map": "1.X",
- "@gulp-sourcemaps/map-sources": "1.X",
- "acorn": "5.X",
- "convert-source-map": "1.X",
- "css": "2.X",
- "debug-fabulous": "1.X",
- "detect-newline": "2.X",
- "graceful-fs": "4.X",
- "source-map": "~0.6.0",
- "strip-bom-string": "1.X",
- "through2": "2.X"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ },
+ "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
- }
- }
- },
- "gulp-uglify": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.2.tgz",
- "integrity": "sha512-gk1dhB74AkV2kzqPMQBLA3jPoIAPd/nlNzP2XMDSG8XZrqnlCiDGAqC+rZOumzFvB5zOphlFh6yr3lgcAb/OOg==",
- "dev": true,
- "requires": {
- "array-each": "^1.0.1",
- "extend-shallow": "^3.0.2",
- "gulplog": "^1.0.0",
- "has-gulplog": "^0.1.0",
- "isobject": "^3.0.1",
- "make-error-cause": "^1.1.1",
- "safe-buffer": "^5.1.2",
- "through2": "^2.0.0",
- "uglify-js": "^3.0.5",
- "vinyl-sourcemaps-apply": "^0.2.0"
- }
- },
- "gulp-util": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
- "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
- "dev": true,
- "requires": {
- "array-differ": "^1.0.0",
- "array-uniq": "^1.0.2",
- "beeper": "^1.0.0",
- "chalk": "^1.0.0",
- "dateformat": "^2.0.0",
- "fancy-log": "^1.1.0",
- "gulplog": "^1.0.0",
- "has-gulplog": "^0.1.0",
- "lodash._reescape": "^3.0.0",
- "lodash._reevaluate": "^3.0.0",
- "lodash._reinterpolate": "^3.0.0",
- "lodash.template": "^3.0.0",
- "minimist": "^1.1.0",
- "multipipe": "^0.1.2",
- "object-assign": "^3.0.0",
- "replace-ext": "0.0.1",
- "through2": "^2.0.0",
- "vinyl": "^0.5.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ },
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dev": true,
+ "requires": {
+ "minimist": "1.2.5"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
"dev": true
},
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
"dev": true,
"requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
+ "mimic-fn": "1.2.0"
}
},
- "clone-stats": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
- "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "word-wrap": "1.2.3"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
"dev": true
},
- "dateformat": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
- "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
+ "regexpp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
+ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.3"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.7"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "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"
+ }
+ },
+ "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=",
"dev": true
},
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.4.2",
+ "lodash": "4.17.21",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ }
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ }
+ }
+ },
+ "gulp-footer": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-footer/-/gulp-footer-2.0.2.tgz",
+ "integrity": "sha512-HsG5VOgKHFRqZXnHGI6oGhPDg70p9pobM+dYOnjBZVLMQUHzLG6bfaPNRJ7XG707E+vWO3TfN0CND9UrYhk94g==",
+ "dev": true,
+ "requires": {
+ "lodash._reescape": "3.0.0",
+ "lodash._reevaluate": "3.0.0",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.template": "3.6.2",
+ "map-stream": "0.0.7"
+ },
+ "dependencies": {
"lodash._reinterpolate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
@@ -11003,7 +10758,7 @@
"integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
"dev": true,
"requires": {
- "lodash._root": "^3.0.0"
+ "lodash._root": "3.0.1"
}
},
"lodash.keys": {
@@ -11012,9 +10767,9 @@
"integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
"dev": true,
"requires": {
- "lodash._getnative": "^3.0.0",
- "lodash.isarguments": "^3.0.0",
- "lodash.isarray": "^3.0.0"
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
}
},
"lodash.template": {
@@ -11023,15 +10778,15 @@
"integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
"dev": true,
"requires": {
- "lodash._basecopy": "^3.0.0",
- "lodash._basetostring": "^3.0.0",
- "lodash._basevalues": "^3.0.0",
- "lodash._isiterateecall": "^3.0.0",
- "lodash._reinterpolate": "^3.0.0",
- "lodash.escape": "^3.0.0",
- "lodash.keys": "^3.0.0",
- "lodash.restparam": "^3.0.0",
- "lodash.templatesettings": "^3.0.0"
+ "lodash._basecopy": "3.0.1",
+ "lodash._basetostring": "3.0.1",
+ "lodash._basevalues": "3.0.0",
+ "lodash._isiterateecall": "3.0.9",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0",
+ "lodash.keys": "3.1.2",
+ "lodash.restparam": "3.6.1",
+ "lodash.templatesettings": "3.1.1"
}
},
"lodash.templatesettings": {
@@ -11040,451 +10795,930 @@
"integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
"dev": true,
"requires": {
- "lodash._reinterpolate": "^3.0.0",
- "lodash.escape": "^3.0.0"
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0"
}
},
- "object-assign": {
+ "map-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
+ "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=",
+ "dev": true
+ }
+ }
+ },
+ "gulp-header": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-2.0.9.tgz",
+ "integrity": "sha512-LMGiBx+qH8giwrOuuZXSGvswcIUh0OiioNkUpLhNyvaC6/Ga8X6cfAeme2L5PqsbXMhL8o8b/OmVqIQdxprhcQ==",
+ "dev": true,
+ "requires": {
+ "concat-with-sourcemaps": "1.1.0",
+ "lodash.template": "4.5.0",
+ "map-stream": "0.0.7",
+ "through2": "2.0.5"
+ },
+ "dependencies": {
+ "lodash._reinterpolate": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
- "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
"dev": true
},
- "replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
- "dev": true
+ "lodash.template": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+ "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.2.0"
+ }
},
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "lodash.templatesettings": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+ "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
"dev": true,
"requires": {
- "ansi-regex": "^2.0.0"
+ "lodash._reinterpolate": "3.0.0"
}
},
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "map-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
+ "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=",
"dev": true
},
- "vinyl": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
- "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "clone": "^1.0.0",
- "clone-stats": "^0.0.1",
- "replace-ext": "0.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
}
}
}
},
- "gulplog": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
- "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
- "dev": true,
- "requires": {
- "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==",
+ "gulp-if": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-3.0.0.tgz",
+ "integrity": "sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw==",
"dev": true,
"requires": {
- "duplexer": "^0.1.1",
- "pify": "^4.0.1"
+ "gulp-match": "1.1.0",
+ "ternary-stream": "3.0.0",
+ "through2": "3.0.2"
},
"dependencies": {
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
+ },
+ "through2": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
+ "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.4",
+ "readable-stream": "3.6.0"
+ }
}
}
},
- "handlebars": {
- "version": "4.7.7",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
- "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
+ "gulp-js-escape": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gulp-js-escape/-/gulp-js-escape-1.0.1.tgz",
+ "integrity": "sha1-HNRF+9AJ4Np2lZoDp/SbNWav+Gg=",
"dev": true,
"requires": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.0",
- "source-map": "^0.6.1",
- "uglify-js": "^3.1.4",
- "wordwrap": "^1.0.0"
+ "through2": "0.6.5"
},
"dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
"dev": true
- }
- }
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "dev": true
- },
- "har-validator": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
- "dev": true,
- "requires": {
- "ajv": "^6.5.5",
- "har-schema": "^2.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "6.12.3",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
- "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
"dev": true,
"requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.2"
}
}
}
},
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "gulp-match": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.1.0.tgz",
+ "integrity": "sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==",
"dev": true,
"requires": {
- "function-bind": "^1.1.1"
+ "minimatch": "3.0.4"
}
},
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "gulp-replace": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.1.3.tgz",
+ "integrity": "sha512-HcPHpWY4XdF8zxYkDODHnG2+7a3nD/Y8Mfu3aBgMiCFDW3X2GiOKXllsAmILcxe3KZT2BXoN18WrpEFm48KfLQ==",
"dev": true,
"requires": {
- "ansi-regex": "^2.0.0"
+ "@types/node": "14.17.4",
+ "@types/vinyl": "2.0.4",
+ "istextorbinary": "3.3.0",
+ "replacestream": "4.0.3",
+ "yargs-parser": "20.2.9"
},
"dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "@types/node": {
+ "version": "14.17.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.4.tgz",
+ "integrity": "sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A==",
"dev": true
}
}
},
- "has-binary2": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
- "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
+ "gulp-shell": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.8.0.tgz",
+ "integrity": "sha512-wHNCgmqbWkk1c6Gc2dOL5SprcoeujQdeepICwfQRo91DIylTE7a794VEE+leq3cE2YDoiS5ulvRfKVIEMazcTQ==",
"dev": true,
"requires": {
- "isarray": "2.0.1"
+ "chalk": "3.0.0",
+ "fancy-log": "1.3.3",
+ "lodash.template": "4.5.0",
+ "plugin-error": "1.0.1",
+ "through2": "3.0.2",
+ "tslib": "1.14.1"
},
"dependencies": {
- "isarray": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
+ }
+ },
+ "color-convert": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
- }
- }
- },
- "has-cors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
- "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "has-gulplog": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
- "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
- "dev": true,
- "requires": {
- "sparkles": "^1.0.0"
- }
- },
- "has-symbol-support-x": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
- "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==",
- "dev": true
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
- "dev": true
- },
- "has-to-string-tag-x": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
- "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
- "dev": true,
- "requires": {
- "has-symbol-support-x": "^1.4.1"
- }
- },
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "is-number": {
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "lodash._reinterpolate": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+ "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.2.0"
}
},
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "lodash.templatesettings": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+ "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "4.0.0"
+ }
+ },
+ "through2": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
+ "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "inherits": "2.0.4",
+ "readable-stream": "3.6.0"
}
}
}
},
- "hash-base": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
- "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "gulp-sourcemaps": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-3.0.0.tgz",
+ "integrity": "sha512-RqvUckJkuYqy4VaIH60RMal4ZtG0IbQ6PXMNkNsshEGJ9cldUPRb/YCgboYae+CLAs1HQNb4ADTKCx65HInquQ==",
"dev": true,
"requires": {
- "inherits": "^2.0.4",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
+ "@gulp-sourcemaps/identity-map": "2.0.1",
+ "@gulp-sourcemaps/map-sources": "1.0.0",
+ "acorn": "6.4.2",
+ "convert-source-map": "1.8.0",
+ "css": "3.0.0",
+ "debug-fabulous": "1.1.0",
+ "detect-newline": "2.1.0",
+ "graceful-fs": "4.2.6",
+ "source-map": "0.6.1",
+ "strip-bom-string": "1.0.0",
+ "through2": "2.0.5"
},
"dependencies": {
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "acorn": {
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
"dev": true
},
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "detect-newline": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+ "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
+ }
}
}
},
- "hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "gulp-terser": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/gulp-terser/-/gulp-terser-2.0.1.tgz",
+ "integrity": "sha512-XCrnCXP8ovNpgLK9McJIXlgm0j3W2TsiWu7K9y3m+Sn5XZgUzi6U8MPHtS3NdLMic9poCj695N0ARJ2B6atypw==",
"dev": true,
"requires": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
+ "plugin-error": "1.0.1",
+ "terser": "5.4.0",
+ "through2": "4.0.2",
+ "vinyl-sourcemaps-apply": "0.2.1"
}
},
- "hast-util-is-element": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.0.4.tgz",
- "integrity": "sha512-NFR6ljJRvDcyPP5SbV7MyPBgF47X3BsskLnmw1U34yL+X6YC0MoBx9EyMg8Jtx4FzGH95jw8+c1VPLHaRA0wDQ==",
- "dev": true
- },
- "hast-util-sanitize": {
- "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==",
+ "gulp-util": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
+ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
"dev": true,
"requires": {
- "xtend": "^4.0.1"
- }
- },
- "hast-util-to-html": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-3.1.0.tgz",
- "integrity": "sha1-iCyZhJ5AEw6ZHAQuRW1FPZXDbP8=",
- "dev": true,
- "requires": {
- "ccount": "^1.0.0",
- "comma-separated-tokens": "^1.0.1",
- "hast-util-is-element": "^1.0.0",
- "hast-util-whitespace": "^1.0.0",
- "html-void-elements": "^1.0.0",
- "kebab-case": "^1.0.0",
- "property-information": "^3.1.0",
- "space-separated-tokens": "^1.0.0",
- "stringify-entities": "^1.0.1",
- "unist-util-is": "^2.0.0",
- "xtend": "^4.0.1"
+ "array-differ": "1.0.0",
+ "array-uniq": "1.0.3",
+ "beeper": "1.1.1",
+ "chalk": "1.1.3",
+ "dateformat": "2.2.0",
+ "fancy-log": "1.3.3",
+ "gulplog": "1.0.0",
+ "has-gulplog": "0.1.0",
+ "lodash._reescape": "3.0.0",
+ "lodash._reevaluate": "3.0.0",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.template": "3.6.2",
+ "minimist": "1.2.5",
+ "multipipe": "0.1.2",
+ "object-assign": "3.0.0",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.5",
+ "vinyl": "0.5.3"
},
"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==",
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "dateformat": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
+ "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
+ "dev": true
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+ "dev": true
+ },
+ "lodash.escape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
+ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+ "dev": true,
+ "requires": {
+ "lodash._root": "3.0.1"
+ }
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "dev": true,
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "lodash.template": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
+ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash._basetostring": "3.0.1",
+ "lodash._basevalues": "3.0.0",
+ "lodash._isiterateecall": "3.0.9",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0",
+ "lodash.keys": "3.1.2",
+ "lodash.restparam": "3.6.1",
+ "lodash.templatesettings": "3.1.1"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
+ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0"
+ }
+ },
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
"dev": true
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
+ }
+ },
+ "vinyl": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
}
}
},
- "hast-util-whitespace": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz",
- "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==",
- "dev": true
- },
- "he": {
- "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.18.1",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz",
- "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==",
- "dev": true
- },
- "hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
"dev": true,
"requires": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
+ "glogg": "1.0.2"
}
},
- "home-or-tmp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
- "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "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": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.1"
+ "duplexer": "0.1.2",
+ "pify": "4.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true
+ }
}
},
- "homedir-polyfill": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
- "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "handlebars": {
+ "version": "4.7.7",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
+ "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
"dev": true,
"requires": {
- "parse-passwd": "^1.0.0"
+ "minimist": "1.2.5",
+ "neo-async": "2.6.2",
+ "source-map": "0.6.1",
+ "uglify-js": "3.13.9",
+ "wordwrap": "1.0.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
}
},
- "hoopy": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
- "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
"dev": true
},
- "hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "dev": true,
+ "requires": {
+ "ajv": "6.12.6",
+ "har-schema": "2.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "3.1.3",
+ "fast-json-stable-stringify": "2.1.0",
+ "json-schema-traverse": "0.4.1",
+ "uri-js": "4.4.1"
+ }
+ }
+ }
+ },
+ "hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
"dev": true
},
- "html-encoding-sniffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
- "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": {
- "whatwg-encoding": "^1.0.1"
+ "function-bind": "1.1.1"
}
},
- "html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
- "dev": true
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ }
+ }
},
- "html-void-elements": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz",
- "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==",
+ "has-bigints": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
+ "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
"dev": true
},
- "http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"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==",
+ "has-gulplog": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
+ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+ "dev": true,
"requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
+ "sparkles": "1.0.1"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.4",
+ "readable-stream": "3.6.0",
+ "safe-buffer": "5.2.1"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ }
+ }
+ },
+ "hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "dev": true,
+ "optional": true
+ },
+ "hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.1"
+ }
+ },
+ "hast-util-is-element": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz",
+ "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==",
+ "dev": true
+ },
+ "hast-util-sanitize": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-3.0.2.tgz",
+ "integrity": "sha512-+2I0x2ZCAyiZOO/sb4yNLFmdwPBnyJ4PBkVTUMKMqBwYNA+lXSgOmoRXlJFazoyid9QPogRRKgKhVEodv181sA==",
+ "dev": true,
+ "requires": {
+ "xtend": "4.0.2"
+ }
+ },
+ "hast-util-to-html": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-7.1.3.tgz",
+ "integrity": "sha512-yk2+1p3EJTEE9ZEUkgHsUSVhIpCsL/bvT8E5GzmWc+N1Po5gBw+0F8bo7dpxXR0nu0bQVxVZGX2lBGF21CmeDw==",
+ "dev": true,
+ "requires": {
+ "ccount": "1.1.0",
+ "comma-separated-tokens": "1.0.8",
+ "hast-util-is-element": "1.1.0",
+ "hast-util-whitespace": "1.0.4",
+ "html-void-elements": "1.0.5",
+ "property-information": "5.6.0",
+ "space-separated-tokens": "1.1.5",
+ "stringify-entities": "3.1.0",
+ "unist-util-is": "4.1.0",
+ "xtend": "4.0.2"
+ }
+ },
+ "hast-util-whitespace": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz",
+ "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==",
+ "dev": true
+ },
+ "he": {
+ "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": "10.7.3",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "dev": true
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "dev": true,
+ "requires": {
+ "hash.js": "1.1.7",
+ "minimalistic-assert": "1.0.1",
+ "minimalistic-crypto-utils": "1.0.1"
+ }
+ },
+ "homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "requires": {
+ "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.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "html-void-elements": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz",
+ "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==",
+ "dev": true
+ },
+ "http-cache-semantics": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+ "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==",
+ "requires": {
+ "depd": "1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": "1.5.0",
+ "toidentifier": "1.0.0"
}
},
"http-parser-js": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz",
- "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==",
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz",
+ "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==",
"dev": true
},
"http-proxy": {
@@ -11493,9 +11727,9 @@
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
"dev": true,
"requires": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
+ "eventemitter3": "4.0.7",
+ "follow-redirects": "1.14.1",
+ "requires-port": "1.0.0"
}
},
"http-signature": {
@@ -11504,19 +11738,19 @@
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"dev": true,
"requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
+ "assert-plus": "1.0.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.16.1"
}
},
"http2-wrapper": {
- "version": "1.0.0-beta.5.2",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz",
- "integrity": "sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
+ "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
"dev": true,
"requires": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.0.0"
+ "quick-lru": "5.1.1",
+ "resolve-alpn": "1.1.2"
}
},
"https-browserify": {
@@ -11531,17 +11765,17 @@
"integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==",
"dev": true,
"requires": {
- "agent-base": "5",
- "debug": "4"
+ "agent-base": "5.1.1",
+ "debug": "4.3.1"
},
"dependencies": {
"debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.2"
}
},
"ms": {
@@ -11557,73 +11791,49 @@
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
- "safer-buffer": ">= 2.1.2 < 3"
+ "safer-buffer": "2.1.2"
}
},
+ "icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
+ "dev": true,
+ "optional": true
+ },
+ "icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "dev": true
+ },
"ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true
},
"ignore": {
- "version": "3.3.10",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
- "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"dev": true
},
- "import-local": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
- "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
"requires": {
- "pkg-dir": "^3.0.0",
- "resolve-cwd": "^2.0.0"
+ "parent-module": "1.0.1",
+ "resolve-from": "4.0.0"
},
"dependencies": {
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true
- },
- "pkg-dir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
- "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
- "dev": true,
- "requires": {
- "find-up": "^3.0.0"
- }
}
}
},
@@ -11651,8 +11861,8 @@
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
- "once": "^1.3.0",
- "wrappy": "1"
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
}
},
"inherits": {
@@ -11661,50 +11871,50 @@
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
"inquirer": {
- "version": "7.3.3",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
- "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
- "dev": true,
- "requires": {
- "ansi-escapes": "^4.2.1",
- "chalk": "^4.1.0",
- "cli-cursor": "^3.1.0",
- "cli-width": "^3.0.0",
- "external-editor": "^3.0.3",
- "figures": "^3.0.0",
- "lodash": "^4.17.19",
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.1.tgz",
+ "integrity": "sha512-hUDjc3vBkh/uk1gPfMAD/7Z188Q8cvTGl0nxwaCdwSbzFh6ZKkZh+s2ozVxbE5G9ZNRyeY0+lgbAIOUFsFf98w==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "4.3.2",
+ "chalk": "4.1.1",
+ "cli-cursor": "3.1.0",
+ "cli-width": "3.0.0",
+ "external-editor": "3.1.0",
+ "figures": "3.2.0",
+ "lodash": "4.17.21",
"mute-stream": "0.0.8",
- "run-async": "^2.4.0",
- "rxjs": "^6.6.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0",
- "through": "^2.3.6"
+ "ora": "5.4.1",
+ "run-async": "2.4.1",
+ "rxjs": "6.6.7",
+ "string-width": "4.2.2",
+ "strip-ansi": "6.0.0",
+ "through": "2.3.8"
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
+ "color-convert": "2.0.1"
}
},
"chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
"color-convert": {
@@ -11713,7 +11923,7 @@
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "color-name": "~1.1.4"
+ "color-name": "1.1.4"
}
},
"color-name": {
@@ -11729,12 +11939,12 @@
"dev": true
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "has-flag": "4.0.0"
}
}
}
@@ -11745,25 +11955,6 @@
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
"dev": true
},
- "into-stream": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
- "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=",
- "dev": true,
- "requires": {
- "from2": "^2.1.1",
- "p-is-promise": "^1.1.0"
- }
- },
- "invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dev": true,
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
"invert-kv": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
@@ -11781,8 +11972,8 @@
"integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
"dev": true,
"requires": {
- "is-relative": "^1.0.0",
- "is-windows": "^1.0.1"
+ "is-relative": "1.0.0",
+ "is-windows": "1.0.2"
}
},
"is-accessor-descriptor": {
@@ -11791,22 +11982,16 @@
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "kind-of": "3.2.2"
},
"dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
@@ -11817,27 +12002,24 @@
"integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
"dev": true
},
- "is-alphanumeric": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
- "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
- "dev": true
- },
"is-alphanumerical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
"integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
"dev": true,
"requires": {
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0"
+ "is-alphabetical": "1.0.4",
+ "is-decimal": "1.0.4"
}
},
"is-arguments": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
- "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
- "dev": true
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
+ "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "1.0.2"
+ }
},
"is-arrayish": {
"version": "0.2.1",
@@ -11846,9 +12028,9 @@
"dev": true
},
"is-bigint": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz",
- "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz",
+ "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==",
"dev": true
},
"is-binary-path": {
@@ -11857,34 +12039,37 @@
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"requires": {
- "binary-extensions": "^2.0.0"
+ "binary-extensions": "2.2.0"
}
},
"is-boolean-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz",
- "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==",
- "dev": true
- },
- "is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz",
+ "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==",
+ "dev": true,
+ "requires": {
+ "call-bind": "1.0.2"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"dev": true
},
"is-callable": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
- "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
+ "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
"dev": true
},
- "is-ci": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
- "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+ "is-core-module": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
+ "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
"dev": true,
"requires": {
- "ci-info": "^2.0.0"
+ "has": "1.0.3"
}
},
"is-data-descriptor": {
@@ -11893,30 +12078,24 @@
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "kind-of": "3.2.2"
},
"dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
},
"is-date-object": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
- "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz",
+ "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==",
"dev": true
},
"is-decimal": {
@@ -11931,9 +12110,9 @@
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
},
"dependencies": {
"kind-of": {
@@ -11945,9 +12124,9 @@
}
},
"is-docker": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz",
- "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
"dev": true
},
"is-dotfile": {
@@ -11962,7 +12141,7 @@
"integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
"dev": true,
"requires": {
- "is-primitive": "^2.0.0"
+ "is-primitive": "2.0.0"
}
},
"is-extendable": {
@@ -11989,19 +12168,13 @@
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
- "is-generator-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
- "dev": true
- },
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"dev": true,
"requires": {
- "is-extglob": "^2.1.1"
+ "is-extglob": "2.1.1"
}
},
"is-hexadecimal": {
@@ -12010,10 +12183,16 @@
"integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
"dev": true
},
+ "is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true
+ },
"is-map": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz",
- "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
"dev": true
},
"is-negated-glob": {
@@ -12023,9 +12202,9 @@
"dev": true
},
"is-negative-zero": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
- "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
"dev": true
},
"is-number": {
@@ -12035,21 +12214,21 @@
"dev": true
},
"is-number-object": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
- "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz",
+ "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==",
"dev": true
},
- "is-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
- "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=",
+ "is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"dev": true
},
"is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
"dev": true
},
"is-plain-object": {
@@ -12058,7 +12237,7 @@
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
"dev": true,
"requires": {
- "isobject": "^3.0.1"
+ "isobject": "3.0.1"
}
},
"is-posix-bracket": {
@@ -12080,12 +12259,13 @@
"dev": true
},
"is-regex": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
- "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
+ "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
"dev": true,
"requires": {
- "has": "^1.0.3"
+ "call-bind": "1.0.2",
+ "has-symbols": "1.0.2"
}
},
"is-relative": {
@@ -12094,7 +12274,7 @@
"integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
"dev": true,
"requires": {
- "is-unc-path": "^1.0.0"
+ "is-unc-path": "1.0.0"
}
},
"is-resolvable": {
@@ -12103,12 +12283,6 @@
"integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
"dev": true
},
- "is-retry-allowed": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
- "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==",
- "dev": true
- },
"is-running": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-running/-/is-running-2.1.0.tgz",
@@ -12116,2773 +12290,338 @@
"dev": true
},
"is-set": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz",
- "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
"dev": true
},
"is-ssh": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz",
- "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz",
+ "integrity": "sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ==",
"dev": true,
"requires": {
- "protocols": "^1.1.0"
+ "protocols": "1.4.8"
}
},
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
- "dev": true
- },
- "is-string": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
- "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
- "dev": true
- },
- "is-symbol": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
- "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
- "dev": true,
- "requires": {
- "has-symbols": "^1.0.1"
- }
- },
- "is-typed-array": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz",
- "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==",
- "dev": true,
- "requires": {
- "available-typed-arrays": "^1.0.0",
- "es-abstract": "^1.17.4",
- "foreach": "^2.0.5",
- "has-symbols": "^1.0.1"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "is-unc-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
- "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
- "dev": true,
- "requires": {
- "unc-path-regex": "^0.1.2"
- }
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
- "dev": true
- },
- "is-valid-glob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
- "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
- "dev": true
- },
- "is-weakmap": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
- "dev": true
- },
- "is-weakset": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
- "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==",
- "dev": true
- },
- "is-whitespace-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
- "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
- "dev": true
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
- },
- "is-word-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
- "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
- "dev": true
- },
- "is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "requires": {
- "is-docker": "^2.0.0"
- },
- "dependencies": {
- "is-docker": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz",
- "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==",
- "dev": true
- }
- }
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "isbinaryfile": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
- "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
- "dev": true,
- "requires": {
- "buffer-alloc": "^1.2.0"
- }
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
- },
- "istanbul": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
- "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
- "dev": true,
- "requires": {
- "abbrev": "1.0.x",
- "async": "1.x",
- "escodegen": "1.8.x",
- "esprima": "2.7.x",
- "glob": "^5.0.15",
- "handlebars": "^4.0.1",
- "js-yaml": "3.x",
- "mkdirp": "0.5.x",
- "nopt": "3.x",
- "once": "1.x",
- "resolve": "1.1.x",
- "supports-color": "^3.1.0",
- "which": "^1.1.1",
- "wordwrap": "^1.0.0"
- },
- "dependencies": {
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
- "dev": true
- },
- "escodegen": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
- "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
- "dev": true,
- "requires": {
- "esprima": "^2.7.1",
- "estraverse": "^1.9.1",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1",
- "source-map": "~0.2.0"
- }
- },
- "esprima": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
- "dev": true
- },
- "estraverse": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
- "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
- "dev": true
- },
- "glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
- "dev": true,
- "requires": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
- "dev": true
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "resolve": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
- "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
- "dev": true
- },
- "source-map": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
- "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
- "dev": true,
- "optional": true,
- "requires": {
- "amdefine": ">=0.0.4"
- }
- },
- "supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
- "dev": true,
- "requires": {
- "has-flag": "^1.0.0"
- }
- }
- }
- },
- "istanbul-api": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz",
- "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==",
- "dev": true,
- "requires": {
- "async": "^2.1.4",
- "fileset": "^2.0.2",
- "istanbul-lib-coverage": "^1.2.1",
- "istanbul-lib-hook": "^1.2.2",
- "istanbul-lib-instrument": "^1.10.2",
- "istanbul-lib-report": "^1.1.5",
- "istanbul-lib-source-maps": "^1.2.6",
- "istanbul-reports": "^1.5.1",
- "js-yaml": "^3.7.0",
- "mkdirp": "^0.5.1",
- "once": "^1.4.0"
- },
- "dependencies": {
- "async": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
- "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.14"
- }
- },
- "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"
- }
- },
- "has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
- "dev": true
- },
- "istanbul-lib-coverage": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz",
- "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==",
- "dev": true
- },
- "istanbul-lib-instrument": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz",
- "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==",
- "dev": true,
- "requires": {
- "babel-generator": "^6.18.0",
- "babel-template": "^6.16.0",
- "babel-traverse": "^6.18.0",
- "babel-types": "^6.18.0",
- "babylon": "^6.18.0",
- "istanbul-lib-coverage": "^1.2.1",
- "semver": "^5.3.0"
- }
- },
- "istanbul-lib-report": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz",
- "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==",
- "dev": true,
- "requires": {
- "istanbul-lib-coverage": "^1.2.1",
- "mkdirp": "^0.5.1",
- "path-parse": "^1.0.5",
- "supports-color": "^3.1.2"
- }
- },
- "istanbul-lib-source-maps": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz",
- "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==",
- "dev": true,
- "requires": {
- "debug": "^3.1.0",
- "istanbul-lib-coverage": "^1.2.1",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.6.1",
- "source-map": "^0.5.3"
- }
- },
- "istanbul-reports": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz",
- "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==",
- "dev": true,
- "requires": {
- "handlebars": "^4.0.3"
- }
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
- "dev": true,
- "requires": {
- "has-flag": "^1.0.0"
- }
- }
- }
- },
- "istanbul-lib-coverage": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
- "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
- "dev": true
- },
- "istanbul-lib-hook": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz",
- "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==",
- "dev": true,
- "requires": {
- "append-transform": "^0.4.0"
- }
- },
- "istanbul-lib-instrument": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
- "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.7.5",
- "@istanbuljs/schema": "^0.1.2",
- "istanbul-lib-coverage": "^3.0.0",
- "semver": "^6.3.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "istanbul-lib-report": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz",
- "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==",
- "dev": true,
- "requires": {
- "istanbul-lib-coverage": "^2.0.5",
- "make-dir": "^2.1.0",
- "supports-color": "^6.1.0"
- },
- "dependencies": {
- "istanbul-lib-coverage": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
- "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
- "dev": true
- },
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "istanbul-lib-source-maps": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz",
- "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==",
- "dev": true,
- "requires": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^2.0.5",
- "make-dir": "^2.1.0",
- "rimraf": "^2.6.3",
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "istanbul-lib-coverage": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
- "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
- "dev": true
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "istanbul-reports": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz",
- "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==",
- "dev": true,
- "requires": {
- "html-escaper": "^2.0.0"
- }
- },
- "istextorbinary": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz",
- "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==",
- "dev": true,
- "requires": {
- "binaryextensions": "2",
- "editions": "^1.3.3",
- "textextensions": "2"
- }
- },
- "isurl": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
- "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
- "dev": true,
- "requires": {
- "has-to-string-tag-x": "^1.2.0",
- "is-object": "^1.0.1"
- }
- },
- "iterate-iterator": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz",
- "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==",
- "dev": true
- },
- "iterate-value": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz",
- "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==",
- "dev": true,
- "requires": {
- "es-get-iterator": "^1.0.2",
- "iterate-iterator": "^1.0.1"
- }
- },
- "jake": {
- "version": "10.8.2",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz",
- "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==",
- "dev": true,
- "requires": {
- "async": "0.9.x",
- "chalk": "^2.4.2",
- "filelist": "^1.0.1",
- "minimatch": "^3.0.4"
- }
- },
- "jest": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz",
- "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==",
- "dev": true,
- "requires": {
- "import-local": "^2.0.0",
- "jest-cli": "^24.9.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "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
- },
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.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=",
- "dev": true
- },
- "jest-cli": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz",
- "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==",
- "dev": true,
- "requires": {
- "@jest/core": "^24.9.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "chalk": "^2.0.1",
- "exit": "^0.1.2",
- "import-local": "^2.0.0",
- "is-ci": "^2.0.0",
- "jest-config": "^24.9.0",
- "jest-util": "^24.9.0",
- "jest-validate": "^24.9.0",
- "prompts": "^2.0.1",
- "realpath-native": "^1.1.0",
- "yargs": "^13.3.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "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"
- }
- },
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "dev": true,
- "requires": {
- "cliui": "^5.0.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^2.0.1",
- "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.1.2"
- }
- },
- "yargs-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
- }
- },
- "jest-changed-files": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz",
- "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0",
- "execa": "^1.0.0",
- "throat": "^4.0.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- }
- }
- },
- "jest-config": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz",
- "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==",
- "dev": true,
- "requires": {
- "@babel/core": "^7.1.0",
- "@jest/test-sequencer": "^24.9.0",
- "@jest/types": "^24.9.0",
- "babel-jest": "^24.9.0",
- "chalk": "^2.0.1",
- "glob": "^7.1.1",
- "jest-environment-jsdom": "^24.9.0",
- "jest-environment-node": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "jest-jasmine2": "^24.9.0",
- "jest-regex-util": "^24.3.0",
- "jest-resolve": "^24.9.0",
- "jest-util": "^24.9.0",
- "jest-validate": "^24.9.0",
- "micromatch": "^3.1.10",
- "pretty-format": "^24.9.0",
- "realpath-native": "^1.1.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "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
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "jest-get-type": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
- "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
- "dev": true
- },
- "jest-regex-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
- "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==",
- "dev": true
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- }
- }
- },
- "jest-diff": {
- "version": "26.1.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.1.0.tgz",
- "integrity": "sha512-GZpIcom339y0OXznsEKjtkfKxNdg7bVbEofK8Q6MnevTIiR1jNhDWKhRX6X0SDXJlwn3dy59nZ1z55fLkAqPWg==",
- "dev": true,
- "requires": {
- "chalk": "^4.0.0",
- "diff-sequences": "^26.0.0",
- "jest-get-type": "^26.0.0",
- "pretty-format": "^26.1.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "jest-docblock": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz",
- "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==",
- "dev": true,
- "requires": {
- "detect-newline": "^2.1.0"
- }
- },
- "jest-each": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz",
- "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0",
- "chalk": "^2.0.1",
- "jest-get-type": "^24.9.0",
- "jest-util": "^24.9.0",
- "pretty-format": "^24.9.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "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
- },
- "jest-get-type": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
- "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
- "dev": true
- },
- "pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
- }
- }
- }
- },
- "jest-environment-jsdom": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz",
- "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==",
- "dev": true,
- "requires": {
- "@jest/environment": "^24.9.0",
- "@jest/fake-timers": "^24.9.0",
- "@jest/types": "^24.9.0",
- "jest-mock": "^24.9.0",
- "jest-util": "^24.9.0",
- "jsdom": "^11.5.1"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- }
- }
- },
- "jest-environment-node": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz",
- "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==",
- "dev": true,
- "requires": {
- "@jest/environment": "^24.9.0",
- "@jest/fake-timers": "^24.9.0",
- "@jest/types": "^24.9.0",
- "jest-mock": "^24.9.0",
- "jest-util": "^24.9.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- }
- }
- },
- "jest-get-type": {
- "version": "26.0.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz",
- "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==",
- "dev": true
- },
- "jest-haste-map": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz",
- "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0",
- "anymatch": "^2.0.0",
- "fb-watchman": "^2.0.0",
- "fsevents": "^1.2.7",
- "graceful-fs": "^4.1.15",
- "invariant": "^2.2.4",
- "jest-serializer": "^24.9.0",
- "jest-util": "^24.9.0",
- "jest-worker": "^24.9.0",
- "micromatch": "^3.1.10",
- "sane": "^4.0.3",
- "walker": "^1.0.7"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
- "dev": true,
- "requires": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
- }
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fsevents": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
- "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
- "dev": true,
- "optional": true,
- "requires": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- }
- }
- },
- "jest-jasmine2": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz",
- "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==",
- "dev": true,
- "requires": {
- "@babel/traverse": "^7.1.0",
- "@jest/environment": "^24.9.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "chalk": "^2.0.1",
- "co": "^4.6.0",
- "expect": "^24.9.0",
- "is-generator-fn": "^2.0.0",
- "jest-each": "^24.9.0",
- "jest-matcher-utils": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-runtime": "^24.9.0",
- "jest-snapshot": "^24.9.0",
- "jest-util": "^24.9.0",
- "pretty-format": "^24.9.0",
- "throat": "^4.0.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "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
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "diff-sequences": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz",
- "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==",
- "dev": true
- },
- "expect": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz",
- "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0",
- "ansi-styles": "^3.2.0",
- "jest-get-type": "^24.9.0",
- "jest-matcher-utils": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-regex-util": "^24.9.0"
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "jest-diff": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz",
- "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "diff-sequences": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
- }
- },
- "jest-get-type": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
- "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
- "dev": true
- },
- "jest-matcher-utils": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz",
- "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "jest-diff": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
- }
- },
- "jest-message-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
- "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
- "stack-utils": "^1.0.1"
- }
- },
- "jest-regex-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
- "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==",
- "dev": true
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
- }
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- },
- "stack-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
- "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
- "dev": true
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- }
- }
- },
- "jest-leak-detector": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz",
- "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==",
- "dev": true,
- "requires": {
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "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
- },
- "jest-get-type": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
- "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
- "dev": true
- },
- "pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
- }
- }
- }
- },
- "jest-matcher-utils": {
- "version": "26.1.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.1.0.tgz",
- "integrity": "sha512-PW9JtItbYvES/xLn5mYxjMd+Rk+/kIt88EfH3N7w9KeOrHWaHrdYPnVHndGbsFGRJ2d5gKtwggCvkqbFDoouQA==",
- "dev": true,
- "requires": {
- "chalk": "^4.0.0",
- "jest-diff": "^26.1.0",
- "jest-get-type": "^26.0.0",
- "pretty-format": "^26.1.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "jest-message-util": {
- "version": "26.1.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz",
- "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@jest/types": "^26.1.0",
- "@types/stack-utils": "^1.0.1",
- "chalk": "^4.0.0",
- "graceful-fs": "^4.2.4",
- "micromatch": "^4.0.2",
- "slash": "^3.0.0",
- "stack-utils": "^2.0.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "jest-mock": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz",
- "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- }
- }
- },
- "jest-pnp-resolver": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
- "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
- "dev": true
- },
- "jest-regex-util": {
- "version": "26.0.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz",
- "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==",
- "dev": true
- },
- "jest-resolve": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
- "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0",
- "browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
- "jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- }
- }
- },
- "jest-resolve-dependencies": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz",
- "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0",
- "jest-regex-util": "^24.3.0",
- "jest-snapshot": "^24.9.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "jest-regex-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
- "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==",
- "dev": true
- }
- }
- },
- "jest-runner": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz",
- "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==",
- "dev": true,
- "requires": {
- "@jest/console": "^24.7.1",
- "@jest/environment": "^24.9.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "chalk": "^2.4.2",
- "exit": "^0.1.2",
- "graceful-fs": "^4.1.15",
- "jest-config": "^24.9.0",
- "jest-docblock": "^24.3.0",
- "jest-haste-map": "^24.9.0",
- "jest-jasmine2": "^24.9.0",
- "jest-leak-detector": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-resolve": "^24.9.0",
- "jest-runtime": "^24.9.0",
- "jest-util": "^24.9.0",
- "jest-worker": "^24.6.0",
- "source-map-support": "^0.5.6",
- "throat": "^4.0.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "jest-message-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
- "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
- "stack-utils": "^1.0.1"
- }
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "source-map-support": {
- "version": "0.5.19",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
- "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "stack-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
- "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
- "dev": true
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- }
- }
- },
- "jest-runtime": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz",
- "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==",
- "dev": true,
- "requires": {
- "@jest/console": "^24.7.1",
- "@jest/environment": "^24.9.0",
- "@jest/source-map": "^24.3.0",
- "@jest/transform": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/yargs": "^13.0.0",
- "chalk": "^2.0.1",
- "exit": "^0.1.2",
- "glob": "^7.1.3",
- "graceful-fs": "^4.1.15",
- "jest-config": "^24.9.0",
- "jest-haste-map": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0",
- "jest-regex-util": "^24.3.0",
- "jest-resolve": "^24.9.0",
- "jest-snapshot": "^24.9.0",
- "jest-util": "^24.9.0",
- "jest-validate": "^24.9.0",
- "realpath-native": "^1.1.0",
- "slash": "^2.0.0",
- "strip-bom": "^3.0.0",
- "yargs": "^13.3.0"
- },
- "dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "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
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "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
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "jest-message-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
- "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
- "stack-utils": "^1.0.1"
- }
- },
- "jest-regex-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
- "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==",
- "dev": true
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- },
- "stack-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
- "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
- "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"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- },
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "dev": true,
- "requires": {
- "cliui": "^5.0.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^2.0.1",
- "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.1.2"
- }
- },
- "yargs-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-string": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
+ "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "1.0.2"
+ }
+ },
+ "is-text-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
+ "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
+ "dev": true,
+ "requires": {
+ "text-extensions": "1.9.0"
+ }
+ },
+ "is-typed-array": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz",
+ "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "1.0.4",
+ "call-bind": "1.0.2",
+ "es-abstract": "1.18.3",
+ "foreach": "2.0.5",
+ "has-symbols": "1.0.2"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-unc-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "dev": true,
+ "requires": {
+ "unc-path-regex": "0.1.2"
+ }
+ },
+ "is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "is-valid-glob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
+ "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
+ "dev": true
+ },
+ "is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "dev": true
+ },
+ "is-weakset": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
+ "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "requires": {
+ "is-docker": "2.2.1"
}
},
- "jest-serializer": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
- "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==",
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isbinaryfile": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz",
+ "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true
},
- "jest-snapshot": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz",
- "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==",
+ "istanbul": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
+ "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
"dev": true,
"requires": {
- "@babel/types": "^7.0.0",
- "@jest/types": "^24.9.0",
- "chalk": "^2.0.1",
- "expect": "^24.9.0",
- "jest-diff": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "jest-matcher-utils": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-resolve": "^24.9.0",
- "mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "pretty-format": "^24.9.0",
- "semver": "^6.2.0"
+ "abbrev": "1.0.9",
+ "async": "1.5.2",
+ "escodegen": "1.8.1",
+ "esprima": "2.7.3",
+ "glob": "5.0.15",
+ "handlebars": "4.7.7",
+ "js-yaml": "3.14.1",
+ "mkdirp": "0.5.5",
+ "nopt": "3.0.6",
+ "once": "1.4.0",
+ "resolve": "1.1.7",
+ "supports-color": "3.2.3",
+ "which": "1.3.1",
+ "wordwrap": "1.0.0"
},
"dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "sprintf-js": "1.0.3"
}
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
"dev": true
},
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "diff-sequences": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz",
- "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==",
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
"dev": true
},
- "expect": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz",
- "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==",
- "dev": true,
- "requires": {
- "@jest/types": "^24.9.0",
- "ansi-styles": "^3.2.0",
- "jest-get-type": "^24.9.0",
- "jest-matcher-utils": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-regex-util": "^24.9.0"
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
"dev": true,
"requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
}
},
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
"dev": true
},
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "argparse": "1.0.10",
+ "esprima": "4.0.1"
},
"dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
}
}
},
- "jest-diff": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz",
- "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "diff-sequences": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
- }
- },
- "jest-get-type": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
- "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
- "dev": true
- },
- "jest-matcher-utils": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz",
- "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "jest-diff": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
- }
- },
- "jest-message-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
- "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
- "stack-utils": "^1.0.1"
+ "minimist": "1.2.5"
}
},
- "jest-regex-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
- "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==",
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
"dev": true
},
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
"dev": true,
"requires": {
- "minimist": "^1.2.5"
+ "has-flag": "1.0.0"
}
},
- "pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
+ "isexe": "2.0.0"
}
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- },
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true
- },
- "stack-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
- "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
+ }
+ }
+ },
+ "istanbul-lib-coverage": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
+ "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
+ "dev": true
+ },
+ "istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "7.14.6",
+ "@istanbuljs/schema": "0.1.3",
+ "istanbul-lib-coverage": "3.0.0",
+ "semver": "6.3.0"
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "3.0.0",
+ "make-dir": "3.1.0",
+ "supports-color": "7.2.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
+ "has-flag": "4.0.0"
}
}
}
},
- "jest-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
- "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
- "dev": true,
- "requires": {
- "@jest/console": "^24.9.0",
- "@jest/fake-timers": "^24.9.0",
- "@jest/source-map": "^24.9.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "callsites": "^3.0.0",
- "chalk": "^2.0.1",
- "graceful-fs": "^4.1.15",
- "is-ci": "^2.0.0",
- "mkdirp": "^0.5.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0"
+ "istanbul-lib-source-maps": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
+ "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
+ "dev": true,
+ "requires": {
+ "debug": "4.3.1",
+ "istanbul-lib-coverage": "3.0.0",
+ "source-map": "0.6.1"
},
"dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
- "dev": true,
- "requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
- }
- },
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "minimist": "^1.2.5"
+ "ms": "2.1.2"
}
},
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"source-map": {
@@ -14893,130 +12632,244 @@
}
}
},
- "jest-validate": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz",
- "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==",
+ "istanbul-reports": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
+ "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
+ "dev": true,
+ "requires": {
+ "html-escaper": "2.0.2",
+ "istanbul-lib-report": "3.0.0"
+ }
+ },
+ "istextorbinary": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-3.3.0.tgz",
+ "integrity": "sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==",
+ "dev": true,
+ "requires": {
+ "binaryextensions": "2.3.0",
+ "textextensions": "3.3.0"
+ }
+ },
+ "jake": {
+ "version": "10.8.2",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz",
+ "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==",
+ "dev": true,
+ "requires": {
+ "async": "0.9.2",
+ "chalk": "2.4.2",
+ "filelist": "1.0.2",
+ "minimatch": "3.0.4"
+ }
+ },
+ "jest-diff": {
+ "version": "27.0.2",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.2.tgz",
+ "integrity": "sha512-BFIdRb0LqfV1hBt8crQmw6gGQHVDhM87SpMIZ45FPYKReZYG5er1+5pIn2zKqvrJp6WNox0ylR8571Iwk2Dmgw==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "camelcase": "^5.3.1",
- "chalk": "^2.0.1",
- "jest-get-type": "^24.9.0",
- "leven": "^3.1.0",
- "pretty-format": "^24.9.0"
+ "chalk": "4.1.1",
+ "diff-sequences": "27.0.1",
+ "jest-get-type": "27.0.1",
+ "pretty-format": "27.0.2"
},
"dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "color-name": "1.1.4"
}
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "jest-get-type": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
- "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
+ "has-flag": "4.0.0"
}
}
}
},
- "jest-watcher": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz",
- "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==",
+ "jest-get-type": {
+ "version": "27.0.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.1.tgz",
+ "integrity": "sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg==",
+ "dev": true
+ },
+ "jest-matcher-utils": {
+ "version": "27.0.2",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.2.tgz",
+ "integrity": "sha512-Qczi5xnTNjkhcIB0Yy75Txt+Ez51xdhOxsukN7awzq2auZQGPHcQrJ623PZj0ECDEMOk2soxWx05EXdXGd1CbA==",
"dev": true,
"requires": {
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/yargs": "^13.0.0",
- "ansi-escapes": "^3.0.0",
- "chalk": "^2.0.1",
- "jest-util": "^24.9.0",
- "string-length": "^2.0.0"
+ "chalk": "4.1.1",
+ "jest-diff": "27.0.2",
+ "jest-get-type": "27.0.1",
+ "pretty-format": "27.0.2"
},
"dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "color-convert": "2.0.1"
}
},
- "@types/yargs": {
- "version": "13.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
- "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
- "ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "4.0.0"
+ }
}
}
},
- "jest-worker": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
- "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
+ "jest-message-util": {
+ "version": "27.0.2",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.2.tgz",
+ "integrity": "sha512-rTqWUX42ec2LdMkoUPOzrEd1Tcm+R1KfLOmFK+OVNo4MnLsEaxO5zPDb2BbdSmthdM/IfXxOZU60P/WbWF8BTw==",
"dev": true,
"requires": {
- "merge-stream": "^2.0.0",
- "supports-color": "^6.1.0"
+ "@babel/code-frame": "7.14.5",
+ "@jest/types": "27.0.2",
+ "@types/stack-utils": "2.0.0",
+ "chalk": "4.1.1",
+ "graceful-fs": "4.2.6",
+ "micromatch": "4.0.4",
+ "pretty-format": "27.0.2",
+ "slash": "3.0.0",
+ "stack-utils": "2.0.3"
},
"dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
"supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
- "has-flag": "^3.0.0"
+ "has-flag": "4.0.0"
}
}
}
},
+ "jest-regex-util": {
+ "version": "27.0.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.1.tgz",
+ "integrity": "sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ==",
+ "dev": true
+ },
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -15024,13 +12877,12 @@
"dev": true
},
"js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
"requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
+ "argparse": "2.0.1"
}
},
"jsbn": {
@@ -15039,51 +12891,6 @@
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
"dev": true
},
- "jsdom": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz",
- "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==",
- "dev": true,
- "requires": {
- "abab": "^2.0.0",
- "acorn": "^5.5.3",
- "acorn-globals": "^4.1.0",
- "array-equal": "^1.0.0",
- "cssom": ">= 0.3.2 < 0.4.0",
- "cssstyle": "^1.0.0",
- "data-urls": "^1.0.0",
- "domexception": "^1.0.1",
- "escodegen": "^1.9.1",
- "html-encoding-sniffer": "^1.0.2",
- "left-pad": "^1.3.0",
- "nwsapi": "^2.0.7",
- "parse5": "4.0.0",
- "pn": "^1.1.0",
- "request": "^2.87.0",
- "request-promise-native": "^1.0.5",
- "sax": "^1.2.4",
- "symbol-tree": "^3.2.2",
- "tough-cookie": "^2.3.4",
- "w3c-hr-time": "^1.0.1",
- "webidl-conversions": "^4.0.2",
- "whatwg-encoding": "^1.0.3",
- "whatwg-mimetype": "^2.1.0",
- "whatwg-url": "^6.4.1",
- "ws": "^5.2.0",
- "xml-name-validator": "^3.0.0"
- },
- "dependencies": {
- "ws": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
- "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
- "dev": true,
- "requires": {
- "async-limiter": "~1.0.0"
- }
- }
- }
- },
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -15108,6 +12915,12 @@
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
"dev": true
},
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
@@ -15133,22 +12946,22 @@
"dev": true
},
"json5": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
- "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+ "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
"dev": true,
"requires": {
- "minimist": "^1.2.5"
+ "minimist": "1.2.5"
}
},
"jsonfile": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
- "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.6",
- "universalify": "^1.0.0"
+ "graceful-fs": "4.2.6",
+ "universalify": "2.0.0"
}
},
"jsonparse": {
@@ -15175,64 +12988,61 @@
"integrity": "sha1-v7P672WqEqMWBYcSlFwyb9jwFDQ="
},
"just-debounce": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
- "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz",
+ "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==",
"dev": true
},
"just-extend": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz",
- "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
+ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
"dev": true
},
"karma": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz",
- "integrity": "sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A==",
- "dev": true,
- "requires": {
- "bluebird": "^3.3.0",
- "body-parser": "^1.16.1",
- "braces": "^3.0.2",
- "chokidar": "^3.0.0",
- "colors": "^1.1.0",
- "connect": "^3.6.0",
- "di": "^0.0.1",
- "dom-serialize": "^2.2.0",
- "flatted": "^2.0.0",
- "glob": "^7.1.1",
- "graceful-fs": "^4.1.2",
- "http-proxy": "^1.13.0",
- "isbinaryfile": "^3.0.0",
- "lodash": "^4.17.14",
- "log4js": "^4.0.0",
- "mime": "^2.3.1",
- "minimatch": "^3.0.2",
- "optimist": "^0.6.1",
- "qjobs": "^1.1.4",
- "range-parser": "^1.2.0",
- "rimraf": "^2.6.0",
- "safe-buffer": "^5.0.1",
- "socket.io": "2.1.1",
- "source-map": "^0.6.1",
- "tmp": "0.0.33",
- "useragent": "2.3.0"
+ "version": "6.3.4",
+ "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.4.tgz",
+ "integrity": "sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q==",
+ "dev": true,
+ "requires": {
+ "body-parser": "1.19.0",
+ "braces": "3.0.2",
+ "chokidar": "3.5.2",
+ "colors": "1.4.0",
+ "connect": "3.7.0",
+ "di": "0.0.1",
+ "dom-serialize": "2.2.1",
+ "glob": "7.1.7",
+ "graceful-fs": "4.2.6",
+ "http-proxy": "1.18.1",
+ "isbinaryfile": "4.0.8",
+ "lodash": "4.17.21",
+ "log4js": "6.3.0",
+ "mime": "2.5.2",
+ "minimatch": "3.0.4",
+ "qjobs": "1.2.0",
+ "range-parser": "1.2.1",
+ "rimraf": "3.0.2",
+ "socket.io": "3.1.2",
+ "source-map": "0.6.1",
+ "tmp": "0.2.1",
+ "ua-parser-js": "0.7.28",
+ "yargs": "16.2.0"
},
"dependencies": {
"mime": {
- "version": "2.4.6",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
- "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
+ "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==",
"dev": true
},
"rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
- "glob": "^7.1.3"
+ "glob": "7.1.7"
}
},
"source-map": {
@@ -15240,17 +13050,38 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
+ },
+ "tmp": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+ "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+ "dev": true,
+ "requires": {
+ "rimraf": "3.0.2"
+ }
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "7.0.4",
+ "escalade": "3.1.1",
+ "get-caller-file": "2.0.5",
+ "require-directory": "2.1.1",
+ "string-width": "4.2.2",
+ "y18n": "5.0.8",
+ "yargs-parser": "20.2.9"
+ }
}
}
},
"karma-babel-preprocessor": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/karma-babel-preprocessor/-/karma-babel-preprocessor-6.0.1.tgz",
- "integrity": "sha1-euHT5klQ2+EfQht0BAqwj7WmbCE=",
- "dev": true,
- "requires": {
- "babel-core": "^6.0.0"
- }
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/karma-babel-preprocessor/-/karma-babel-preprocessor-8.0.1.tgz",
+ "integrity": "sha512-5upyawNi3c7Gg6tPH1FWRVTmUijGf3v1GV4ScLM/2jKdDP18SlaKlUpu8eJrRI3STO8qK1bkqFcdgAA364nLYQ==",
+ "dev": true
},
"karma-browserstack-launcher": {
"version": "1.4.0",
@@ -15258,9 +13089,9 @@
"integrity": "sha512-bUQK84U+euDfOUfEjcF4IareySMOBNRLrrl9q6cttIe8f011Ir6olLITTYMOJDcGY58wiFIdhPHSPd9Pi6+NfQ==",
"dev": true,
"requires": {
- "browserstack": "~1.5.1",
- "browserstacktunnel-wrapper": "~2.0.2",
- "q": "~1.5.0"
+ "browserstack": "1.5.3",
+ "browserstacktunnel-wrapper": "2.0.4",
+ "q": "1.5.1"
}
},
"karma-chai": {
@@ -15270,83 +13101,90 @@
"dev": true
},
"karma-chrome-launcher": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
- "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz",
+ "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==",
"dev": true,
"requires": {
- "fs-access": "^1.0.0",
- "which": "^1.2.1"
+ "which": "1.3.1"
+ },
+ "dependencies": {
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ }
}
},
"karma-coverage": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.2.tgz",
- "integrity": "sha512-zge5qiGEIKDdzWciQwP4p0LSac4k/L6VfrBsERMUn5mpDvxhv1sPVOrSlpzpi70T7NhuEy4bgnpAKIYuumIMCw==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.3.tgz",
+ "integrity": "sha512-atDvLQqvPcLxhED0cmXYdsPMCQuh6Asa9FMZW1bhNqlVEhJoB9qyZ2BY1gu7D/rr5GLGb5QzYO4siQskxaWP/g==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "3.0.0",
+ "istanbul-lib-instrument": "4.0.3",
+ "istanbul-lib-report": "3.0.0",
+ "istanbul-lib-source-maps": "4.0.0",
+ "istanbul-reports": "3.0.2",
+ "minimatch": "3.0.4"
+ }
+ },
+ "karma-coverage-istanbul-reporter": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz",
+ "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==",
"dev": true,
"requires": {
- "istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-instrument": "^4.0.1",
- "istanbul-lib-report": "^3.0.0",
- "istanbul-lib-source-maps": "^4.0.0",
- "istanbul-reports": "^3.0.0",
- "minimatch": "^3.0.4"
+ "istanbul-lib-coverage": "3.0.0",
+ "istanbul-lib-report": "3.0.0",
+ "istanbul-lib-source-maps": "3.0.6",
+ "istanbul-reports": "3.0.2",
+ "minimatch": "3.0.4"
},
"dependencies": {
"debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "istanbul-lib-report": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
- "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^3.0.0",
- "supports-color": "^7.1.0"
+ "ms": "2.1.2"
}
},
"istanbul-lib-source-maps": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
- "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz",
+ "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==",
"dev": true,
"requires": {
- "debug": "^4.1.1",
- "istanbul-lib-coverage": "^3.0.0",
- "source-map": "^0.6.1"
- }
- },
- "istanbul-reports": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
- "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
- "dev": true,
- "requires": {
- "html-escaper": "^2.0.0",
- "istanbul-lib-report": "^3.0.0"
+ "debug": "4.3.1",
+ "istanbul-lib-coverage": "2.0.5",
+ "make-dir": "2.1.0",
+ "rimraf": "2.7.1",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "istanbul-lib-coverage": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
+ "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
+ "dev": true
+ }
}
},
"make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
"dev": true,
"requires": {
- "semver": "^6.0.0"
+ "pify": "4.0.1",
+ "semver": "5.7.1"
}
},
"ms": {
@@ -15355,55 +13193,52 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
"dev": true
},
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
"dev": true,
"requires": {
- "has-flag": "^4.0.0"
+ "glob": "7.1.7"
}
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
}
}
},
- "karma-coverage-istanbul-reporter": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz",
- "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=",
- "dev": true,
- "requires": {
- "istanbul-api": "^1.3.1",
- "minimatch": "^3.0.4"
- }
- },
"karma-es5-shim": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/karma-es5-shim/-/karma-es5-shim-0.0.4.tgz",
"integrity": "sha1-zdADM8znfC5M4D46yT8vjs0fuVI=",
"dev": true,
"requires": {
- "es5-shim": "^4.0.5"
+ "es5-shim": "4.5.15"
}
},
"karma-firefox-launcher": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.3.0.tgz",
- "integrity": "sha512-Fi7xPhwrRgr+94BnHX0F5dCl1miIW4RHnzjIGxF8GaIEp7rNqX7LSi7ok63VXs3PS/5MQaQMhGxw+bvD+pibBQ==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.1.tgz",
+ "integrity": "sha512-VzDMgPseXak9DtfyE1O5bB2BwsMy1zzO1kUxVW1rP0yhC4tDNJ0p3JoFdzvrK4QqVzdqUMa9Rx9YzkdFp8hz3Q==",
"dev": true,
"requires": {
- "is-wsl": "^2.1.0"
+ "is-wsl": "2.2.0",
+ "which": "2.0.2"
}
},
"karma-ie-launcher": {
@@ -15412,24 +13247,16 @@
"integrity": "sha1-SXmGhCxJAZA0bNifVJTKmDDG1Zw=",
"dev": true,
"requires": {
- "lodash": "^4.6.1"
+ "lodash": "4.17.21"
}
},
"karma-mocha": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz",
- "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz",
+ "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==",
"dev": true,
"requires": {
- "minimist": "1.2.0"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- }
+ "minimist": "1.2.5"
}
},
"karma-mocha-reporter": {
@@ -15438,9 +13265,9 @@
"integrity": "sha1-FRIAlejtgZGG5HoLAS8810GJVWA=",
"dev": true,
"requires": {
- "chalk": "^2.1.0",
- "log-symbols": "^2.1.0",
- "strip-ansi": "^4.0.0"
+ "chalk": "2.4.2",
+ "log-symbols": "2.2.0",
+ "strip-ansi": "4.0.0"
},
"dependencies": {
"ansi-regex": {
@@ -15455,7 +13282,7 @@
"integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
"dev": true,
"requires": {
- "chalk": "^2.0.1"
+ "chalk": "2.4.2"
}
},
"strip-ansi": {
@@ -15464,7 +13291,7 @@
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true,
"requires": {
- "ansi-regex": "^3.0.0"
+ "ansi-regex": "3.0.0"
}
}
}
@@ -15494,21 +13321,21 @@
"dev": true
},
"karma-sourcemap-loader": {
- "version": "0.3.7",
- "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz",
- "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=",
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz",
+ "integrity": "sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g==",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2"
+ "graceful-fs": "4.2.6"
}
},
"karma-spec-reporter": {
- "version": "0.0.31",
- "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.31.tgz",
- "integrity": "sha1-SDDccUihVcfXoYbmMjOaDYD63sM=",
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz",
+ "integrity": "sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo=",
"dev": true,
"requires": {
- "colors": "^1.1.2"
+ "colors": "1.4.0"
}
},
"karma-webpack": {
@@ -15517,12 +13344,12 @@
"integrity": "sha512-nRudGJWstvVuA6Tbju9tyGUfXTtI1UXMXoRHVmM2/78D0q6s/Ye2IC157PKNDC15PWFGR0mVIRtWLAdcfsRJoA==",
"dev": true,
"requires": {
- "async": "^2.0.0",
- "babel-runtime": "^6.0.0",
- "loader-utils": "^1.0.0",
- "lodash": "^4.0.0",
- "source-map": "^0.5.6",
- "webpack-dev-middleware": "^2.0.6"
+ "async": "2.6.3",
+ "babel-runtime": "6.26.0",
+ "loader-utils": "1.4.0",
+ "lodash": "4.17.21",
+ "source-map": "0.5.7",
+ "webpack-dev-middleware": "2.0.6"
},
"dependencies": {
"async": {
@@ -15531,7 +13358,7 @@
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
"dev": true,
"requires": {
- "lodash": "^4.17.14"
+ "lodash": "4.17.21"
}
},
"json5": {
@@ -15540,7 +13367,7 @@
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"dev": true,
"requires": {
- "minimist": "^1.2.0"
+ "minimist": "1.2.5"
}
},
"loader-utils": {
@@ -15549,23 +13376,17 @@
"integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
"dev": true,
"requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
+ "big.js": "5.2.2",
+ "emojis-list": "3.0.0",
+ "json5": "1.0.1"
}
}
}
},
- "kebab-case": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/kebab-case/-/kebab-case-1.0.0.tgz",
- "integrity": "sha1-P55JkK3K0MaGwOcB92RYaPdfkes=",
- "dev": true
- },
"keyv": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.1.tgz",
- "integrity": "sha512-xz6Jv6oNkbhrFCvCP7HQa8AaII8y8LRpoSm661NOKLr4uHuBwhX4epXrPQgF3+xdJnN4Esm5X0xwY4bOlALOtw==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz",
+ "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==",
"dev": true,
"requires": {
"json-buffer": "3.0.1"
@@ -15577,11 +13398,15 @@
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true
},
- "kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "dev": true
+ "konan": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/konan/-/konan-2.1.1.tgz",
+ "integrity": "sha512-7ZhYV84UzJ0PR/RJnnsMZcAbn+kLasJhVNWsu8ZyVEJYRpGA5XESQ9d/7zOa08U0Ou4cmB++hMNY/3OSV9KIbg==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "7.14.7",
+ "@babel/traverse": "7.14.7"
+ }
},
"last-run": {
"version": "1.1.1",
@@ -15589,8 +13414,8 @@
"integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
"dev": true,
"requires": {
- "default-resolution": "^2.0.0",
- "es6-weak-map": "^2.0.1"
+ "default-resolution": "2.0.0",
+ "es6-weak-map": "2.0.3"
}
},
"lazy-cache": {
@@ -15605,7 +13430,7 @@
"integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
"dev": true,
"requires": {
- "readable-stream": "^2.0.5"
+ "readable-stream": "2.3.7"
},
"dependencies": {
"readable-stream": {
@@ -15614,13 +13439,22 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
@@ -15631,7 +13465,7 @@
"integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
"dev": true,
"requires": {
- "invert-kv": "^1.0.0"
+ "invert-kv": "1.0.0"
}
},
"lcov-parse": {
@@ -15646,38 +13480,17 @@
"integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
"dev": true,
"requires": {
- "flush-write-stream": "^1.0.2"
- }
- },
- "left-pad": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
- "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==",
- "dev": true
- },
- "leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "dev": true
- },
- "levenary": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
- "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
- "dev": true,
- "requires": {
- "leven": "^3.1.0"
+ "flush-write-stream": "1.1.1"
}
},
"levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
+ "prelude-ls": "1.2.1",
+ "type-check": "0.4.0"
}
},
"liftoff": {
@@ -15686,14 +13499,14 @@
"integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==",
"dev": true,
"requires": {
- "extend": "^3.0.0",
- "findup-sync": "^3.0.0",
- "fined": "^1.0.1",
- "flagged-respawn": "^1.0.0",
- "is-plain-object": "^2.0.4",
- "object.map": "^1.0.0",
- "rechoir": "^0.6.2",
- "resolve": "^1.1.7"
+ "extend": "3.0.2",
+ "findup-sync": "3.0.0",
+ "fined": "1.2.0",
+ "flagged-respawn": "1.0.1",
+ "is-plain-object": "2.0.4",
+ "object.map": "1.0.1",
+ "rechoir": "0.6.2",
+ "resolve": "1.20.0"
}
},
"lighthouse-logger": {
@@ -15702,10 +13515,16 @@
"integrity": "sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw==",
"dev": true,
"requires": {
- "debug": "^2.6.8",
- "marky": "^1.2.0"
+ "debug": "2.6.9",
+ "marky": "1.2.2"
}
},
+ "lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
"listenercount": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz",
@@ -15732,11 +13551,11 @@
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
+ "graceful-fs": "4.2.6",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
}
},
"loader-runner": {
@@ -15751,9 +13570,9 @@
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
+ "big.js": "5.2.2",
+ "emojis-list": "3.0.0",
+ "json5": "2.2.0"
}
},
"locate-path": {
@@ -15762,7 +13581,7 @@
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
- "p-locate": "^4.1.0"
+ "p-locate": "4.1.0"
}
},
"lodash": {
@@ -15795,7 +13614,7 @@
"integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=",
"dev": true,
"requires": {
- "lodash._htmlescapes": "~2.4.1"
+ "lodash._htmlescapes": "2.4.1"
}
},
"lodash._escapestringchar": {
@@ -15858,8 +13677,8 @@
"integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=",
"dev": true,
"requires": {
- "lodash._htmlescapes": "~2.4.1",
- "lodash.keys": "~2.4.1"
+ "lodash._htmlescapes": "2.4.1",
+ "lodash.keys": "2.4.1"
}
},
"lodash._root": {
@@ -15874,9 +13693,16 @@
"integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=",
"dev": true,
"requires": {
- "lodash._objecttypes": "~2.4.1"
+ "lodash._objecttypes": "2.4.1"
}
},
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true,
+ "optional": true
+ },
"lodash.clone": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
@@ -15889,6 +13715,12 @@
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
"dev": true
},
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+ "dev": true
+ },
"lodash.defaults": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
@@ -15907,9 +13739,9 @@
"integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=",
"dev": true,
"requires": {
- "lodash._escapehtmlchar": "~2.4.1",
- "lodash._reunescapedhtml": "~2.4.1",
- "lodash.keys": "~2.4.1"
+ "lodash._escapehtmlchar": "2.4.1",
+ "lodash._reunescapedhtml": "2.4.1",
+ "lodash.keys": "2.4.1"
}
},
"lodash.flatten": {
@@ -15942,6 +13774,12 @@
"integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
"dev": true
},
+ "lodash.ismatch": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
+ "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=",
+ "dev": true
+ },
"lodash.isobject": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
@@ -15960,9 +13798,9 @@
"integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
"dev": true,
"requires": {
- "lodash._isnative": "~2.4.1",
- "lodash._shimkeys": "~2.4.1",
- "lodash.isobject": "~2.4.1"
+ "lodash._isnative": "2.4.1",
+ "lodash._shimkeys": "2.4.1",
+ "lodash.isobject": "2.4.1"
},
"dependencies": {
"lodash.isobject": {
@@ -15971,7 +13809,7 @@
"integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=",
"dev": true,
"requires": {
- "lodash._objecttypes": "~2.4.1"
+ "lodash._objecttypes": "2.4.1"
}
}
}
@@ -16000,25 +13838,19 @@
"integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
"dev": true
},
- "lodash.sortby": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
- "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
- "dev": true
- },
"lodash.template": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz",
"integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=",
"dev": true,
"requires": {
- "lodash._escapestringchar": "~2.4.1",
- "lodash._reinterpolate": "~2.4.1",
- "lodash.defaults": "~2.4.1",
- "lodash.escape": "~2.4.1",
- "lodash.keys": "~2.4.1",
- "lodash.templatesettings": "~2.4.1",
- "lodash.values": "~2.4.1"
+ "lodash._escapestringchar": "2.4.1",
+ "lodash._reinterpolate": "2.4.1",
+ "lodash.defaults": "2.4.1",
+ "lodash.escape": "2.4.1",
+ "lodash.keys": "2.4.1",
+ "lodash.templatesettings": "2.4.1",
+ "lodash.values": "2.4.1"
},
"dependencies": {
"lodash.defaults": {
@@ -16027,8 +13859,8 @@
"integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=",
"dev": true,
"requires": {
- "lodash._objecttypes": "~2.4.1",
- "lodash.keys": "~2.4.1"
+ "lodash._objecttypes": "2.4.1",
+ "lodash.keys": "2.4.1"
}
}
}
@@ -16039,10 +13871,16 @@
"integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=",
"dev": true,
"requires": {
- "lodash._reinterpolate": "~2.4.1",
- "lodash.escape": "~2.4.1"
+ "lodash._reinterpolate": "2.4.1",
+ "lodash.escape": "2.4.1"
}
},
+ "lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+ "dev": true
+ },
"lodash.union": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
@@ -16055,7 +13893,7 @@
"integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=",
"dev": true,
"requires": {
- "lodash.keys": "~2.4.1"
+ "lodash.keys": "2.4.1"
}
},
"lodash.zip": {
@@ -16071,36 +13909,94 @@
"dev": true
},
"log-symbols": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
- "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"dev": true,
"requires": {
- "chalk": "^2.4.2"
+ "chalk": "4.1.1",
+ "is-unicode-supported": "0.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "4.0.0"
+ }
+ }
}
},
"log4js": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz",
- "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==",
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz",
+ "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==",
"dev": true,
"requires": {
- "date-format": "^2.0.0",
- "debug": "^4.1.1",
- "flatted": "^2.0.0",
- "rfdc": "^1.1.4",
- "streamroller": "^1.0.6"
+ "date-format": "3.0.0",
+ "debug": "4.3.1",
+ "flatted": "2.0.2",
+ "rfdc": "1.3.0",
+ "streamroller": "2.2.4"
},
"dependencies": {
"debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.2"
}
},
+ "flatted": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "dev": true
+ },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -16110,9 +14006,9 @@
}
},
"loglevel": {
- "version": "1.6.8",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz",
- "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==",
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz",
+ "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==",
"dev": true
},
"loglevel-plugin-prefix": {
@@ -16127,8 +14023,8 @@
"integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==",
"dev": true,
"requires": {
- "es6-symbol": "^3.1.1",
- "object.assign": "^4.1.0"
+ "es6-symbol": "3.1.3",
+ "object.assign": "4.1.2"
}
},
"lolex": {
@@ -16149,23 +14045,14 @@
"integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
"dev": true
},
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dev": true,
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
- },
"loud-rejection": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
"integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
"dev": true,
"requires": {
- "currently-unhandled": "^0.4.1",
- "signal-exit": "^3.0.0"
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.3"
}
},
"lowercase-keys": {
@@ -16180,8 +14067,8 @@
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"dev": true,
"requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
}
},
"lru-queue": {
@@ -16190,40 +14077,26 @@
"integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
"dev": true,
"requires": {
- "es5-ext": "~0.10.2"
+ "es5-ext": "0.10.53"
}
},
- "make-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
- "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "magic-string": {
+ "version": "0.25.7",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+ "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
"dev": true,
+ "optional": true,
"requires": {
- "pify": "^4.0.1",
- "semver": "^5.6.0"
- },
- "dependencies": {
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true
- }
+ "sourcemap-codec": "1.4.8"
}
},
- "make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "make-error-cause": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz",
- "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=",
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
"requires": {
- "make-error": "^1.2.0"
+ "semver": "6.3.0"
}
},
"make-iterator": {
@@ -16232,16 +14105,7 @@
"integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
"dev": true,
"requires": {
- "kind-of": "^6.0.2"
- }
- },
- "makeerror": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
- "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
- "dev": true,
- "requires": {
- "tmpl": "1.0.x"
+ "kind-of": "6.0.3"
}
},
"map-cache": {
@@ -16268,25 +14132,22 @@
"integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
"dev": true,
"requires": {
- "object-visit": "^1.0.0"
+ "object-visit": "1.0.1"
}
},
- "markdown-escapes": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
- "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
- "dev": true
- },
"markdown-table": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
- "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==",
- "dev": true
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
+ "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
+ "dev": true,
+ "requires": {
+ "repeat-string": "1.6.1"
+ }
},
"marky": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.1.tgz",
- "integrity": "sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.2.tgz",
+ "integrity": "sha512-k1dB2HNeaNyORco8ulVEhctyEGkKHb2YWAhDsxeFlW2nROIirsctBYzKwwS3Vza+sKTS1zO4Z+n9/+9WbGLIxQ==",
"dev": true
},
"matchdep": {
@@ -16295,9 +14156,9 @@
"integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
"dev": true,
"requires": {
- "findup-sync": "^2.0.0",
- "micromatch": "^3.0.4",
- "resolve": "^1.4.0",
+ "findup-sync": "2.0.0",
+ "micromatch": "3.1.10",
+ "resolve": "1.20.0",
"stack-trace": "0.0.10"
},
"dependencies": {
@@ -16307,16 +14168,16 @@
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
"dev": true,
"requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.4",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
},
"dependencies": {
"extend-shallow": {
@@ -16325,7 +14186,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -16336,10 +14197,10 @@
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
"dev": true,
"requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
},
"dependencies": {
"extend-shallow": {
@@ -16348,7 +14209,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -16359,25 +14220,19 @@
"integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
"dev": true,
"requires": {
- "detect-file": "^1.0.0",
- "is-glob": "^3.1.0",
- "micromatch": "^3.0.4",
- "resolve-dir": "^1.0.1"
+ "detect-file": "1.0.0",
+ "is-glob": "3.1.0",
+ "micromatch": "3.1.10",
+ "resolve-dir": "1.0.1"
}
},
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
"is-glob": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
"dev": true,
"requires": {
- "is-extglob": "^2.1.0"
+ "is-extglob": "2.1.1"
}
},
"is-number": {
@@ -16386,7 +14241,7 @@
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "kind-of": "3.2.2"
},
"dependencies": {
"kind-of": {
@@ -16395,7 +14250,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
@@ -16406,19 +14261,19 @@
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
"dev": true,
"requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.3",
+ "nanomatch": "1.2.13",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
}
},
"to-regex-range": {
@@ -16427,8 +14282,8 @@
"integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
"dev": true,
"requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
}
}
}
@@ -16445,27 +14300,110 @@
"integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
"dev": true,
"requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
+ "hash-base": "3.1.0",
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "mdast-util-definitions": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz",
+ "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==",
+ "dev": true,
+ "requires": {
+ "unist-util-visit": "2.0.3"
}
},
- "mdast-util-compact": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz",
- "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==",
+ "mdast-util-find-and-replace": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz",
+ "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==",
"dev": true,
"requires": {
- "unist-util-visit": "^1.1.0"
+ "escape-string-regexp": "4.0.0",
+ "unist-util-is": "4.1.0",
+ "unist-util-visit-parents": "3.1.1"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ }
}
},
- "mdast-util-definitions": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz",
- "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==",
+ "mdast-util-from-markdown": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
+ "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
+ "dev": true,
+ "requires": {
+ "@types/mdast": "3.0.3",
+ "mdast-util-to-string": "2.0.0",
+ "micromark": "2.11.4",
+ "parse-entities": "2.0.0",
+ "unist-util-stringify-position": "2.0.3"
+ },
+ "dependencies": {
+ "mdast-util-to-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+ "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
+ "dev": true
+ }
+ }
+ },
+ "mdast-util-gfm": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz",
+ "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==",
+ "dev": true,
+ "requires": {
+ "mdast-util-gfm-autolink-literal": "0.1.3",
+ "mdast-util-gfm-strikethrough": "0.2.3",
+ "mdast-util-gfm-table": "0.1.6",
+ "mdast-util-gfm-task-list-item": "0.1.6",
+ "mdast-util-to-markdown": "0.6.5"
+ }
+ },
+ "mdast-util-gfm-autolink-literal": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz",
+ "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==",
+ "dev": true,
+ "requires": {
+ "ccount": "1.1.0",
+ "mdast-util-find-and-replace": "1.1.1",
+ "micromark": "2.11.4"
+ }
+ },
+ "mdast-util-gfm-strikethrough": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz",
+ "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==",
+ "dev": true,
+ "requires": {
+ "mdast-util-to-markdown": "0.6.5"
+ }
+ },
+ "mdast-util-gfm-table": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz",
+ "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==",
+ "dev": true,
+ "requires": {
+ "markdown-table": "2.0.0",
+ "mdast-util-to-markdown": "0.6.5"
+ }
+ },
+ "mdast-util-gfm-task-list-item": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz",
+ "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==",
"dev": true,
"requires": {
- "unist-util-visit": "^1.0.0"
+ "mdast-util-to-markdown": "0.6.5"
}
},
"mdast-util-inject": {
@@ -16474,26 +14412,45 @@
"integrity": "sha1-2wa4tYW+lZotzS+H9HK6m3VvNnU=",
"dev": true,
"requires": {
- "mdast-util-to-string": "^1.0.0"
+ "mdast-util-to-string": "1.1.0"
}
},
"mdast-util-to-hast": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-3.0.4.tgz",
- "integrity": "sha512-/eIbly2YmyVgpJNo+bFLLMCI1XgolO/Ffowhf+pHDq3X4/V6FntC9sGQCDLM147eTS+uSXv5dRzJyFn+o0tazA==",
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz",
+ "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==",
+ "dev": true,
+ "requires": {
+ "@types/mdast": "3.0.3",
+ "@types/unist": "2.0.3",
+ "mdast-util-definitions": "4.0.0",
+ "mdurl": "1.0.1",
+ "unist-builder": "2.0.3",
+ "unist-util-generated": "1.1.6",
+ "unist-util-position": "3.1.0",
+ "unist-util-visit": "2.0.3"
+ }
+ },
+ "mdast-util-to-markdown": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
+ "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
"dev": true,
"requires": {
- "collapse-white-space": "^1.0.0",
- "detab": "^2.0.0",
- "mdast-util-definitions": "^1.2.0",
- "mdurl": "^1.0.1",
- "trim": "0.0.1",
- "trim-lines": "^1.0.0",
- "unist-builder": "^1.0.1",
- "unist-util-generated": "^1.1.0",
- "unist-util-position": "^3.0.0",
- "unist-util-visit": "^1.1.0",
- "xtend": "^4.0.1"
+ "@types/unist": "2.0.3",
+ "longest-streak": "2.0.4",
+ "mdast-util-to-string": "2.0.0",
+ "parse-entities": "2.0.0",
+ "repeat-string": "1.6.1",
+ "zwitch": "1.0.5"
+ },
+ "dependencies": {
+ "mdast-util-to-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+ "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
+ "dev": true
+ }
}
},
"mdast-util-to-string": {
@@ -16503,15 +14460,18 @@
"dev": true
},
"mdast-util-toc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-3.1.0.tgz",
- "integrity": "sha512-Za0hqL1PqWrvxGtA/3NH9D5nhGAUS9grMM4obEAz5+zsk1RIw/vWUchkaoDLNdrwk05A0CSC5eEXng36/1qE5w==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-5.1.0.tgz",
+ "integrity": "sha512-csimbRIVkiqc+PpFeKDGQ/Ck2N4f9FYH3zzBMMJzcxoKL8m+cM0n94xXm0I9eaxHnKdY9n145SGTdyJC7i273g==",
"dev": true,
"requires": {
- "github-slugger": "^1.2.1",
- "mdast-util-to-string": "^1.0.5",
- "unist-util-is": "^2.1.2",
- "unist-util-visit": "^1.1.0"
+ "@types/mdast": "3.0.3",
+ "@types/unist": "2.0.3",
+ "extend": "3.0.2",
+ "github-slugger": "1.3.0",
+ "mdast-util-to-string": "2.0.0",
+ "unist-util-is": "4.1.0",
+ "unist-util-visit": "2.0.3"
},
"dependencies": {
"emoji-regex": {
@@ -16526,13 +14486,13 @@
"integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==",
"dev": true,
"requires": {
- "emoji-regex": ">=6.0.0 <=6.1.1"
+ "emoji-regex": "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==",
+ "mdast-util-to-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+ "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
"dev": true
}
}
@@ -16554,7 +14514,7 @@
"integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
"dev": true,
"requires": {
- "mimic-fn": "^1.0.0"
+ "mimic-fn": "1.2.0"
},
"dependencies": {
"mimic-fn": {
@@ -16566,19 +14526,27 @@
}
},
"memoizee": {
- "version": "0.4.14",
- "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz",
- "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==",
+ "version": "0.4.15",
+ "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz",
+ "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==",
"dev": true,
"requires": {
- "d": "1",
- "es5-ext": "^0.10.45",
- "es6-weak-map": "^2.0.2",
- "event-emitter": "^0.3.5",
- "is-promise": "^2.1",
- "lru-queue": "0.1",
- "next-tick": "1",
- "timers-ext": "^0.1.5"
+ "d": "1.0.1",
+ "es5-ext": "0.10.53",
+ "es6-weak-map": "2.0.3",
+ "event-emitter": "0.3.5",
+ "is-promise": "2.2.2",
+ "lru-queue": "0.1.0",
+ "next-tick": "1.1.0",
+ "timers-ext": "0.1.7"
+ },
+ "dependencies": {
+ "next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
+ "dev": true
+ }
}
},
"memory-fs": {
@@ -16587,8 +14555,8 @@
"integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
"dev": true,
"requires": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
+ "errno": "0.1.8",
+ "readable-stream": "2.3.7"
},
"dependencies": {
"readable-stream": {
@@ -16597,56 +14565,199 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ }
+ }
+ },
+ "meow": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
+ "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
+ "dev": true,
+ "requires": {
+ "@types/minimist": "1.2.1",
+ "camelcase-keys": "6.2.2",
+ "decamelize-keys": "1.1.0",
+ "hard-rejection": "2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "3.0.2",
+ "read-pkg-up": "7.0.1",
+ "redent": "3.0.0",
+ "trim-newlines": "3.0.1",
+ "type-fest": "0.18.1",
+ "yargs-parser": "20.2.9"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "5.3.1",
+ "map-obj": "4.2.1",
+ "quick-lru": "4.0.1"
+ }
+ },
+ "hosted-git-info": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
+ "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "6.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "4.0.0"
+ }
+ },
+ "map-obj": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz",
+ "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz",
+ "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "4.0.2",
+ "resolve": "1.20.0",
+ "semver": "7.3.5",
+ "validate-npm-package-license": "3.0.4"
}
- }
- }
- },
- "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",
- "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
- "dev": true,
- "requires": {
- "camelcase-keys": "^2.0.0",
- "decamelize": "^1.1.2",
- "loud-rejection": "^1.0.0",
- "map-obj": "^1.0.1",
- "minimist": "^1.1.3",
- "normalize-package-data": "^2.3.4",
- "object-assign": "^4.0.1",
- "read-pkg-up": "^1.0.1",
- "redent": "^1.0.0",
- "trim-newlines": "^1.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ },
+ "parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.14.5",
+ "error-ex": "1.3.2",
+ "json-parse-even-better-errors": "2.3.1",
+ "lines-and-columns": "1.1.6"
+ }
+ },
+ "quick-lru": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
"dev": true
},
- "camelcase-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
- "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "requires": {
+ "@types/normalize-package-data": "2.4.0",
+ "normalize-package-data": "2.5.0",
+ "parse-json": "5.2.0",
+ "type-fest": "0.6.0"
+ },
+ "dependencies": {
+ "hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.8.9",
+ "resolve": "1.20.0",
+ "semver": "5.7.1",
+ "validate-npm-package-license": "3.0.4"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "requires": {
+ "find-up": "4.1.0",
+ "read-pkg": "5.2.0",
+ "type-fest": "0.8.1"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ }
+ }
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
"requires": {
- "camelcase": "^2.0.0",
- "map-obj": "^1.0.0"
+ "lru-cache": "6.0.0"
}
+ },
+ "type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
}
},
@@ -16661,7 +14772,7 @@
"integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
"dev": true,
"requires": {
- "source-map": "^0.6.1"
+ "source-map": "0.6.1"
},
"dependencies": {
"source-map": {
@@ -16683,14 +14794,97 @@
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
},
+ "micromark": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
+ "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
+ "dev": true,
+ "requires": {
+ "debug": "4.3.1",
+ "parse-entities": "2.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
+ "micromark-extension-gfm": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz",
+ "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==",
+ "dev": true,
+ "requires": {
+ "micromark": "2.11.4",
+ "micromark-extension-gfm-autolink-literal": "0.5.7",
+ "micromark-extension-gfm-strikethrough": "0.6.5",
+ "micromark-extension-gfm-table": "0.4.3",
+ "micromark-extension-gfm-tagfilter": "0.3.0",
+ "micromark-extension-gfm-task-list-item": "0.3.3"
+ }
+ },
+ "micromark-extension-gfm-autolink-literal": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz",
+ "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==",
+ "dev": true,
+ "requires": {
+ "micromark": "2.11.4"
+ }
+ },
+ "micromark-extension-gfm-strikethrough": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz",
+ "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==",
+ "dev": true,
+ "requires": {
+ "micromark": "2.11.4"
+ }
+ },
+ "micromark-extension-gfm-table": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz",
+ "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==",
+ "dev": true,
+ "requires": {
+ "micromark": "2.11.4"
+ }
+ },
+ "micromark-extension-gfm-tagfilter": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz",
+ "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==",
+ "dev": true
+ },
+ "micromark-extension-gfm-task-list-item": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz",
+ "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==",
+ "dev": true,
+ "requires": {
+ "micromark": "2.11.4"
+ }
+ },
"micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"dev": true,
"requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
+ "braces": "3.0.2",
+ "picomatch": "2.3.0"
}
},
"miller-rabin": {
@@ -16699,14 +14893,14 @@
"integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
"dev": true,
"requires": {
- "bn.js": "^4.0.0",
- "brorand": "^1.0.1"
+ "bn.js": "4.12.0",
+ "brorand": "1.1.0"
},
"dependencies": {
"bn.js": {
- "version": "4.11.9",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
- "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
"dev": true
}
}
@@ -16717,16 +14911,16 @@
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
- "version": "1.44.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
- "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
+ "version": "1.48.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz",
+ "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ=="
},
"mime-types": {
- "version": "2.1.27",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
- "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+ "version": "2.1.31",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz",
+ "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==",
"requires": {
- "mime-db": "1.44.0"
+ "mime-db": "1.48.0"
}
},
"mimic-fn": {
@@ -16741,6 +14935,12 @@
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"dev": true
},
+ "min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true
+ },
"minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
@@ -16759,7 +14959,7 @@
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
- "brace-expansion": "^1.1.7"
+ "brace-expansion": "1.1.11"
}
},
"minimist": {
@@ -16768,14 +14968,33 @@
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
+ "minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "dev": true,
+ "requires": {
+ "arrify": "1.0.1",
+ "is-plain-obj": "1.1.0",
+ "kind-of": "6.0.3"
+ },
+ "dependencies": {
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+ "dev": true
+ }
+ }
+ },
"mixin-deep": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
"integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
"dev": true,
"requires": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
},
"dependencies": {
"is-extendable": {
@@ -16784,7 +15003,7 @@
"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
"dev": true,
"requires": {
- "is-plain-object": "^2.0.4"
+ "is-plain-object": "2.0.4"
}
}
}
@@ -16820,6 +15039,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",
@@ -16841,12 +15066,12 @@
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"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"
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
}
},
"he": {
@@ -16876,31 +15101,39 @@
"integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
"dev": true,
"requires": {
- "has-flag": "^3.0.0"
+ "has-flag": "3.0.0"
}
}
}
},
+ "modify-values": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
+ "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
+ "dev": true
+ },
"module-deps-sortable": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/module-deps-sortable/-/module-deps-sortable-4.0.6.tgz",
- "integrity": "sha1-ElGkuixEqS32mJvQKdoSGk8hCbA=",
- "dev": true,
- "requires": {
- "JSONStream": "^1.0.3",
- "browser-resolve": "^1.7.0",
- "concat-stream": "~1.5.0",
- "defined": "^1.0.0",
- "detective": "^4.0.0",
- "duplexer2": "^0.1.2",
- "inherits": "^2.0.1",
- "parents": "^1.0.0",
- "readable-stream": "^2.0.2",
- "resolve": "^1.1.3",
- "stream-combiner2": "^1.1.1",
- "subarg": "^1.0.0",
- "through2": "^2.0.0",
- "xtend": "^4.0.0"
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/module-deps-sortable/-/module-deps-sortable-5.0.3.tgz",
+ "integrity": "sha512-eiyIZj/A0dj1o4ywXWqicazUL3l0HP3TydUR6xF0X3xh3LGBMLqW8a9aFe6MuNH4mxNMk53QKBHM6LOPR8kSgw==",
+ "dev": true,
+ "requires": {
+ "JSONStream": "1.3.5",
+ "browser-resolve": "1.11.3",
+ "cached-path-relative": "1.0.2",
+ "concat-stream": "1.5.2",
+ "defined": "1.0.0",
+ "detective": "5.2.0",
+ "duplexer2": "0.1.4",
+ "inherits": "2.0.3",
+ "konan": "2.1.1",
+ "readable-stream": "2.3.7",
+ "resolve": "1.20.0",
+ "standard-version": "9.3.0",
+ "stream-combiner2": "1.1.1",
+ "subarg": "1.0.0",
+ "through2": "2.0.5",
+ "xtend": "4.0.2"
},
"dependencies": {
"concat-stream": {
@@ -16909,9 +15142,9 @@
"integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=",
"dev": true,
"requires": {
- "inherits": "~2.0.1",
- "readable-stream": "~2.0.0",
- "typedarray": "~0.0.5"
+ "inherits": "2.0.3",
+ "readable-stream": "2.0.6",
+ "typedarray": "0.0.6"
},
"dependencies": {
"readable-stream": {
@@ -16920,12 +15153,12 @@
"integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "~1.0.0",
- "process-nextick-args": "~1.0.6",
- "string_decoder": "~0.10.x",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "string_decoder": "0.10.31",
+ "util-deprecate": "1.0.2"
}
}
}
@@ -16942,13 +15175,13 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
},
"dependencies": {
"process-nextick-args": {
@@ -16963,7 +15196,7 @@
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
- "safe-buffer": "~5.1.0"
+ "safe-buffer": "5.1.2"
}
}
}
@@ -16973,6 +15206,16 @@
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
"dev": true
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
+ }
}
}
},
@@ -16982,11 +15225,11 @@
"integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
"dev": true,
"requires": {
- "basic-auth": "~2.0.1",
+ "basic-auth": "2.0.1",
"debug": "2.6.9",
- "depd": "~2.0.0",
- "on-finished": "~2.3.0",
- "on-headers": "~1.0.2"
+ "depd": "2.0.0",
+ "on-finished": "2.3.0",
+ "on-headers": "1.0.2"
},
"dependencies": {
"depd": {
@@ -17017,7 +15260,7 @@
"integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
"dev": true,
"requires": {
- "readable-stream": "~1.1.9"
+ "readable-stream": "1.1.14"
}
},
"isarray": {
@@ -17032,10 +15275,10 @@
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
"isarray": "0.0.1",
- "string_decoder": "~0.10.x"
+ "string_decoder": "0.10.31"
}
},
"string_decoder": {
@@ -17059,29 +15302,35 @@
"dev": true
},
"nan": {
- "version": "2.14.1",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
- "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
+ "version": "2.14.2",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
+ "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==",
"dev": true,
"optional": true
},
+ "nanoid": {
+ "version": "3.1.23",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
+ "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
+ "dev": true
+ },
"nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
"integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
"dev": true,
"requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.3",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
}
},
"natural-compare": {
@@ -17125,11 +15374,11 @@
"integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==",
"dev": true,
"requires": {
- "@sinonjs/formatio": "^3.2.1",
- "@sinonjs/text-encoding": "^0.7.1",
- "just-extend": "^4.0.2",
- "lolex": "^5.0.1",
- "path-to-regexp": "^1.7.0"
+ "@sinonjs/formatio": "3.2.2",
+ "@sinonjs/text-encoding": "0.7.1",
+ "just-extend": "4.2.1",
+ "lolex": "5.1.2",
+ "path-to-regexp": "1.8.0"
},
"dependencies": {
"@sinonjs/formatio": {
@@ -17138,8 +15387,8 @@
"integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==",
"dev": true,
"requires": {
- "@sinonjs/commons": "^1",
- "@sinonjs/samsam": "^3.1.0"
+ "@sinonjs/commons": "1.8.3",
+ "@sinonjs/samsam": "3.3.3"
}
},
"isarray": {
@@ -17154,7 +15403,7 @@
"integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==",
"dev": true,
"requires": {
- "@sinonjs/commons": "^1.7.0"
+ "@sinonjs/commons": "1.8.3"
}
},
"path-to-regexp": {
@@ -17168,10 +15417,10 @@
}
}
},
- "node-int64": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
"dev": true
},
"node-libs-browser": {
@@ -17180,29 +15429,29 @@
"integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
"dev": true,
"requires": {
- "assert": "^1.1.1",
- "browserify-zlib": "^0.2.0",
- "buffer": "^4.3.0",
- "console-browserify": "^1.1.0",
- "constants-browserify": "^1.0.0",
- "crypto-browserify": "^3.11.0",
- "domain-browser": "^1.1.1",
- "events": "^3.0.0",
- "https-browserify": "^1.0.0",
- "os-browserify": "^0.3.0",
+ "assert": "1.5.0",
+ "browserify-zlib": "0.2.0",
+ "buffer": "4.9.2",
+ "console-browserify": "1.2.0",
+ "constants-browserify": "1.0.0",
+ "crypto-browserify": "3.12.0",
+ "domain-browser": "1.2.0",
+ "events": "3.3.0",
+ "https-browserify": "1.0.0",
+ "os-browserify": "0.3.0",
"path-browserify": "0.0.1",
- "process": "^0.11.10",
- "punycode": "^1.2.4",
- "querystring-es3": "^0.2.0",
- "readable-stream": "^2.3.3",
- "stream-browserify": "^2.0.1",
- "stream-http": "^2.7.2",
- "string_decoder": "^1.0.0",
- "timers-browserify": "^2.0.4",
+ "process": "0.11.10",
+ "punycode": "1.4.1",
+ "querystring-es3": "0.2.1",
+ "readable-stream": "2.3.7",
+ "stream-browserify": "2.0.2",
+ "stream-http": "2.8.3",
+ "string_decoder": "1.3.0",
+ "timers-browserify": "2.0.12",
"tty-browserify": "0.0.0",
- "url": "^0.11.0",
- "util": "^0.11.0",
- "vm-browserify": "^1.0.1"
+ "url": "0.11.0",
+ "util": "0.11.1",
+ "vm-browserify": "1.1.2"
},
"dependencies": {
"buffer": {
@@ -17211,9 +15460,9 @@
"integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
"dev": true,
"requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
+ "base64-js": "1.5.1",
+ "ieee754": "1.2.1",
+ "isarray": "1.0.0"
}
},
"punycode": {
@@ -17228,48 +15477,32 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ },
+ "dependencies": {
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ }
}
}
}
},
- "node-modules-regexp": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
- "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
- "dev": true
- },
- "node-notifier": {
- "version": "5.4.3",
- "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz",
- "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==",
- "dev": true,
- "requires": {
- "growly": "^1.3.0",
- "is-wsl": "^1.1.0",
- "semver": "^5.5.0",
- "shellwords": "^0.1.1",
- "which": "^1.3.0"
- },
- "dependencies": {
- "is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
- "dev": true
- }
- }
- },
"node-releases": {
- "version": "1.1.60",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz",
- "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==",
+ "version": "1.1.73",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz",
+ "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==",
"dev": true
},
"nopt": {
@@ -17278,7 +15511,7 @@
"integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
"dev": true,
"requires": {
- "abbrev": "1"
+ "abbrev": "1.0.9"
}
},
"normalize-package-data": {
@@ -17287,126 +15520,56 @@
"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"dev": true,
"requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "normalize-url": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
- "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
- "dev": true
- },
- "now-and-later": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz",
- "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==",
- "dev": true,
- "requires": {
- "once": "^1.3.2"
- }
- },
- "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"
+ "hosted-git-info": "2.8.9",
+ "resolve": "1.20.0",
+ "semver": "5.7.1",
+ "validate-npm-package-license": "3.0.4"
},
"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"
- }
- },
- "load-json-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^4.0.0",
- "pify": "^3.0.0",
- "strip-bom": "^3.0.0"
- }
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
- "dev": true,
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
- "dev": true,
- "requires": {
- "pify": "^3.0.0"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- },
- "read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
- "dev": true,
- "requires": {
- "load-json-file": "^4.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^3.0.0"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
}
}
},
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "dev": true
+ },
+ "now-and-later": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz",
+ "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
"npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
"integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
"dev": true,
"requires": {
- "path-key": "^2.0.0"
+ "path-key": "2.0.1"
+ },
+ "dependencies": {
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ }
}
},
"null-check": {
@@ -17421,12 +15584,6 @@
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true
},
- "nwsapi": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
- "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
- "dev": true
- },
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@@ -17439,21 +15596,15 @@
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
- "object-component": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
- "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
- "dev": true
- },
"object-copy": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
"integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
"dev": true,
"requires": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
},
"dependencies": {
"define-property": {
@@ -17462,40 +15613,34 @@
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "^0.1.0"
+ "is-descriptor": "0.1.6"
}
},
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
},
"object-inspect": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
- "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
+ "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
"dev": true
},
"object-is": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
- "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
"dev": true,
"requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5"
+ "call-bind": "1.0.2",
+ "define-properties": "1.1.3"
}
},
"object-keys": {
@@ -17510,19 +15655,19 @@
"integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
"dev": true,
"requires": {
- "isobject": "^3.0.0"
+ "isobject": "3.0.1"
}
},
"object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
"dev": true,
"requires": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
+ "call-bind": "1.0.2",
+ "define-properties": "1.1.3",
+ "has-symbols": "1.0.2",
+ "object-keys": "1.1.1"
}
},
"object.defaults": {
@@ -17531,20 +15676,10 @@
"integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
"dev": true,
"requires": {
- "array-each": "^1.0.1",
- "array-slice": "^1.0.0",
- "for-own": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "object.getownpropertydescriptors": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
- "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
}
},
"object.map": {
@@ -17553,8 +15688,8 @@
"integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
"dev": true,
"requires": {
- "for-own": "^1.0.0",
- "make-iterator": "^1.0.0"
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
}
},
"object.omit": {
@@ -17563,8 +15698,8 @@
"integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
"dev": true,
"requires": {
- "for-own": "^0.1.4",
- "is-extendable": "^0.1.1"
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
},
"dependencies": {
"for-own": {
@@ -17573,7 +15708,7 @@
"integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
"dev": true,
"requires": {
- "for-in": "^1.0.1"
+ "for-in": "1.0.2"
}
}
}
@@ -17584,7 +15719,7 @@
"integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
"dev": true,
"requires": {
- "isobject": "^3.0.1"
+ "isobject": "3.0.1"
}
},
"object.reduce": {
@@ -17593,20 +15728,19 @@
"integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
"dev": true,
"requires": {
- "for-own": "^1.0.0",
- "make-iterator": "^1.0.0"
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
}
},
"object.values": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
- "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz",
+ "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==",
"dev": true,
"requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3"
+ "call-bind": "1.0.2",
+ "define-properties": "1.1.3",
+ "es-abstract": "1.18.3"
}
},
"on-finished": {
@@ -17629,22 +15763,22 @@
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
- "wrappy": "1"
+ "wrappy": "1.0.2"
}
},
"onetime": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
- "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"dev": true,
"requires": {
- "mimic-fn": "^2.1.0"
+ "mimic-fn": "2.1.0"
}
},
"opener": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz",
- "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==",
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
+ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
"dev": true
},
"opn": {
@@ -17653,7 +15787,7 @@
"integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
"dev": true,
"requires": {
- "is-wsl": "^1.1.0"
+ "is-wsl": "1.1.0"
},
"dependencies": {
"is-wsl": {
@@ -17670,8 +15804,8 @@
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
"dev": true,
"requires": {
- "minimist": "~0.0.1",
- "wordwrap": "~0.0.2"
+ "minimist": "0.0.10",
+ "wordwrap": "0.0.3"
},
"dependencies": {
"minimist": {
@@ -17689,17 +15823,85 @@
}
},
"optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.4.1",
+ "prelude-ls": "1.2.1",
+ "type-check": "0.4.0",
+ "word-wrap": "1.2.3"
+ }
+ },
+ "ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
"dev": true,
"requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
+ "bl": "4.1.0",
+ "chalk": "4.1.1",
+ "cli-cursor": "3.1.0",
+ "cli-spinners": "2.6.0",
+ "is-interactive": "1.0.0",
+ "is-unicode-supported": "0.1.0",
+ "log-symbols": "4.1.0",
+ "strip-ansi": "6.0.0",
+ "wcwidth": "1.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "4.0.0"
+ }
+ }
}
},
"ordered-read-streams": {
@@ -17708,7 +15910,7 @@
"integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
"dev": true,
"requires": {
- "readable-stream": "^2.0.1"
+ "readable-stream": "2.3.7"
},
"dependencies": {
"readable-stream": {
@@ -17717,13 +15919,22 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
@@ -17734,55 +15945,13 @@
"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
"dev": true
},
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
- "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": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
"dev": true,
"requires": {
- "execa": "^0.7.0",
- "lcid": "^1.0.0",
- "mem": "^1.1.0"
- },
- "dependencies": {
- "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"
- }
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
- "dev": true
- }
+ "lcid": "1.0.0"
}
},
"os-tmpdir": {
@@ -17792,39 +15961,24 @@
"dev": true
},
"p-cancelable": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz",
- "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
+ "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
"dev": true
},
- "p-each-series": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz",
- "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=",
- "dev": true,
- "requires": {
- "p-reduce": "^1.0.0"
- }
- },
"p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
"dev": true
},
- "p-is-promise": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
- "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
- "dev": true
- },
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
- "p-try": "^2.0.0"
+ "p-try": "2.2.0"
}
},
"p-locate": {
@@ -17833,22 +15987,7 @@
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
- "p-limit": "^2.2.0"
- }
- },
- "p-reduce": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
- "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
- "dev": true
- },
- "p-timeout": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
- "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
- "dev": true,
- "requires": {
- "p-finally": "^1.0.0"
+ "p-limit": "2.3.0"
}
},
"p-try": {
@@ -17863,218 +16002,40 @@
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
"dev": true
},
- "parents": {
+ "parent-module": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
- "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
"requires": {
- "path-platform": "~0.11.15"
+ "callsites": "3.1.0"
}
},
"parse-asn1": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
- "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
- "dev": true,
- "requires": {
- "asn1.js": "^4.0.0",
- "browserify-aes": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.0",
- "pbkdf2": "^3.0.3",
- "safe-buffer": "^5.1.1"
- }
- },
- "parse-domain": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/parse-domain/-/parse-domain-2.3.4.tgz",
- "integrity": "sha512-LlFJJVTry4DD3Xa76CsVNP6MIu3JZ8GXd5HEEp38KSDGBCVsnccagAJ5YLy7uEEabvwtauQEQPcvXWgUGkJbMA==",
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
"dev": true,
"requires": {
- "got": "^8.3.2",
- "jest": "^24.9.0",
- "mkdirp": "^0.5.1",
- "npm-run-all": "^4.1.5"
- },
- "dependencies": {
- "@sindresorhus/is": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
- "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==",
- "dev": true
- },
- "cacheable-request": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
- "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=",
- "dev": true,
- "requires": {
- "clone-response": "1.0.2",
- "get-stream": "3.0.0",
- "http-cache-semantics": "3.8.1",
- "keyv": "3.0.0",
- "lowercase-keys": "1.0.0",
- "normalize-url": "2.0.1",
- "responselike": "1.0.2"
- },
- "dependencies": {
- "lowercase-keys": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
- "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
- "dev": true
- }
- }
- },
- "decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
- "dev": true,
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
- "dev": true
- },
- "got": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
- "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==",
- "dev": true,
- "requires": {
- "@sindresorhus/is": "^0.7.0",
- "cacheable-request": "^2.1.1",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^3.0.0",
- "into-stream": "^3.1.0",
- "is-retry-allowed": "^1.1.0",
- "isurl": "^1.0.0-alpha5",
- "lowercase-keys": "^1.0.0",
- "mimic-response": "^1.0.0",
- "p-cancelable": "^0.4.0",
- "p-timeout": "^2.0.1",
- "pify": "^3.0.0",
- "safe-buffer": "^5.1.1",
- "timed-out": "^4.0.1",
- "url-parse-lax": "^3.0.0",
- "url-to-options": "^1.0.1"
- }
- },
- "http-cache-semantics": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
- "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
- "dev": true
- },
- "json-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
- "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
- "dev": true
- },
- "keyv": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
- "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
- "dev": true,
- "requires": {
- "json-buffer": "3.0.0"
- }
- },
- "lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
- "dev": true
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "normalize-url": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
- "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
- "dev": true,
- "requires": {
- "prepend-http": "^2.0.0",
- "query-string": "^5.0.1",
- "sort-keys": "^2.0.0"
- }
- },
- "p-cancelable": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
- "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==",
- "dev": true
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- },
- "prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
- "dev": true
- },
- "query-string": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
- "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
- "dev": true,
- "requires": {
- "decode-uri-component": "^0.2.0",
- "object-assign": "^4.1.0",
- "strict-uri-encode": "^1.0.0"
- }
- },
- "responselike": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
- "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
- "dev": true,
- "requires": {
- "lowercase-keys": "^1.0.0"
- }
- },
- "sort-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
- "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
- "dev": true,
- "requires": {
- "is-plain-obj": "^1.0.0"
- }
- }
+ "asn1.js": "5.4.1",
+ "browserify-aes": "1.2.0",
+ "evp_bytestokey": "1.0.3",
+ "pbkdf2": "3.1.2",
+ "safe-buffer": "5.1.2"
}
},
"parse-entities": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz",
- "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
"dev": true,
"requires": {
- "character-entities": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "character-reference-invalid": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
+ "character-entities": "1.2.4",
+ "character-entities-legacy": "1.1.4",
+ "character-reference-invalid": "1.1.4",
+ "is-alphanumerical": "1.0.4",
+ "is-decimal": "1.0.4",
+ "is-hexadecimal": "1.0.4"
}
},
"parse-filepath": {
@@ -18083,19 +16044,16 @@
"integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
"dev": true,
"requires": {
- "is-absolute": "^1.0.0",
- "map-cache": "^0.2.0",
- "path-root": "^0.1.1"
+ "is-absolute": "1.0.0",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
}
},
- "parse-git-config": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-0.2.0.tgz",
- "integrity": "sha1-Jygz/dFf6hRvt10zbSNrljtv9wY=",
- "dev": true,
- "requires": {
- "ini": "^1.3.3"
- }
+ "parse-github-repo-url": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz",
+ "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=",
+ "dev": true
},
"parse-glob": {
"version": "3.0.4",
@@ -18103,10 +16061,10 @@
"integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
"dev": true,
"requires": {
- "glob-base": "^0.3.0",
- "is-dotfile": "^1.0.0",
- "is-extglob": "^1.0.0",
- "is-glob": "^2.0.0"
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
},
"dependencies": {
"is-extglob": {
@@ -18121,7 +16079,7 @@
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
"requires": {
- "is-extglob": "^1.0.0"
+ "is-extglob": "1.0.0"
}
}
}
@@ -18132,7 +16090,7 @@
"integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
"dev": true,
"requires": {
- "error-ex": "^1.2.0"
+ "error-ex": "1.3.2"
}
},
"parse-ms": {
@@ -18154,63 +16112,46 @@
"dev": true
},
"parse-path": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-3.0.4.tgz",
- "integrity": "sha512-wP70vtwv2DyrM2YoA7ZHVv4zIXa4P7dGgHlj+VwyXNDduLLVJ7NMY1zsFxjUUJ3DAwJLupGb1H5gMDDiNlJaxw==",
- "dev": true,
- "requires": {
- "is-ssh": "^1.3.0",
- "protocols": "^1.4.0"
- }
- },
- "parse-url": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-3.0.2.tgz",
- "integrity": "sha1-YCeHpwY6eV1yuGcxl1BecvYGEL4=",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.3.tgz",
+ "integrity": "sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==",
"dev": true,
"requires": {
- "is-ssh": "^1.3.0",
- "normalize-url": "^1.9.1",
- "parse-path": "^3.0.1",
- "protocols": "^1.4.0"
+ "is-ssh": "1.3.3",
+ "protocols": "1.4.8",
+ "qs": "6.10.1",
+ "query-string": "6.14.1"
},
"dependencies": {
- "normalize-url": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
- "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+ "qs": {
+ "version": "6.10.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz",
+ "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==",
"dev": true,
"requires": {
- "object-assign": "^4.0.1",
- "prepend-http": "^1.0.0",
- "query-string": "^4.1.0",
- "sort-keys": "^1.0.0"
+ "side-channel": "1.0.4"
}
}
}
},
- "parse5": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
- "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
- "dev": true
- },
- "parseqs": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
- "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
- "dev": true,
- "requires": {
- "better-assert": "~1.0.0"
- }
- },
- "parseuri": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
- "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+ "parse-url": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.5.tgz",
+ "integrity": "sha512-AwfVhXaQrNNI6UPUJq/GJN2qoY0L9gPgxhh9VbDP0bfBAJWaC/Zh8hjQ58YKTi4AagOT70fpadkYSKPo+eFb1w==",
"dev": true,
"requires": {
- "better-assert": "~1.0.0"
+ "is-ssh": "1.3.3",
+ "normalize-url": "4.5.0",
+ "parse-path": "4.0.3",
+ "protocols": "1.4.8"
+ },
+ "dependencies": {
+ "normalize-url": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
+ "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
+ "dev": true
+ }
}
},
"parseurl": {
@@ -18255,21 +16196,15 @@
"dev": true
},
"path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true
},
"path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
- "dev": true
- },
- "path-platform": {
- "version": "0.11.15",
- "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
- "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"path-root": {
@@ -18278,7 +16213,7 @@
"integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
"dev": true,
"requires": {
- "path-root-regex": "^0.1.0"
+ "path-root-regex": "0.1.2"
}
},
"path-root-regex": {
@@ -18298,15 +16233,15 @@
"integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
+ "graceful-fs": "4.2.6",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
}
},
"pathval": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
- "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
"dev": true
},
"pause-stream": {
@@ -18315,20 +16250,20 @@
"integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
"dev": true,
"requires": {
- "through": "~2.3"
+ "through": "2.3.8"
}
},
"pbkdf2": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
- "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
"dev": true,
"requires": {
- "create-hash": "^1.1.2",
- "create-hmac": "^1.1.4",
- "ripemd160": "^2.0.1",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
+ "create-hash": "1.2.0",
+ "create-hmac": "1.1.7",
+ "ripemd160": "2.0.2",
+ "safe-buffer": "5.1.2",
+ "sha.js": "2.4.11"
}
},
"pbkdf2-compat": {
@@ -18350,15 +16285,9 @@
"dev": true
},
"picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
- "dev": true
- },
- "pidtree": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
- "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
"dev": true
},
"pify": {
@@ -18379,16 +16308,7 @@
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"dev": true,
"requires": {
- "pinkie": "^2.0.0"
- }
- },
- "pirates": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
- "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
- "dev": true,
- "requires": {
- "node-modules-regexp": "^1.0.0"
+ "pinkie": "2.0.4"
}
},
"pkg-dir": {
@@ -18397,7 +16317,67 @@
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"dev": true,
"requires": {
- "find-up": "^4.0.0"
+ "find-up": "4.1.0"
+ }
+ },
+ "pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
+ "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
+ "dev": true,
+ "requires": {
+ "find-up": "2.1.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "requires": {
+ "p-try": "1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "1.3.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ }
}
},
"plugin-error": {
@@ -18406,10 +16386,10 @@
"integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
"dev": true,
"requires": {
- "ansi-colors": "^1.0.1",
- "arr-diff": "^4.0.0",
- "arr-union": "^3.1.0",
- "extend-shallow": "^3.0.2"
+ "ansi-colors": "1.1.0",
+ "arr-diff": "4.0.0",
+ "arr-union": "3.1.0",
+ "extend-shallow": "3.0.2"
},
"dependencies": {
"ansi-colors": {
@@ -18418,7 +16398,7 @@
"integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
"dev": true,
"requires": {
- "ansi-wrap": "^0.1.0"
+ "ansi-wrap": "0.1.0"
}
}
}
@@ -18429,28 +16409,101 @@
"integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
"dev": true
},
- "pn": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
- "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
- "dev": true
- },
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
"integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
"dev": true
},
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
+ "postcss": {
+ "version": "8.3.5",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz",
+ "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "colorette": "1.2.2",
+ "nanoid": "3.1.23",
+ "source-map-js": "0.6.2"
+ }
},
- "prepend-http": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
- "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "postcss-modules": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.1.3.tgz",
+ "integrity": "sha512-dBT39hrXe4OAVYJe/2ZuIZ9BzYhOe7t+IhedYeQ2OxKwDpAGlkEN/fR0fGnrbx4BvgbMReRX4hCubYK9cE/pJQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "generic-names": "2.0.1",
+ "icss-replace-symbols": "1.1.0",
+ "lodash.camelcase": "4.3.0",
+ "postcss-modules-extract-imports": "3.0.0",
+ "postcss-modules-local-by-default": "4.0.0",
+ "postcss-modules-scope": "3.0.0",
+ "postcss-modules-values": "4.0.0",
+ "string-hash": "1.1.3"
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+ "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+ "dev": true,
+ "optional": true
+ },
+ "postcss-modules-local-by-default": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+ "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "icss-utils": "5.1.0",
+ "postcss-selector-parser": "6.0.6",
+ "postcss-value-parser": "4.1.0"
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+ "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "postcss-selector-parser": "6.0.6"
+ }
+ },
+ "postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "icss-utils": "5.1.0"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
+ "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
+ "dev": true,
+ "requires": {
+ "cssesc": "3.0.0",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+ "dev": true,
+ "optional": true
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true
},
"preserve": {
@@ -18460,40 +16513,21 @@
"dev": true
},
"pretty-format": {
- "version": "26.1.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz",
- "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==",
+ "version": "27.0.2",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.2.tgz",
+ "integrity": "sha512-mXKbbBPnYTG7Yra9qFBtqj+IXcsvxsvOBco3QHxtxTl+hHKq6QdzMZ+q0CtL4ORHZgwGImRr2XZUX2EWzORxig==",
"dev": true,
"requires": {
- "@jest/types": "^26.1.0",
- "ansi-regex": "^5.0.0",
- "ansi-styles": "^4.0.0",
- "react-is": "^16.12.0"
+ "@jest/types": "27.0.2",
+ "ansi-regex": "5.0.0",
+ "ansi-styles": "5.2.0",
+ "react-is": "17.0.2"
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true
}
}
@@ -18505,18 +16539,18 @@
"dev": true
},
"pretty-ms": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.0.tgz",
- "integrity": "sha512-J3aPWiC5e9ZeZFuSeBraGxSkGMOvulSWsxDByOcbD1Pr75YL3LSNIKIb52WXbCLE1sS5s4inBBbryjF4Y05Ceg==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz",
+ "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==",
"dev": true,
"requires": {
- "parse-ms": "^2.1.0"
+ "parse-ms": "2.1.0"
}
},
- "private": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "printj": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
+ "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==",
"dev": true
},
"process": {
@@ -18537,47 +16571,27 @@
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true
},
- "promise.allsettled": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz",
- "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==",
- "dev": true,
- "requires": {
- "array.prototype.map": "^1.0.1",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1",
- "iterate-value": "^1.0.0"
- }
- },
- "prompts": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz",
- "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==",
+ "property-information": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
+ "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
"dev": true,
"requires": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.4"
+ "xtend": "4.0.2"
}
},
- "property-information": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-3.2.0.tgz",
- "integrity": "sha1-/RSDyPusYYCPX+NZ52k6H0ilgzE=",
- "dev": true
- },
"protocols": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz",
- "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==",
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz",
+ "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==",
"dev": true
},
"proxy-addr": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
- "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"requires": {
- "forwarded": "~0.1.2",
+ "forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
}
},
@@ -18599,7 +16613,7 @@
"integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==",
"dev": true,
"requires": {
- "event-stream": "=3.3.4"
+ "event-stream": "3.3.4"
}
},
"pseudomap": {
@@ -18620,18 +16634,18 @@
"integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
"dev": true,
"requires": {
- "bn.js": "^4.1.0",
- "browserify-rsa": "^4.0.0",
- "create-hash": "^1.1.0",
- "parse-asn1": "^5.0.0",
- "randombytes": "^2.0.1",
- "safe-buffer": "^5.1.2"
+ "bn.js": "4.12.0",
+ "browserify-rsa": "4.1.0",
+ "create-hash": "1.2.0",
+ "parse-asn1": "5.1.6",
+ "randombytes": "2.1.0",
+ "safe-buffer": "5.1.2"
},
"dependencies": {
"bn.js": {
- "version": "4.11.9",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
- "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
"dev": true
}
}
@@ -18642,8 +16656,8 @@
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
+ "end-of-stream": "1.4.4",
+ "once": "1.4.0"
}
},
"pumpify": {
@@ -18652,9 +16666,9 @@
"integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
"dev": true,
"requires": {
- "duplexify": "^3.6.0",
- "inherits": "^2.0.3",
- "pump": "^2.0.0"
+ "duplexify": "3.7.1",
+ "inherits": "2.0.3",
+ "pump": "2.0.1"
},
"dependencies": {
"pump": {
@@ -18663,8 +16677,8 @@
"integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
"dev": true,
"requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
+ "end-of-stream": "1.4.4",
+ "once": "1.4.0"
}
}
}
@@ -18676,40 +16690,59 @@
"dev": true
},
"puppeteer-core": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-5.2.1.tgz",
- "integrity": "sha512-gLjEOrzwgcnwRH+sm4hS1TBqe2/DN248nRb2hYB7+lZ9kCuLuACNvuzlXILlPAznU3Ob+mEvVEBDcLuFa0zq3g==",
- "dev": true,
- "requires": {
- "debug": "^4.1.0",
- "devtools-protocol": "0.0.781568",
- "extract-zip": "^2.0.0",
- "https-proxy-agent": "^4.0.0",
- "mime": "^2.0.3",
- "pkg-dir": "^4.2.0",
- "progress": "^2.0.1",
- "proxy-from-env": "^1.0.0",
- "rimraf": "^3.0.2",
- "tar-fs": "^2.0.0",
- "unbzip2-stream": "^1.3.3",
- "ws": "^7.2.3"
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-9.1.1.tgz",
+ "integrity": "sha512-zbedbitVIGhmgz0nt7eIdLsnaoVZSlNJfBivqm2w67T8LR2bU1dvnruDZ8nQO0zn++Iet7zHbAOdnuS5+H2E7A==",
+ "dev": true,
+ "requires": {
+ "debug": "4.3.1",
+ "devtools-protocol": "0.0.869402",
+ "extract-zip": "2.0.1",
+ "https-proxy-agent": "5.0.0",
+ "node-fetch": "2.6.1",
+ "pkg-dir": "4.2.0",
+ "progress": "2.0.3",
+ "proxy-from-env": "1.1.0",
+ "rimraf": "3.0.2",
+ "tar-fs": "2.1.1",
+ "unbzip2-stream": "1.4.3",
+ "ws": "7.5.0"
},
"dependencies": {
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "requires": {
+ "debug": "4.3.1"
+ }
+ },
"debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.2"
}
},
- "mime": {
- "version": "2.4.6",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
- "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+ "devtools-protocol": {
+ "version": "0.0.869402",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.869402.tgz",
+ "integrity": "sha512-VvlVYY+VDJe639yHs5PHISzdWTLL3Aw8rO4cvUtwvoxFd6FHbE4OpHHcde52M6096uYYazAmd4l0o5VuFRO2WA==",
"dev": true
},
+ "https-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "dev": true,
+ "requires": {
+ "agent-base": "6.0.2",
+ "debug": "4.3.1"
+ }
+ },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -18722,7 +16755,7 @@
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
- "glob": "^7.1.3"
+ "glob": "7.1.7"
}
}
}
@@ -18744,14 +16777,22 @@
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
},
+ "query-selector-shadow-dom": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.0.tgz",
+ "integrity": "sha512-bK0/0cCI+R8ZmOF1QjT7HupDUYCxbf/9TJgAmSXQxZpftXmTAeil9DRoCnTDkWbvOyZzhcMBwKpptWcdkGFIMg==",
+ "dev": true
+ },
"query-string": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
- "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+ "version": "6.14.1",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz",
+ "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==",
"dev": true,
"requires": {
- "object-assign": "^4.1.0",
- "strict-uri-encode": "^1.0.0"
+ "decode-uri-component": "0.2.0",
+ "filter-obj": "1.1.0",
+ "split-on-first": "1.1.0",
+ "strict-uri-encode": "2.0.0"
}
},
"querystring": {
@@ -18784,9 +16825,9 @@
"integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
"dev": true,
"requires": {
- "is-number": "^4.0.0",
- "kind-of": "^6.0.0",
- "math-random": "^1.0.1"
+ "is-number": "4.0.0",
+ "kind-of": "6.0.3",
+ "math-random": "1.0.4"
},
"dependencies": {
"is-number": {
@@ -18803,7 +16844,7 @@
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
"requires": {
- "safe-buffer": "^5.1.0"
+ "safe-buffer": "5.1.2"
}
},
"randomfill": {
@@ -18812,8 +16853,8 @@
"integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
"dev": true,
"requires": {
- "randombytes": "^2.0.5",
- "safe-buffer": "^5.1.0"
+ "randombytes": "2.1.0",
+ "safe-buffer": "5.1.2"
}
},
"range-parser": {
@@ -18833,9 +16874,9 @@
}
},
"react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
"dev": true
},
"read-pkg": {
@@ -18844,9 +16885,9 @@
"integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
"dev": true,
"requires": {
- "load-json-file": "^1.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^1.0.0"
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.5.0",
+ "path-type": "1.1.0"
}
},
"read-pkg-up": {
@@ -18855,8 +16896,8 @@
"integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
"dev": true,
"requires": {
- "find-up": "^1.0.0",
- "read-pkg": "^1.0.0"
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
},
"dependencies": {
"find-up": {
@@ -18865,8 +16906,8 @@
"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
"dev": true,
"requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
}
},
"path-exists": {
@@ -18875,7 +16916,7 @@
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
"dev": true,
"requires": {
- "pinkie-promise": "^2.0.0"
+ "pinkie-promise": "2.0.1"
}
}
}
@@ -18886,27 +16927,27 @@
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"dev": true,
"requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
+ "inherits": "2.0.3",
+ "string_decoder": "1.3.0",
+ "util-deprecate": "1.0.2"
}
},
- "readdirp": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
- "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+ "readdir-glob": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz",
+ "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==",
"dev": true,
"requires": {
- "picomatch": "^2.2.1"
+ "minimatch": "3.0.4"
}
},
- "realpath-native": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz",
- "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==",
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"requires": {
- "util.promisify": "^1.0.0"
+ "picomatch": "2.3.0"
}
},
"rechoir": {
@@ -18915,7 +16956,7 @@
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
"dev": true,
"requires": {
- "resolve": "^1.1.6"
+ "resolve": "1.20.0"
}
},
"recursive-readdir": {
@@ -18928,30 +16969,27 @@
}
},
"redent": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
- "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
"dev": true,
"requires": {
- "indent-string": "^2.1.0",
- "strip-indent": "^1.0.1"
+ "indent-string": "4.0.0",
+ "strip-indent": "3.0.0"
},
"dependencies": {
"indent-string": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
- "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
- "dev": true,
- "requires": {
- "repeating": "^2.0.0"
- }
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
}
}
},
"regenerate": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
- "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==",
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
"dev": true
},
"regenerate-unicode-properties": {
@@ -18960,7 +16998,7 @@
"integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
"dev": true,
"requires": {
- "regenerate": "^1.4.0"
+ "regenerate": "1.4.2"
}
},
"regenerator-runtime": {
@@ -18974,7 +17012,7 @@
"integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
"dev": true,
"requires": {
- "@babel/runtime": "^7.8.4"
+ "@babel/runtime": "7.14.6"
}
},
"regex-cache": {
@@ -18983,7 +17021,7 @@
"integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
"dev": true,
"requires": {
- "is-equal-shallow": "^0.1.3"
+ "is-equal-shallow": "0.1.3"
}
},
"regex-not": {
@@ -18992,38 +17030,38 @@
"integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
"dev": true,
"requires": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
}
},
"regexp.prototype.flags": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
- "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
+ "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
"dev": true,
"requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
+ "call-bind": "1.0.2",
+ "define-properties": "1.1.3"
}
},
"regexpp": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
- "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true
},
"regexpu-core": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
- "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==",
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
+ "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
"dev": true,
"requires": {
- "regenerate": "^1.4.0",
- "regenerate-unicode-properties": "^8.2.0",
- "regjsgen": "^0.5.1",
- "regjsparser": "^0.6.4",
- "unicode-match-property-ecmascript": "^1.0.4",
- "unicode-match-property-value-ecmascript": "^1.2.0"
+ "regenerate": "1.4.2",
+ "regenerate-unicode-properties": "8.2.0",
+ "regjsgen": "0.5.2",
+ "regjsparser": "0.6.9",
+ "unicode-match-property-ecmascript": "1.0.4",
+ "unicode-match-property-value-ecmascript": "1.2.0"
}
},
"regjsgen": {
@@ -19033,12 +17071,12 @@
"dev": true
},
"regjsparser": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
- "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
+ "version": "0.6.9",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz",
+ "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==",
"dev": true,
"requires": {
- "jsesc": "~0.5.0"
+ "jsesc": "0.5.0"
},
"dependencies": {
"jsesc": {
@@ -19050,110 +17088,72 @@
}
},
"remark": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/remark/-/remark-9.0.0.tgz",
- "integrity": "sha512-amw8rGdD5lHbMEakiEsllmkdBP+/KpjW/PRK6NSGPZKCQowh0BT4IWXDAkRMyG3SB9dKPXWMviFjNusXzXNn3A==",
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
+ "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
"dev": true,
"requires": {
- "remark-parse": "^5.0.0",
- "remark-stringify": "^5.0.0",
- "unified": "^6.0.0"
+ "remark-parse": "9.0.0",
+ "remark-stringify": "9.0.1",
+ "unified": "9.2.1"
}
},
- "remark-html": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/remark-html/-/remark-html-7.0.0.tgz",
- "integrity": "sha512-jqRzkZXCkM12gIY2ibMLTW41m7rfanliMTVQCFTezHJFsbH00YaTox/BX4gU+f/zCdzfhFJONtebFByvpMv37w==",
+ "remark-gfm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz",
+ "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==",
"dev": true,
"requires": {
- "hast-util-sanitize": "^1.0.0",
- "hast-util-to-html": "^3.0.0",
- "mdast-util-to-hast": "^3.0.0",
- "xtend": "^4.0.1"
- }
- },
- "remark-parse": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz",
- "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==",
- "dev": true,
- "requires": {
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^1.1.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^1.0.0",
- "vfile-location": "^2.0.0",
- "xtend": "^4.0.1"
+ "mdast-util-gfm": "0.1.2",
+ "micromark-extension-gfm": "0.3.3"
}
},
- "remark-reference-links": {
- "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==",
+ "remark-html": {
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/remark-html/-/remark-html-13.0.1.tgz",
+ "integrity": "sha512-K5KQCXWVz+harnyC+UVM/J9eJWCgjYRqFeZoZf2NgP0iFbuuw/RgMZv3MA34b/OEpGnstl3oiOUtZzD3tJ+CBw==",
"dev": true,
"requires": {
- "unist-util-visit": "^1.0.0"
+ "hast-util-sanitize": "3.0.2",
+ "hast-util-to-html": "7.1.3",
+ "mdast-util-to-hast": "10.2.0"
}
},
- "remark-slug": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-5.1.2.tgz",
- "integrity": "sha512-DWX+Kd9iKycqyD+/B+gEFO3jjnt7Yg1O05lygYSNTe5i5PIxxxPjp5qPBDxPIzp5wreF7+1ROCwRgjEcqmzr3A==",
+ "remark-parse": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
"dev": true,
"requires": {
- "github-slugger": "^1.0.0",
- "mdast-util-to-string": "^1.0.0",
- "unist-util-visit": "^1.0.0"
+ "mdast-util-from-markdown": "0.8.5"
}
},
- "remark-stringify": {
+ "remark-reference-links": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-5.0.0.tgz",
- "integrity": "sha512-Ws5MdA69ftqQ/yhRF9XhVV29mhxbfGhbz0Rx5bQH+oJcNhhSM6nCu1EpLod+DjrFGrU0BMPs+czVmJZU7xiS7w==",
- "dev": true,
- "requires": {
- "ccount": "^1.0.0",
- "is-alphanumeric": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "longest-streak": "^2.0.1",
- "markdown-escapes": "^1.0.0",
- "markdown-table": "^1.1.0",
- "mdast-util-compact": "^1.0.0",
- "parse-entities": "^1.0.2",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "stringify-entities": "^1.0.1",
- "unherit": "^1.0.4",
- "xtend": "^4.0.1"
+ "resolved": "https://registry.npmjs.org/remark-reference-links/-/remark-reference-links-5.0.0.tgz",
+ "integrity": "sha512-oSIo6lfDyG/1yYl2jPZNXmD9dgyPxp07mSd7snJagVMsDU6NRlD8i54MwHWUgMoOHTs8lIKPkwaUok/tbr5syQ==",
+ "dev": true,
+ "requires": {
+ "unist-util-visit": "2.0.3"
}
},
- "remark-toc": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/remark-toc/-/remark-toc-5.1.1.tgz",
- "integrity": "sha512-vCPW4YOsm2CfyuScdktM9KDnJXVHJsd/ZeRtst+dnBU3B3KKvt8bc+bs5syJjyptAHfqo7H+5Uhz+2blWBfwow==",
+ "remark-stringify": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz",
+ "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==",
"dev": true,
"requires": {
- "mdast-util-toc": "^3.0.0",
- "remark-slug": "^5.0.0"
+ "mdast-util-to-markdown": "0.6.5"
}
},
- "remote-origin-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-0.4.0.tgz",
- "integrity": "sha1-TT4pAvNOLTfRwmPYdxC3frQIajA=",
+ "remark-toc": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/remark-toc/-/remark-toc-7.2.0.tgz",
+ "integrity": "sha512-ppHepvpbg7j5kPFmU5rzDC4k2GTcPDvWcxXyr/7BZzO1cBSPk0stKtEJdsgAyw2WHKPGxadcHIZRjb2/sHxjkg==",
"dev": true,
"requires": {
- "parse-git-config": "^0.2.0"
+ "@types/unist": "2.0.3",
+ "mdast-util-toc": "5.1.0"
}
},
"remove-bom-buffer": {
@@ -19162,29 +17162,57 @@
"integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5",
- "is-utf8": "^0.2.1"
+ "is-buffer": "1.1.6",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "remove-bom-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
+ "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
+ "dev": true,
+ "requires": {
+ "remove-bom-buffer": "3.0.0",
+ "safe-buffer": "5.1.2",
+ "through2": "2.0.5"
},
"dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
+ }
}
}
},
- "remove-bom-stream": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
- "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
- "dev": true,
- "requires": {
- "remove-bom-buffer": "^3.0.0",
- "safe-buffer": "^5.1.0",
- "through2": "^2.0.3"
- }
- },
"remove-trailing-separator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
@@ -19192,9 +17220,9 @@
"dev": true
},
"repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
+ "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
"dev": true
},
"repeat-string": {
@@ -19209,13 +17237,13 @@
"integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
"dev": true,
"requires": {
- "is-finite": "^1.0.0"
+ "is-finite": "1.1.0"
}
},
"replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
+ "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
"dev": true
},
"replace-homedir": {
@@ -19224,9 +17252,9 @@
"integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
"dev": true,
"requires": {
- "homedir-polyfill": "^1.0.1",
- "is-absolute": "^1.0.0",
- "remove-trailing-separator": "^1.1.0"
+ "homedir-polyfill": "1.0.3",
+ "is-absolute": "1.0.0",
+ "remove-trailing-separator": "1.1.0"
}
},
"replacestream": {
@@ -19235,9 +17263,9 @@
"integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==",
"dev": true,
"requires": {
- "escape-string-regexp": "^1.0.3",
- "object-assign": "^4.0.1",
- "readable-stream": "^2.0.2"
+ "escape-string-regexp": "1.0.5",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.7"
},
"dependencies": {
"readable-stream": {
@@ -19246,13 +17274,22 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
@@ -19263,26 +17300,26 @@
"integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"dev": true,
"requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
+ "aws-sign2": "0.7.0",
+ "aws4": "1.11.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.8",
+ "extend": "3.0.2",
+ "forever-agent": "0.6.1",
+ "form-data": "2.3.3",
+ "har-validator": "5.1.5",
+ "http-signature": "1.2.0",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.31",
+ "oauth-sign": "0.9.0",
+ "performance-now": "2.1.0",
+ "qs": "6.5.2",
+ "safe-buffer": "5.1.2",
+ "tough-cookie": "2.5.0",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.4.0"
},
"dependencies": {
"qs": {
@@ -19299,32 +17336,18 @@
}
}
},
- "request-promise-core": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
- "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.19"
- }
- },
- "request-promise-native": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
- "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
- "dev": true,
- "requires": {
- "request-promise-core": "1.1.4",
- "stealthy-require": "^1.1.1",
- "tough-cookie": "^2.3.3"
- }
- },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
"dev": true
},
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
+ },
"require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
@@ -19337,8 +17360,8 @@
"integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
"dev": true,
"requires": {
- "caller-path": "^0.1.0",
- "resolve-from": "^1.0.0"
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
},
"dependencies": {
"resolve-from": {
@@ -19356,45 +17379,29 @@
"dev": true
},
"resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
"dev": true,
"requires": {
- "path-parse": "^1.0.6"
+ "is-core-module": "2.4.0",
+ "path-parse": "1.0.7"
}
},
"resolve-alpn": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.0.0.tgz",
- "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.1.2.tgz",
+ "integrity": "sha512-8OyfzhAtA32LVUsJSke3auIyINcwdh5l3cvYKdKO0nvsYSKuiLfTM5i78PJswFPT8y6cPW+L1v6/hE95chcpDA==",
"dev": true
},
- "resolve-cwd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
- "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
- "dev": true,
- "requires": {
- "resolve-from": "^3.0.0"
- },
- "dependencies": {
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
- "dev": true
- }
- }
- },
"resolve-dir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
"integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
"dev": true,
"requires": {
- "expand-tilde": "^2.0.0",
- "global-modules": "^1.0.0"
+ "expand-tilde": "2.0.2",
+ "global-modules": "1.0.0"
}
},
"resolve-from": {
@@ -19409,7 +17416,7 @@
"integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
"dev": true,
"requires": {
- "value-or-function": "^3.0.0"
+ "value-or-function": "3.0.0"
}
},
"resolve-url": {
@@ -19424,16 +17431,16 @@
"integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
"dev": true,
"requires": {
- "lowercase-keys": "^2.0.0"
+ "lowercase-keys": "2.0.0"
}
},
"resq": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/resq/-/resq-1.7.1.tgz",
- "integrity": "sha512-09u9Q5SAuJfAW5UoVAmvRtLvCOMaKP+djiixTXsZvPaojGKhuvc0Nfvp84U1rIfopJWEOXi5ywpCFwCk7mj8Xw==",
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/resq/-/resq-1.10.0.tgz",
+ "integrity": "sha512-hCUd0xMalqtPDz4jXIqs0M5Wnv/LZXN8h7unFOo4/nvExT9dDPbhwd3udRxLlp0HgBnHcV009UlduE9NZi7A6w==",
"dev": true,
"requires": {
- "fast-deep-equal": "^2.0.1"
+ "fast-deep-equal": "2.0.1"
},
"dependencies": {
"fast-deep-equal": {
@@ -19450,8 +17457,8 @@
"integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
"dev": true,
"requires": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
+ "onetime": "5.1.2",
+ "signal-exit": "3.0.3"
}
},
"ret": {
@@ -19461,15 +17468,15 @@
"dev": true
},
"rfdc": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz",
- "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
"dev": true
},
"rgb2hex": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.0.tgz",
- "integrity": "sha512-cHdNTwmTMPu/TpP1bJfdApd6MbD+Kzi4GNnM6h35mdFChhQPSi9cAI8J7DMn5kQDKX8NuBaQXAyo360Oa7tOEA==",
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz",
+ "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==",
"dev": true
},
"right-align": {
@@ -19478,7 +17485,7 @@
"integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
"dev": true,
"requires": {
- "align-text": "^0.1.1"
+ "align-text": "0.1.4"
}
},
"rimraf": {
@@ -19487,7 +17494,7 @@
"integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=",
"dev": true,
"requires": {
- "glob": "^7.0.5"
+ "glob": "7.1.7"
}
},
"ripemd160": {
@@ -19496,16 +17503,10 @@
"integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
"dev": true,
"requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
+ "hash-base": "3.1.0",
+ "inherits": "2.0.3"
}
},
- "rsvp": {
- "version": "4.8.5",
- "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
- "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==",
- "dev": true
- },
"run-async": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
@@ -19524,16 +17525,16 @@
"integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
"dev": true,
"requires": {
- "rx-lite": "*"
+ "rx-lite": "4.0.8"
}
},
"rxjs": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz",
- "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==",
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
"dev": true,
"requires": {
- "tslib": "^1.9.0"
+ "tslib": "1.14.1"
}
},
"safe-buffer": {
@@ -19553,7 +17554,7 @@
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
"dev": true,
"requires": {
- "ret": "~0.1.10"
+ "ret": "0.1.15"
}
},
"safer-buffer": {
@@ -19567,188 +17568,35 @@
"integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
"dev": true
},
- "sane": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
- "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
- "dev": true,
- "requires": {
- "@cnakazawa/watch": "^1.0.3",
- "anymatch": "^2.0.0",
- "capture-exit": "^2.0.0",
- "exec-sh": "^0.3.2",
- "execa": "^1.0.0",
- "fb-watchman": "^2.0.0",
- "micromatch": "^3.1.4",
- "minimist": "^1.1.1",
- "walker": "~1.0.5"
- },
- "dependencies": {
- "anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
- "dev": true,
- "requires": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
- }
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- }
- }
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "dev": true
- },
"schema-utils": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
- "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
"dev": true,
"requires": {
- "@types/json-schema": "^7.0.4",
- "ajv": "^6.12.2",
- "ajv-keywords": "^3.4.1"
+ "@types/json-schema": "7.0.7",
+ "ajv": "6.12.6",
+ "ajv-keywords": "3.5.2"
},
"dependencies": {
"ajv": {
- "version": "6.12.3",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
- "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
+ "fast-deep-equal": "3.1.3",
+ "fast-json-stable-stringify": "2.1.0",
+ "json-schema-traverse": "0.4.1",
+ "uri-js": "4.4.1"
}
}
}
},
"semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
},
"semver-greatest-satisfied-range": {
@@ -19757,7 +17605,7 @@
"integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
"dev": true,
"requires": {
- "sver-compat": "^1.5.0"
+ "sver-compat": "1.5.0"
}
},
"send": {
@@ -19766,18 +17614,18 @@
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
"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",
+ "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",
+ "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"
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.1",
+ "statuses": "1.5.0"
},
"dependencies": {
"ms": {
@@ -19788,27 +17636,30 @@
}
},
"serialize-error": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
- "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz",
+ "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==",
"dev": true,
"requires": {
- "type-fest": "^0.13.1"
+ "type-fest": "0.20.2"
},
"dependencies": {
"type-fest": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
- "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"dev": true
}
}
},
"serialize-javascript": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz",
- "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==",
- "dev": true
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+ "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+ "dev": true,
+ "requires": {
+ "randombytes": "2.1.0"
+ }
},
"serve-index": {
"version": "1.9.1",
@@ -19816,13 +17667,13 @@
"integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
"dev": true,
"requires": {
- "accepts": "~1.3.4",
+ "accepts": "1.3.7",
"batch": "0.6.1",
"debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
+ "escape-html": "1.0.3",
+ "http-errors": "1.6.3",
+ "mime-types": "2.1.31",
+ "parseurl": "1.3.3"
},
"dependencies": {
"http-errors": {
@@ -19831,10 +17682,10 @@
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
"dev": true,
"requires": {
- "depd": "~1.1.2",
+ "depd": "1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
+ "statuses": "1.5.0"
}
},
"setprototypeof": {
@@ -19850,9 +17701,9 @@
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "parseurl": "1.3.3",
"send": "0.17.1"
}
},
@@ -19868,10 +17719,10 @@
"integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
"dev": true,
"requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
},
"dependencies": {
"extend-shallow": {
@@ -19880,7 +17731,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -19902,29 +17753,23 @@
"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
"dev": true,
"requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.2"
}
},
"shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"requires": {
- "shebang-regex": "^1.0.0"
+ "shebang-regex": "3.0.0"
}
},
"shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
- "dev": true
- },
- "shell-quote": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
- "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
},
"shelljs": {
@@ -19933,25 +17778,20 @@
"integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
"dev": true,
"requires": {
- "glob": "^7.0.0",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
+ "glob": "7.1.7",
+ "interpret": "1.4.0",
+ "rechoir": "0.6.2"
}
},
- "shellwords": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
- "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
- "dev": true
- },
"side-channel": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz",
- "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dev": true,
"requires": {
- "es-abstract": "^1.17.0-next.1",
- "object-inspect": "^1.7.0"
+ "call-bind": "1.0.2",
+ "get-intrinsic": "1.1.1",
+ "object-inspect": "1.10.3"
}
},
"signal-exit": {
@@ -19966,13 +17806,13 @@
"integrity": "sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w==",
"dev": true,
"requires": {
- "@sinonjs/formatio": "^2.0.0",
- "diff": "^3.1.0",
- "lodash.get": "^4.4.2",
- "lolex": "^2.2.0",
- "nise": "^1.2.0",
- "supports-color": "^5.1.0",
- "type-detect": "^4.0.5"
+ "@sinonjs/formatio": "2.0.0",
+ "diff": "3.5.0",
+ "lodash.get": "4.4.2",
+ "lolex": "2.7.5",
+ "nise": "1.5.3",
+ "supports-color": "5.5.0",
+ "type-detect": "4.0.8"
},
"dependencies": {
"diff": {
@@ -19983,12 +17823,6 @@
}
}
},
- "sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "dev": true
- },
"slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -19996,18 +17830,38 @@
"dev": true
},
"slice-ansi": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
- "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
- "is-fullwidth-code-point": "^2.0.0"
+ "ansi-styles": "4.3.0",
+ "astral-regex": "2.0.0",
+ "is-fullwidth-code-point": "3.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=",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
}
}
@@ -20018,14 +17872,14 @@
"integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
"dev": true,
"requires": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.3",
+ "use": "3.1.1"
},
"dependencies": {
"define-property": {
@@ -20034,7 +17888,7 @@
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "^0.1.0"
+ "is-descriptor": "0.1.6"
}
},
"extend-shallow": {
@@ -20043,7 +17897,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -20054,9 +17908,9 @@
"integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
"dev": true,
"requires": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
},
"dependencies": {
"define-property": {
@@ -20065,7 +17919,7 @@
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
"dev": true,
"requires": {
- "is-descriptor": "^1.0.0"
+ "is-descriptor": "1.0.2"
}
},
"is-accessor-descriptor": {
@@ -20074,7 +17928,7 @@
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"dev": true,
"requires": {
- "kind-of": "^6.0.0"
+ "kind-of": "6.0.3"
}
},
"is-data-descriptor": {
@@ -20083,7 +17937,7 @@
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"dev": true,
"requires": {
- "kind-of": "^6.0.0"
+ "kind-of": "6.0.3"
}
},
"is-descriptor": {
@@ -20092,9 +17946,9 @@
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.3"
}
}
}
@@ -20105,139 +17959,88 @@
"integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
"dev": true,
"requires": {
- "kind-of": "^3.2.0"
+ "kind-of": "3.2.2"
},
"dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
},
"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==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz",
+ "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==",
"dev": true,
"requires": {
- "debug": "~3.1.0",
- "engine.io": "~3.2.0",
- "has-binary2": "~1.0.2",
- "socket.io-adapter": "~1.1.0",
- "socket.io-client": "2.1.1",
- "socket.io-parser": "~3.2.0"
+ "@types/cookie": "0.4.0",
+ "@types/cors": "2.8.10",
+ "@types/node": "15.12.4",
+ "accepts": "1.3.7",
+ "base64id": "2.0.0",
+ "debug": "4.3.1",
+ "engine.io": "4.1.1",
+ "socket.io-adapter": "2.1.0",
+ "socket.io-parser": "4.0.4"
},
"dependencies": {
"debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "2.1.2"
}
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
}
}
},
"socket.io-adapter": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
- "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz",
+ "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==",
"dev": true
},
- "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==",
- "dev": true,
- "requires": {
- "backo2": "1.0.2",
- "base64-arraybuffer": "0.1.5",
- "component-bind": "1.0.0",
- "component-emitter": "1.2.1",
- "debug": "~3.1.0",
- "engine.io-client": "~3.2.0",
- "has-binary2": "~1.0.2",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "object-component": "0.0.3",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "socket.io-parser": "~3.2.0",
- "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": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- }
- }
- },
"socket.io-parser": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
- "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
+ "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
"dev": true,
"requires": {
- "component-emitter": "1.2.1",
- "debug": "~3.1.0",
- "isarray": "2.0.1"
+ "@types/component-emitter": "1.2.10",
+ "component-emitter": "1.3.0",
+ "debug": "4.3.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": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "2.1.2"
}
},
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
}
}
},
- "sort-keys": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
- "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
- "dev": true,
- "requires": {
- "is-plain-obj": "^1.0.0"
- }
- },
"source-list-map": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
@@ -20250,34 +18053,57 @@
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
},
+ "source-map-js": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz",
+ "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==",
+ "dev": true,
+ "optional": true
+ },
"source-map-resolve": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
"integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
"dev": true,
"requires": {
- "atob": "^2.1.2",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
+ "atob": "2.1.2",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.1",
+ "urix": "0.1.0"
}
},
"source-map-support": {
- "version": "0.4.18",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
- "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
"dev": true,
"requires": {
- "source-map": "^0.5.6"
+ "buffer-from": "1.1.1",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
}
},
"source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
+ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
"dev": true
},
+ "sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "dev": true,
+ "optional": true
+ },
"space-separated-tokens": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
@@ -20296,8 +18122,8 @@
"integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
"dev": true,
"requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
+ "spdx-expression-parse": "3.0.1",
+ "spdx-license-ids": "3.0.9"
}
},
"spdx-exceptions": {
@@ -20312,14 +18138,14 @@
"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
"requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
+ "spdx-exceptions": "2.3.0",
+ "spdx-license-ids": "3.0.9"
}
},
"spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
- "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz",
+ "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==",
"dev": true
},
"split": {
@@ -20328,16 +18154,31 @@
"integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
"dev": true,
"requires": {
- "through": "2"
+ "through": "2.3.8"
}
},
+ "split-on-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
+ "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==",
+ "dev": true
+ },
"split-string": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
"integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
"dev": true,
"requires": {
- "extend-shallow": "^3.0.0"
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "split2": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
+ "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "3.6.0"
}
},
"sprintf-js": {
@@ -20352,15 +18193,15 @@
"integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
"dev": true,
"requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
+ "asn1": "0.2.4",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.2",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.2",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "safer-buffer": "2.1.2",
+ "tweetnacl": "0.14.5"
}
},
"stack-trace": {
@@ -20370,12 +18211,12 @@
"dev": true
},
"stack-utils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz",
- "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==",
"dev": true,
"requires": {
- "escape-string-regexp": "^2.0.0"
+ "escape-string-regexp": "2.0.0"
},
"dependencies": {
"escape-string-regexp": {
@@ -20386,11 +18227,106 @@
}
}
},
- "state-toggle": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
- "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
- "dev": true
+ "standard-version": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.3.0.tgz",
+ "integrity": "sha512-cYxxKXhYfI3S9+CA84HmrJa9B88H56V5FQ302iFF2TNwJukJCNoU8FgWt+11YtwKFXRkQQFpepC2QOF7aDq2Ow==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.2",
+ "conventional-changelog": "3.1.24",
+ "conventional-changelog-config-spec": "2.1.0",
+ "conventional-changelog-conventionalcommits": "4.5.0",
+ "conventional-recommended-bump": "6.1.0",
+ "detect-indent": "6.1.0",
+ "detect-newline": "3.1.0",
+ "dotgitignore": "2.1.0",
+ "figures": "3.2.0",
+ "find-up": "5.0.0",
+ "fs-access": "1.0.1",
+ "git-semver-tags": "4.1.1",
+ "semver": "7.3.5",
+ "stringify-package": "1.0.1",
+ "yargs": "16.2.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "6.0.0",
+ "path-exists": "4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "5.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "4.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "3.1.0"
+ }
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "7.0.4",
+ "escalade": "3.1.1",
+ "get-caller-file": "2.0.5",
+ "require-directory": "2.1.1",
+ "string-width": "4.2.2",
+ "y18n": "5.0.8",
+ "yargs-parser": "20.2.9"
+ }
+ }
+ }
},
"static-extend": {
"version": "0.1.2",
@@ -20398,8 +18334,8 @@
"integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
"dev": true,
"requires": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
},
"dependencies": {
"define-property": {
@@ -20408,7 +18344,7 @@
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "^0.1.0"
+ "is-descriptor": "0.1.6"
}
}
}
@@ -20418,19 +18354,13 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
- "stealthy-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
- "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
- "dev": true
- },
"stream-array": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/stream-array/-/stream-array-1.1.2.tgz",
"integrity": "sha1-nl9zRfITfDDuO0mLkRToC1K7frU=",
"dev": true,
"requires": {
- "readable-stream": "~2.1.0"
+ "readable-stream": "2.1.5"
},
"dependencies": {
"process-nextick-args": {
@@ -20445,13 +18375,13 @@
"integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=",
"dev": true,
"requires": {
- "buffer-shims": "^1.0.0",
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "~1.0.0",
- "process-nextick-args": "~1.0.6",
- "string_decoder": "~0.10.x",
- "util-deprecate": "~1.0.1"
+ "buffer-shims": "1.0.0",
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "string_decoder": "0.10.31",
+ "util-deprecate": "1.0.2"
}
},
"string_decoder": {
@@ -20468,8 +18398,8 @@
"integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
"dev": true,
"requires": {
- "inherits": "~2.0.1",
- "readable-stream": "^2.0.2"
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.7"
},
"dependencies": {
"readable-stream": {
@@ -20478,13 +18408,22 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
@@ -20501,7 +18440,7 @@
"integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
"dev": true,
"requires": {
- "duplexer": "~0.1.1"
+ "duplexer": "0.1.2"
}
},
"stream-combiner2": {
@@ -20510,8 +18449,8 @@
"integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
"dev": true,
"requires": {
- "duplexer2": "~0.1.0",
- "readable-stream": "^2.0.2"
+ "duplexer2": "0.1.4",
+ "readable-stream": "2.3.7"
},
"dependencies": {
"readable-stream": {
@@ -20520,13 +18459,22 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
@@ -20543,11 +18491,11 @@
"integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
"dev": true,
"requires": {
- "builtin-status-codes": "^3.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.3.6",
- "to-arraybuffer": "^1.0.0",
- "xtend": "^4.0.0"
+ "builtin-status-codes": "3.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.7",
+ "to-arraybuffer": "1.0.1",
+ "xtend": "4.0.2"
},
"dependencies": {
"readable-stream": {
@@ -20556,13 +18504,22 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
@@ -20574,45 +18531,40 @@
"dev": true
},
"streamroller": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz",
- "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==",
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz",
+ "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==",
"dev": true,
"requires": {
- "async": "^2.6.2",
- "date-format": "^2.0.0",
- "debug": "^3.2.6",
- "fs-extra": "^7.0.1",
- "lodash": "^4.17.14"
+ "date-format": "2.1.0",
+ "debug": "4.3.1",
+ "fs-extra": "8.1.0"
},
"dependencies": {
- "async": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
- "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.14"
- }
+ "date-format": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz",
+ "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==",
+ "dev": true
},
"debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.2"
}
},
"fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
+ "graceful-fs": "4.2.6",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.2"
}
},
"jsonfile": {
@@ -20621,7 +18573,7 @@
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.6"
+ "graceful-fs": "4.2.6"
}
},
"ms": {
@@ -20639,37 +18591,17 @@
}
},
"strict-uri-encode": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
- "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
+ "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=",
"dev": true
},
- "string-length": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz",
- "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=",
+ "string-hash": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
+ "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=",
"dev": true,
- "requires": {
- "astral-regex": "^1.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"
- }
- }
- }
+ "optional": true
},
"string-template": {
"version": "0.2.1",
@@ -20678,194 +18610,77 @@
"dev": true
},
"string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "string.prototype.padend": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz",
- "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==",
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
"dev": true,
"requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
+ "emoji-regex": "8.0.0",
+ "is-fullwidth-code-point": "3.0.0",
+ "strip-ansi": "6.0.0"
}
},
"string.prototype.trimend": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz",
- "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.18.0-next.1"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.18.0-next.1",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
- "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.2",
- "is-negative-zero": "^2.0.0",
- "is-regex": "^1.1.1",
- "object-inspect": "^1.8.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.1",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- }
- },
- "is-callable": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
- "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
- "dev": true
- },
- "is-regex": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
- "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
- "dev": true,
- "requires": {
- "has-symbols": "^1.0.1"
- }
- },
- "object.assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
- "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.18.0-next.0",
- "has-symbols": "^1.0.1",
- "object-keys": "^1.1.1"
- }
- }
- }
- },
- "string.prototype.trimleft": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
- "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+ "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
"dev": true,
"requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5",
- "string.prototype.trimstart": "^1.0.0"
+ "call-bind": "1.0.2",
+ "define-properties": "1.1.3"
}
},
- "string.prototype.trimright": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
- "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
+ "string.prototype.trimstart": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+ "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
"dev": true,
"requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5",
- "string.prototype.trimend": "^1.0.0"
+ "call-bind": "1.0.2",
+ "define-properties": "1.1.3"
}
},
- "string.prototype.trimstart": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz",
- "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==",
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
"requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.18.0-next.1"
+ "safe-buffer": "5.2.1"
},
"dependencies": {
- "es-abstract": {
- "version": "1.18.0-next.1",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
- "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.2",
- "is-negative-zero": "^2.0.0",
- "is-regex": "^1.1.1",
- "object-inspect": "^1.8.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.1",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- }
- },
- "is-callable": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
- "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true
- },
- "is-regex": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
- "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
- "dev": true,
- "requires": {
- "has-symbols": "^1.0.1"
- }
- },
- "object.assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
- "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.18.0-next.0",
- "has-symbols": "^1.0.1",
- "object-keys": "^1.1.1"
- }
}
}
},
- "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==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
"stringify-entities": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz",
- "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz",
+ "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==",
"dev": true,
"requires": {
- "character-entities-html4": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
+ "character-entities-html4": "1.1.4",
+ "character-entities-legacy": "1.1.4",
+ "xtend": "4.0.2"
}
},
+ "stringify-package": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz",
+ "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==",
+ "dev": true
+ },
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
- "ansi-regex": "^5.0.0"
+ "ansi-regex": "5.0.0"
}
},
"strip-bom": {
@@ -20874,7 +18689,7 @@
"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
"dev": true,
"requires": {
- "is-utf8": "^0.2.0"
+ "is-utf8": "0.2.1"
}
},
"strip-bom-string": {
@@ -20890,18 +18705,18 @@
"dev": true
},
"strip-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
- "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
"dev": true,
"requires": {
- "get-stdin": "^4.0.1"
+ "min-indent": "1.0.1"
}
},
"strip-json-comments": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
- "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true
},
"subarg": {
@@ -20910,7 +18725,7 @@
"integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
"dev": true,
"requires": {
- "minimist": "^1.1.0"
+ "minimist": "1.2.5"
}
},
"suffix": {
@@ -20925,75 +18740,50 @@
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
- "has-flag": "^3.0.0"
+ "has-flag": "3.0.0"
}
},
"sver-compat": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
"integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
- "dev": true,
- "requires": {
- "es6-iterator": "^2.0.1",
- "es6-symbol": "^3.1.1"
- }
- },
- "symbol-tree": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
- "dev": true
- },
- "table": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
- "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
- "dev": true,
- "requires": {
- "ajv": "^5.2.3",
- "ajv-keywords": "^2.1.0",
- "chalk": "^2.1.0",
- "lodash": "^4.17.4",
- "slice-ansi": "1.0.0",
- "string-width": "^2.1.1"
- },
- "dependencies": {
- "ajv-keywords": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
- "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
- "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
- },
- "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": {
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.3"
+ }
+ },
+ "table": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
+ "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
+ "dev": true,
+ "requires": {
+ "ajv": "8.6.0",
+ "lodash.clonedeep": "4.5.0",
+ "lodash.truncate": "4.4.2",
+ "slice-ansi": "4.0.0",
+ "string-width": "4.2.2",
+ "strip-ansi": "6.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz",
+ "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==",
"dev": true,
"requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
+ "fast-deep-equal": "3.1.3",
+ "json-schema-traverse": "1.0.0",
+ "require-from-string": "2.0.2",
+ "uri-js": "4.4.1"
}
},
- "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"
- }
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
}
}
},
@@ -21004,28 +18794,28 @@
"dev": true
},
"tar-fs": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz",
- "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+ "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
"dev": true,
"requires": {
- "chownr": "^1.1.1",
- "mkdirp-classic": "^0.5.2",
- "pump": "^3.0.0",
- "tar-stream": "^2.0.0"
+ "chownr": "1.1.4",
+ "mkdirp-classic": "0.5.3",
+ "pump": "3.0.0",
+ "tar-stream": "2.2.0"
}
},
"tar-stream": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz",
- "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"dev": true,
"requires": {
- "bl": "^4.0.1",
- "end-of-stream": "^1.4.1",
- "fs-constants": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1"
+ "bl": "4.1.0",
+ "end-of-stream": "1.4.4",
+ "fs-constants": "1.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "3.6.0"
}
},
"temp-fs": {
@@ -21034,159 +18824,78 @@
"integrity": "sha1-gHFzBDeHByDpQxUy/igUNk+IA9c=",
"dev": true,
"requires": {
- "rimraf": "~2.5.2"
+ "rimraf": "2.5.4"
}
},
"ternary-stream": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.1.1.tgz",
- "integrity": "sha512-j6ei9hxSoyGlqTmoMjOm+QNvUKDOIY6bNl4Uh1lhBvl6yjPW2iLqxDUYyfDPZknQ4KdRziFl+ec99iT4l7g0cw==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-3.0.0.tgz",
+ "integrity": "sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==",
"dev": true,
"requires": {
- "duplexify": "^3.5.0",
- "fork-stream": "^0.0.4",
- "merge-stream": "^1.0.0",
- "through2": "^2.0.1"
+ "duplexify": "4.1.1",
+ "fork-stream": "0.0.4",
+ "merge-stream": "2.0.0",
+ "through2": "3.0.2"
},
"dependencies": {
- "merge-stream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
- "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+ "duplexify": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz",
+ "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==",
"dev": true,
"requires": {
- "readable-stream": "^2.0.1"
+ "end-of-stream": "1.4.4",
+ "inherits": "2.0.3",
+ "readable-stream": "3.6.0",
+ "stream-shift": "1.0.1"
}
},
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "through2": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
+ "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "inherits": "2.0.4",
+ "readable-stream": "3.6.0"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ }
}
}
}
},
- "test-exclude": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz",
- "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==",
+ "terser": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.4.0.tgz",
+ "integrity": "sha512-3dZunFLbCJis9TAF2VnX+VrQLctRUmt1p3W2kCsJuZE4ZgWqh//+1MZ62EanewrqKoUf4zIaDGZAvml4UDc0OQ==",
"dev": true,
"requires": {
- "glob": "^7.1.3",
- "minimatch": "^3.0.4",
- "read-pkg-up": "^4.0.0",
- "require-main-filename": "^2.0.0"
+ "commander": "2.20.3",
+ "source-map": "0.7.3",
+ "source-map-support": "0.5.19"
},
"dependencies": {
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "load-json-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^4.0.0",
- "pify": "^3.0.0",
- "strip-bom": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
- "dev": true,
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- },
- "path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
- "dev": true,
- "requires": {
- "pify": "^3.0.0"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- },
- "read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
- "dev": true,
- "requires": {
- "load-json-file": "^4.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^3.0.0"
- }
- },
- "read-pkg-up": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
- "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
- "dev": true,
- "requires": {
- "find-up": "^3.0.0",
- "read-pkg": "^3.0.0"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"dev": true
}
}
},
+ "text-extensions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
+ "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
+ "dev": true
+ },
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -21194,15 +18903,9 @@
"dev": true
},
"textextensions": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz",
- "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==",
- "dev": true
- },
- "throat": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
- "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-3.3.0.tgz",
+ "integrity": "sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==",
"dev": true
},
"through": {
@@ -21212,13 +18915,22 @@
"dev": true
},
"through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "3.6.0"
+ }
+ },
+ "through2-filter": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
+ "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
"dev": true,
"requires": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
+ "through2": "2.0.5",
+ "xtend": "4.0.2"
},
"dependencies": {
"readable-stream": {
@@ -21227,46 +18939,49 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
}
}
}
},
- "through2-filter": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
- "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
- "dev": true,
- "requires": {
- "through2": "~2.0.0",
- "xtend": "~4.0.0"
- }
- },
"time-stamp": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
"integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
"dev": true
},
- "timed-out": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
- "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
- "dev": true
- },
"timers-browserify": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
- "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
+ "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
"dev": true,
"requires": {
- "setimmediate": "^1.0.4"
+ "setimmediate": "1.0.5"
}
},
"timers-ext": {
@@ -21275,8 +18990,8 @@
"integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
"dev": true,
"requires": {
- "es5-ext": "~0.10.46",
- "next-tick": "1"
+ "es5-ext": "0.10.53",
+ "next-tick": "1.0.0"
}
},
"tiny-hashes": {
@@ -21290,27 +19005,27 @@
"integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==",
"dev": true,
"requires": {
- "body": "^5.1.0",
- "debug": "^3.1.0",
- "faye-websocket": "~0.10.0",
- "livereload-js": "^2.3.0",
- "object-assign": "^4.1.0",
- "qs": "^6.4.0"
+ "body": "5.1.0",
+ "debug": "3.2.7",
+ "faye-websocket": "0.10.0",
+ "livereload-js": "2.4.0",
+ "object-assign": "4.1.1",
+ "qs": "6.7.0"
},
"dependencies": {
"debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.3"
}
},
"ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
}
}
@@ -21321,31 +19036,19 @@
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
"dev": true,
"requires": {
- "os-tmpdir": "~1.0.2"
+ "os-tmpdir": "1.0.2"
}
},
- "tmpl": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
- "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
- "dev": true
- },
"to-absolute-glob": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
"integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
"dev": true,
"requires": {
- "is-absolute": "^1.0.0",
- "is-negated-glob": "^1.0.0"
+ "is-absolute": "1.0.0",
+ "is-negated-glob": "1.0.0"
}
},
- "to-array": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
- "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
- "dev": true
- },
"to-arraybuffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
@@ -21364,22 +19067,16 @@
"integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "kind-of": "3.2.2"
},
"dependencies": {
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
@@ -21390,10 +19087,10 @@
"integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
"dev": true,
"requires": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
}
},
"to-regex-range": {
@@ -21402,7 +19099,7 @@
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"requires": {
- "is-number": "^7.0.0"
+ "is-number": "7.0.0"
}
},
"to-through": {
@@ -21411,7 +19108,43 @@
"integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
"dev": true,
"requires": {
- "through2": "^2.0.3"
+ "through2": "2.0.5"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
+ }
+ }
}
},
"toidentifier": {
@@ -21425,17 +19158,8 @@
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
"dev": true,
"requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
- },
- "tr46": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
- "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
+ "psl": "1.8.0",
+ "punycode": "2.1.1"
}
},
"traverse": {
@@ -21444,34 +19168,16 @@
"integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=",
"dev": true
},
- "trim": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
- "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
- "dev": true
- },
- "trim-lines": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.3.tgz",
- "integrity": "sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA==",
- "dev": true
- },
"trim-newlines": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
- "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
"dev": true
},
- "trim-right": {
+ "trim-off-newlines": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
- "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
- "dev": true
- },
- "trim-trailing-lines": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
- "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==",
+ "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz",
+ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=",
"dev": true
},
"trough": {
@@ -21492,10 +19198,10 @@
"integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
"dev": true,
"requires": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.1",
- "minimist": "^1.2.0",
- "strip-bom": "^3.0.0"
+ "@types/json5": "0.0.29",
+ "json5": "1.0.1",
+ "minimist": "1.2.5",
+ "strip-bom": "3.0.0"
},
"dependencies": {
"json5": {
@@ -21504,7 +19210,7 @@
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"dev": true,
"requires": {
- "minimist": "^1.2.0"
+ "minimist": "1.2.5"
}
},
"strip-bom": {
@@ -21516,9 +19222,9 @@
}
},
"tslib": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
- "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
"tty-browserify": {
@@ -21533,7 +19239,7 @@
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"dev": true,
"requires": {
- "safe-buffer": "^5.0.1"
+ "safe-buffer": "5.1.2"
}
},
"tweetnacl": {
@@ -21549,12 +19255,12 @@
"dev": true
},
"type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"requires": {
- "prelude-ls": "~1.1.2"
+ "prelude-ls": "1.2.1"
}
},
"type-detect": {
@@ -21564,9 +19270,9 @@
"dev": true
},
"type-fest": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
- "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
"dev": true
},
"type-is": {
@@ -21575,7 +19281,7 @@
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"requires": {
"media-typer": "0.3.0",
- "mime-types": "~2.1.24"
+ "mime-types": "2.1.31"
}
},
"typedarray": {
@@ -21589,7 +19295,7 @@
"resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz",
"integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==",
"requires": {
- "typescript-logic": "^0.0.0"
+ "typescript-logic": "0.0.0"
}
},
"typescript-logic": {
@@ -21602,20 +19308,21 @@
"resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz",
"integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==",
"requires": {
- "typescript-compare": "^0.0.2"
+ "typescript-compare": "0.0.2"
}
},
"ua-parser-js": {
- "version": "0.7.21",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz",
- "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==",
+ "version": "0.7.28",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz",
+ "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==",
"dev": true
},
"uglify-js": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz",
- "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==",
- "dev": true
+ "version": "3.13.9",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.9.tgz",
+ "integrity": "sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g==",
+ "dev": true,
+ "optional": true
},
"uglify-to-browserify": {
"version": "1.0.2",
@@ -21629,9 +19336,9 @@
"integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
"dev": true,
"requires": {
- "source-map": "^0.5.6",
- "uglify-js": "^2.8.29",
- "webpack-sources": "^1.0.1"
+ "source-map": "0.5.7",
+ "uglify-js": "2.8.29",
+ "webpack-sources": "1.4.3"
},
"dependencies": {
"camelcase": {
@@ -21646,20 +19353,26 @@
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
"dev": true,
"requires": {
- "center-align": "^0.1.1",
- "right-align": "^0.1.1",
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
"wordwrap": "0.0.2"
}
},
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
"uglify-js": {
"version": "2.8.29",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
"integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
"dev": true,
"requires": {
- "source-map": "~0.5.1",
- "uglify-to-browserify": "~1.0.0",
- "yargs": "~3.10.0"
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
}
},
"wordwrap": {
@@ -21674,19 +19387,25 @@
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
"dev": true,
"requires": {
- "camelcase": "^1.0.2",
- "cliui": "^2.1.0",
- "decamelize": "^1.0.0",
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
"window-size": "0.1.0"
}
}
}
},
- "ultron": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
- "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
- "dev": true
+ "unbox-primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
+ "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "1.1.1",
+ "has-bigints": "1.0.1",
+ "has-symbols": "1.0.2",
+ "which-boxed-primitive": "1.0.2"
+ }
},
"unbzip2-stream": {
"version": "1.4.3",
@@ -21694,8 +19413,8 @@
"integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
"dev": true,
"requires": {
- "buffer": "^5.2.1",
- "through": "^2.3.8"
+ "buffer": "5.7.1",
+ "through": "2.3.8"
}
},
"unc-path-regex": {
@@ -21705,20 +19424,29 @@
"dev": true
},
"undertaker": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz",
- "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz",
+ "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==",
"dev": true,
"requires": {
- "arr-flatten": "^1.0.1",
- "arr-map": "^2.0.0",
- "bach": "^1.0.0",
- "collection-map": "^1.0.0",
- "es6-weak-map": "^2.0.1",
- "last-run": "^1.1.0",
- "object.defaults": "^1.0.0",
- "object.reduce": "^1.0.0",
- "undertaker-registry": "^1.0.0"
+ "arr-flatten": "1.1.0",
+ "arr-map": "2.0.2",
+ "bach": "1.2.0",
+ "collection-map": "1.0.0",
+ "es6-weak-map": "2.0.3",
+ "fast-levenshtein": "1.1.4",
+ "last-run": "1.1.1",
+ "object.defaults": "1.1.0",
+ "object.reduce": "1.0.1",
+ "undertaker-registry": "1.0.1"
+ },
+ "dependencies": {
+ "fast-levenshtein": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz",
+ "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=",
+ "dev": true
+ }
}
},
"undertaker-registry": {
@@ -21727,16 +19455,6 @@
"integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
"dev": true
},
- "unherit": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
- "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
"unicode-canonical-property-names-ecmascript": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
@@ -21749,8 +19467,8 @@
"integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
"dev": true,
"requires": {
- "unicode-canonical-property-names-ecmascript": "^1.0.4",
- "unicode-property-aliases-ecmascript": "^1.0.4"
+ "unicode-canonical-property-names-ecmascript": "1.0.4",
+ "unicode-property-aliases-ecmascript": "1.1.0"
}
},
"unicode-match-property-value-ecmascript": {
@@ -21766,17 +19484,25 @@
"dev": true
},
"unified": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz",
- "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==",
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz",
+ "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==",
"dev": true,
"requires": {
- "bail": "^1.0.0",
- "extend": "^3.0.0",
- "is-plain-obj": "^1.1.0",
- "trough": "^1.0.0",
- "vfile": "^2.0.0",
- "x-is-string": "^0.1.0"
+ "bail": "1.0.5",
+ "extend": "3.0.2",
+ "is-buffer": "2.0.5",
+ "is-plain-obj": "2.1.0",
+ "trough": "1.0.5",
+ "vfile": "4.2.1"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+ "dev": true
+ }
}
},
"union-value": {
@@ -21785,41 +19511,38 @@
"integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
"dev": true,
"requires": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^2.0.1"
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "2.0.1"
}
},
"unique-stream": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
- "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
- "dev": true,
- "requires": {
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "through2-filter": "^3.0.0"
- }
- },
- "unist-builder": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz",
- "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==",
+ "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
"dev": true,
"requires": {
- "object-assign": "^4.1.0"
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "through2-filter": "3.0.0"
}
},
+ "unist-builder": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz",
+ "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==",
+ "dev": true
+ },
"unist-util-generated": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.5.tgz",
- "integrity": "sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw==",
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz",
+ "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==",
"dev": true
},
"unist-util-is": {
- "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==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
+ "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
"dev": true
},
"unist-util-position": {
@@ -21828,43 +19551,40 @@
"integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==",
"dev": true
},
- "unist-util-remove-position": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz",
- "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==",
+ "unist-util-stringify-position": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+ "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
"dev": true,
"requires": {
- "unist-util-visit": "^1.1.0"
+ "@types/unist": "2.0.3"
}
},
- "unist-util-stringify-position": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
- "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
- "dev": true
- },
"unist-util-visit": {
- "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==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
+ "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
"dev": true,
"requires": {
- "unist-util-visit-parents": "^2.0.0"
+ "@types/unist": "2.0.3",
+ "unist-util-is": "4.1.0",
+ "unist-util-visit-parents": "3.1.1"
}
},
"unist-util-visit-parents": {
- "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==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
+ "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
"dev": true,
"requires": {
- "unist-util-is": "^3.0.0"
+ "@types/unist": "2.0.3",
+ "unist-util-is": "4.1.0"
}
},
"universalify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
- "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true
},
"unpipe": {
@@ -21878,8 +19598,8 @@
"integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
"dev": true,
"requires": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
},
"dependencies": {
"has-value": {
@@ -21888,9 +19608,9 @@
"integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
"dev": true,
"requires": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
},
"dependencies": {
"isobject": {
@@ -21918,15 +19638,15 @@
"integrity": "sha512-2aaUvO4RAeHDvOCuEtth7jrHFaCKTSXPqUkXwADaLBzGbgZGzUDccoEdJ5lW+3RmfpOZYNx0Rw6F6PUzM6caIA==",
"dev": true,
"requires": {
- "big-integer": "^1.6.17",
- "binary": "~0.3.0",
- "bluebird": "~3.4.1",
- "buffer-indexof-polyfill": "~1.0.0",
- "duplexer2": "~0.1.4",
- "fstream": "^1.0.12",
- "listenercount": "~1.0.1",
- "readable-stream": "~2.3.6",
- "setimmediate": "~1.0.4"
+ "big-integer": "1.6.48",
+ "binary": "0.3.0",
+ "bluebird": "3.4.7",
+ "buffer-indexof-polyfill": "1.0.2",
+ "duplexer2": "0.1.4",
+ "fstream": "1.0.12",
+ "listenercount": "1.0.1",
+ "readable-stream": "2.3.7",
+ "setimmediate": "1.0.5"
},
"dependencies": {
"bluebird": {
@@ -21941,13 +19661,22 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
}
}
}
@@ -21959,12 +19688,12 @@
"dev": true
},
"uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"requires": {
- "punycode": "^2.1.0"
+ "punycode": "2.1.1"
}
},
"urix": {
@@ -21998,54 +19727,21 @@
"dev": true
},
"url-parse": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.0.tgz",
- "integrity": "sha512-9iT6N4s93SMfzunOyDPe4vo4nLcSu1yq0IQK1gURmjm8tQNlM6loiuCRrKG1hHGXfB2EWd6H4cGi7tGdaygMFw==",
- "dev": true,
- "requires": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
- "url-parse-lax": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
- "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz",
+ "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==",
"dev": true,
"requires": {
- "prepend-http": "^2.0.0"
- },
- "dependencies": {
- "prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
- "dev": true
- }
+ "querystringify": "2.2.0",
+ "requires-port": "1.0.0"
}
},
- "url-to-options": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
- "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=",
- "dev": true
- },
"use": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
"dev": true
},
- "useragent": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
- "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==",
- "dev": true,
- "requires": {
- "lru-cache": "4.1.x",
- "tmp": "0.0.x"
- }
- },
"util": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
@@ -22061,27 +19757,21 @@
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
- "util.promisify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
- "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.2",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.0"
- }
- },
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"uuid": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.2.0.tgz",
- "integrity": "sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q==",
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"v8flags": {
@@ -22090,7 +19780,7 @@
"integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
"dev": true,
"requires": {
- "homedir-polyfill": "^1.0.1"
+ "homedir-polyfill": "1.0.3"
}
},
"validate-npm-package-license": {
@@ -22099,8 +19789,8 @@
"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
"requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
+ "spdx-correct": "3.1.1",
+ "spdx-expression-parse": "3.0.1"
}
},
"value-or-function": {
@@ -22120,107 +19810,62 @@
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"dev": true,
"requires": {
- "assert-plus": "^1.0.0",
+ "assert-plus": "1.0.0",
"core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
+ "extsprintf": "1.3.0"
}
},
"vfile": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz",
- "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
+ "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
"dev": true,
"requires": {
- "is-buffer": "^1.1.4",
- "replace-ext": "1.0.0",
- "unist-util-stringify-position": "^1.0.0",
- "vfile-message": "^1.0.0"
+ "@types/unist": "2.0.3",
+ "is-buffer": "2.0.5",
+ "unist-util-stringify-position": "2.0.3",
+ "vfile-message": "2.0.4"
},
"dependencies": {
"is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
"dev": true
}
}
},
- "vfile-location": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
- "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==",
- "dev": true
- },
"vfile-message": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
- "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
+ "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
"dev": true,
"requires": {
- "unist-util-stringify-position": "^1.1.1"
+ "@types/unist": "2.0.3",
+ "unist-util-stringify-position": "2.0.3"
}
},
"vfile-reporter": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-4.0.0.tgz",
- "integrity": "sha1-6m8K4TQvSEFXOYXgX5QXNvJ96do=",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-6.0.2.tgz",
+ "integrity": "sha512-GN2bH2gs4eLnw/4jPSgfBjo+XCuvnX9elHICJZjVD4+NM0nsUrMTvdjGY5Sc/XG69XVTgLwj7hknQVc6M9FukA==",
"dev": true,
"requires": {
- "repeat-string": "^1.5.0",
- "string-width": "^1.0.0",
- "supports-color": "^4.1.0",
- "unist-util-stringify-position": "^1.0.0",
- "vfile-statistics": "^1.1.0"
+ "repeat-string": "1.6.1",
+ "string-width": "4.2.2",
+ "supports-color": "6.1.0",
+ "unist-util-stringify-position": "2.0.3",
+ "vfile-sort": "2.2.2",
+ "vfile-statistics": "1.1.4"
},
"dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "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": "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"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
"supports-color": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
- "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
"dev": true,
"requires": {
- "has-flag": "^2.0.0"
+ "has-flag": "3.0.0"
}
}
}
@@ -22238,17 +19883,17 @@
"dev": true
},
"vinyl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
- "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
+ "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
"dev": true,
"requires": {
- "clone": "^2.1.1",
- "clone-buffer": "^1.0.0",
- "clone-stats": "^1.0.0",
- "cloneable-readable": "^1.0.0",
- "remove-trailing-separator": "^1.0.1",
- "replace-ext": "^1.0.0"
+ "clone": "2.1.2",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.1.3",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.1"
},
"dependencies": {
"clone": {
@@ -22265,23 +19910,23 @@
"integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
"dev": true,
"requires": {
- "fs-mkdirp-stream": "^1.0.0",
- "glob-stream": "^6.1.0",
- "graceful-fs": "^4.0.0",
- "is-valid-glob": "^1.0.0",
- "lazystream": "^1.0.0",
- "lead": "^1.0.0",
- "object.assign": "^4.0.4",
- "pumpify": "^1.3.5",
- "readable-stream": "^2.3.3",
- "remove-bom-buffer": "^3.0.0",
- "remove-bom-stream": "^1.2.0",
- "resolve-options": "^1.1.0",
- "through2": "^2.0.0",
- "to-through": "^2.0.0",
- "value-or-function": "^3.0.0",
- "vinyl": "^2.0.0",
- "vinyl-sourcemap": "^1.1.0"
+ "fs-mkdirp-stream": "1.0.0",
+ "glob-stream": "6.1.0",
+ "graceful-fs": "4.2.6",
+ "is-valid-glob": "1.0.0",
+ "lazystream": "1.0.0",
+ "lead": "1.0.0",
+ "object.assign": "4.1.2",
+ "pumpify": "1.5.1",
+ "readable-stream": "2.3.7",
+ "remove-bom-buffer": "3.0.0",
+ "remove-bom-stream": "1.2.0",
+ "resolve-options": "1.1.0",
+ "through2": "2.0.5",
+ "to-through": "2.0.0",
+ "value-or-function": "3.0.0",
+ "vinyl": "2.2.1",
+ "vinyl-sourcemap": "1.1.0"
},
"dependencies": {
"readable-stream": {
@@ -22290,13 +19935,32 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.7",
+ "xtend": "4.0.2"
}
}
}
@@ -22307,13 +19971,13 @@
"integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
"dev": true,
"requires": {
- "append-buffer": "^1.0.2",
- "convert-source-map": "^1.5.0",
- "graceful-fs": "^4.1.6",
- "normalize-path": "^2.1.1",
- "now-and-later": "^2.0.0",
- "remove-bom-buffer": "^3.0.0",
- "vinyl": "^2.0.0"
+ "append-buffer": "1.0.2",
+ "convert-source-map": "1.8.0",
+ "graceful-fs": "4.2.6",
+ "normalize-path": "2.1.1",
+ "now-and-later": "2.0.1",
+ "remove-bom-buffer": "3.0.0",
+ "vinyl": "2.2.1"
},
"dependencies": {
"normalize-path": {
@@ -22322,7 +19986,7 @@
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
"dev": true,
"requires": {
- "remove-trailing-separator": "^1.0.1"
+ "remove-trailing-separator": "1.1.0"
}
}
}
@@ -22333,7 +19997,7 @@
"integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
"dev": true,
"requires": {
- "source-map": "^0.5.1"
+ "source-map": "0.5.7"
}
},
"vm-browserify": {
@@ -22348,13 +20012,15 @@
"integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
"dev": true
},
- "w3c-hr-time": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
- "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "vue-template-compiler": {
+ "version": "2.6.14",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
+ "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
"dev": true,
+ "optional": true,
"requires": {
- "browser-process-hrtime": "^1.0.0"
+ "de-indent": "1.0.2",
+ "he": "1.2.0"
}
},
"walk": {
@@ -22363,38 +20029,29 @@
"integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==",
"dev": true,
"requires": {
- "foreachasync": "^3.0.0"
- }
- },
- "walker": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
- "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
- "dev": true,
- "requires": {
- "makeerror": "1.0.x"
+ "foreachasync": "3.0.0"
}
},
"watchpack": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz",
- "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==",
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
+ "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==",
"dev": true,
"requires": {
- "chokidar": "^3.4.0",
- "graceful-fs": "^4.1.2",
- "neo-async": "^2.5.0",
- "watchpack-chokidar2": "^2.0.0"
+ "chokidar": "3.5.2",
+ "graceful-fs": "4.2.6",
+ "neo-async": "2.6.2",
+ "watchpack-chokidar2": "2.0.1"
}
},
"watchpack-chokidar2": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
- "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
+ "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
"dev": true,
"optional": true,
"requires": {
- "chokidar": "^2.1.8"
+ "chokidar": "2.1.8"
},
"dependencies": {
"anymatch": {
@@ -22404,8 +20061,8 @@
"dev": true,
"optional": true,
"requires": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
+ "micromatch": "3.1.10",
+ "normalize-path": "2.1.1"
},
"dependencies": {
"normalize-path": {
@@ -22415,7 +20072,7 @@
"dev": true,
"optional": true,
"requires": {
- "remove-trailing-separator": "^1.0.1"
+ "remove-trailing-separator": "1.1.0"
}
}
}
@@ -22432,18 +20089,17 @@
"resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
"dev": true,
- "optional": true,
"requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.4",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
},
"dependencies": {
"extend-shallow": {
@@ -22451,9 +20107,8 @@
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
- "optional": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -22465,18 +20120,18 @@
"dev": true,
"optional": true,
"requires": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "fsevents": "^1.2.7",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
+ "anymatch": "2.0.0",
+ "async-each": "1.0.3",
+ "braces": "2.3.2",
+ "fsevents": "1.2.13",
+ "glob-parent": "3.1.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "4.0.1",
+ "normalize-path": "3.0.0",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.2.1",
+ "upath": "1.2.0"
}
},
"fill-range": {
@@ -22484,12 +20139,11 @@
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
"dev": true,
- "optional": true,
"requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
},
"dependencies": {
"extend-shallow": {
@@ -22497,9 +20151,8 @@
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
- "optional": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -22511,8 +20164,8 @@
"dev": true,
"optional": true,
"requires": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1"
+ "bindings": "1.5.0",
+ "nan": "2.14.2"
}
},
"glob-parent": {
@@ -22522,8 +20175,8 @@
"dev": true,
"optional": true,
"requires": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
},
"dependencies": {
"is-glob": {
@@ -22533,7 +20186,7 @@
"dev": true,
"optional": true,
"requires": {
- "is-extglob": "^2.1.0"
+ "is-extglob": "2.1.1"
}
}
}
@@ -22545,24 +20198,16 @@
"dev": true,
"optional": true,
"requires": {
- "binary-extensions": "^1.0.0"
+ "binary-extensions": "1.13.1"
}
},
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true,
- "optional": true
- },
"is-number": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
- "optional": true,
"requires": {
- "kind-of": "^3.0.2"
+ "kind-of": "3.2.2"
},
"dependencies": {
"kind-of": {
@@ -22570,9 +20215,8 @@
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
- "optional": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
@@ -22582,21 +20226,20 @@
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
"dev": true,
- "optional": true,
"requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.3",
+ "nanomatch": "1.2.13",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
}
},
"readable-stream": {
@@ -22604,141 +20247,297 @@
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
- "optional": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "graceful-fs": "4.2.6",
+ "micromatch": "3.1.10",
+ "readable-stream": "2.3.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==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ }
+ }
+ },
+ "wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+ "dev": true,
+ "requires": {
+ "defaults": "1.0.3"
+ }
+ },
+ "webdriver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.7.4.tgz",
+ "integrity": "sha512-bE6/A+OYb040GZ1MiuZebc8bOOYm797dmqEfmj6aoEQ4BMy1juiFlzCzeBzAlPrq33qPa8/CSYfH7rnkB3RRwg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "14.17.4",
+ "@wdio/config": "7.7.3",
+ "@wdio/logger": "7.7.0",
+ "@wdio/protocols": "7.7.4",
+ "@wdio/types": "7.7.3",
+ "@wdio/utils": "7.7.3",
+ "got": "11.8.2",
+ "lodash.merge": "4.6.2"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "14.17.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.4.tgz",
+ "integrity": "sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A==",
+ "dev": true
+ },
+ "@wdio/logger": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.7.0.tgz",
+ "integrity": "sha512-XX/OkC8NlvsBdhKsb9j7ZbuQtF/Vuo0xf38PXdqYtVezOrYbDuba0hPG++g/IGNuAF34ZbSi+49cvz4u5w92kQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "4.1.1",
+ "loglevel": "1.7.1",
+ "loglevel-plugin-prefix": "0.8.4",
+ "strip-ansi": "6.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "4.0.0"
+ }
+ }
+ }
+ },
+ "webdriverio": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.7.4.tgz",
+ "integrity": "sha512-VSWRj2mmvA8WbideFAYb5BMWPkBCJ7gJHhYrUSibTrMHKreRtX++cw/oGxxowy9/pTHsAW6OxlnaDxFL5Gt08A==",
+ "dev": true,
+ "requires": {
+ "@types/aria-query": "4.2.1",
+ "@types/node": "14.17.4",
+ "@wdio/config": "7.7.3",
+ "@wdio/logger": "7.7.0",
+ "@wdio/protocols": "7.7.4",
+ "@wdio/repl": "7.7.3",
+ "@wdio/types": "7.7.3",
+ "@wdio/utils": "7.7.3",
+ "archiver": "5.3.0",
+ "aria-query": "4.2.2",
+ "atob": "2.1.2",
+ "css-shorthand-properties": "1.1.1",
+ "css-value": "0.0.1",
+ "devtools": "7.7.4",
+ "devtools-protocol": "0.0.892017",
+ "fs-extra": "10.0.0",
+ "get-port": "5.1.1",
+ "grapheme-splitter": "1.0.4",
+ "lodash.clonedeep": "4.5.0",
+ "lodash.isobject": "3.0.2",
+ "lodash.isplainobject": "4.0.6",
+ "lodash.zip": "4.2.0",
+ "minimatch": "3.0.4",
+ "puppeteer-core": "9.1.1",
+ "query-selector-shadow-dom": "1.0.0",
+ "resq": "1.10.0",
+ "rgb2hex": "0.2.5",
+ "serialize-error": "8.1.0",
+ "webdriver": "7.7.4"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "14.17.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.4.tgz",
+ "integrity": "sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A==",
+ "dev": true
+ },
+ "@wdio/logger": {
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.7.0.tgz",
+ "integrity": "sha512-XX/OkC8NlvsBdhKsb9j7ZbuQtF/Vuo0xf38PXdqYtVezOrYbDuba0hPG++g/IGNuAF34ZbSi+49cvz4u5w92kQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "4.1.1",
+ "loglevel": "1.7.1",
+ "loglevel-plugin-prefix": "0.8.4",
+ "strip-ansi": "6.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "ansi-styles": "4.3.0",
+ "supports-color": "7.2.0"
}
},
- "readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
- "optional": true,
"requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
+ "color-name": "1.1.4"
}
},
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
- "optional": true,
"requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
+ "has-flag": "4.0.0"
}
}
}
},
- "wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
- "dev": true,
- "optional": true,
- "requires": {
- "defaults": "^1.0.3"
- }
- },
- "webdriver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-6.3.0.tgz",
- "integrity": "sha512-osHp5DX8eQ76Sy6/UYoECmDnUXwLhy5tlBeJh86er7S04FLAlmEqCvYXgxTSb8YtDjh9Xt9gP768RGhxR7ik5A==",
- "dev": true,
- "requires": {
- "@wdio/config": "6.1.14",
- "@wdio/logger": "6.0.16",
- "@wdio/protocols": "6.3.0",
- "@wdio/utils": "6.3.0",
- "got": "^11.0.2",
- "lodash.merge": "^4.6.1"
- }
- },
- "webdriverio": {
- "version": "6.3.4",
- "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-6.3.4.tgz",
- "integrity": "sha512-/53xQEituEFTaJtZMgg5Uz3GXY1Otqyry0LA8dYLYUNkTK0yCa26DL4ycDnWE0i9wEYNFX6YHCgiqTJjHEjKAg==",
- "dev": true,
- "requires": {
- "@types/puppeteer": "^3.0.1",
- "@wdio/config": "6.1.14",
- "@wdio/logger": "6.0.16",
- "@wdio/repl": "6.3.0",
- "@wdio/utils": "6.3.0",
- "archiver": "^4.0.1",
- "atob": "^2.1.2",
- "css-value": "^0.0.1",
- "devtools": "6.3.4",
- "get-port": "^5.1.1",
- "grapheme-splitter": "^1.0.2",
- "lodash.clonedeep": "^4.5.0",
- "lodash.isobject": "^3.0.2",
- "lodash.isplainobject": "^4.0.6",
- "lodash.zip": "^4.2.0",
- "minimatch": "^3.0.4",
- "puppeteer-core": "^5.1.0",
- "resq": "^1.6.0",
- "rgb2hex": "^0.2.0",
- "serialize-error": "^7.0.0",
- "webdriver": "6.3.0"
- }
- },
- "webidl-conversions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
- "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
- "dev": true
- },
"webpack": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz",
"integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==",
"dev": true,
"requires": {
- "acorn": "^5.0.0",
- "acorn-dynamic-import": "^2.0.0",
- "ajv": "^6.1.0",
- "ajv-keywords": "^3.1.0",
- "async": "^2.1.2",
- "enhanced-resolve": "^3.4.0",
- "escope": "^3.6.0",
- "interpret": "^1.0.0",
- "json-loader": "^0.5.4",
- "json5": "^0.5.1",
- "loader-runner": "^2.3.0",
- "loader-utils": "^1.1.0",
- "memory-fs": "~0.4.1",
- "mkdirp": "~0.5.0",
- "node-libs-browser": "^2.0.0",
- "source-map": "^0.5.3",
- "supports-color": "^4.2.1",
- "tapable": "^0.2.7",
- "uglifyjs-webpack-plugin": "^0.4.6",
- "watchpack": "^1.4.0",
- "webpack-sources": "^1.0.1",
- "yargs": "^8.0.2"
+ "acorn": "5.7.4",
+ "acorn-dynamic-import": "2.0.2",
+ "ajv": "6.12.6",
+ "ajv-keywords": "3.5.2",
+ "async": "2.6.3",
+ "enhanced-resolve": "3.4.1",
+ "escope": "3.6.0",
+ "interpret": "1.4.0",
+ "json-loader": "0.5.7",
+ "json5": "0.5.1",
+ "loader-runner": "2.4.0",
+ "loader-utils": "1.4.0",
+ "memory-fs": "0.4.1",
+ "mkdirp": "0.5.5",
+ "node-libs-browser": "2.2.1",
+ "source-map": "0.5.7",
+ "supports-color": "4.5.0",
+ "tapable": "0.2.9",
+ "uglifyjs-webpack-plugin": "0.4.6",
+ "watchpack": "1.7.5",
+ "webpack-sources": "1.4.3",
+ "yargs": "8.0.2"
},
"dependencies": {
+ "acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+ "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+ "dev": true
+ },
"ajv": {
- "version": "6.12.3",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
- "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
+ "fast-deep-equal": "3.1.3",
+ "fast-json-stable-stringify": "2.1.0",
+ "json-schema-traverse": "0.4.1",
+ "uri-js": "4.4.1"
}
},
"ansi-regex": {
@@ -22753,7 +20552,7 @@
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
"dev": true,
"requires": {
- "lodash": "^4.17.14"
+ "lodash": "4.17.21"
}
},
"camelcase": {
@@ -22768,9 +20567,9 @@
"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
"dev": true,
"requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wrap-ansi": "^2.0.0"
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
},
"dependencies": {
"string-width": {
@@ -22779,20 +20578,52 @@
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
}
}
}
},
+ "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.1.5",
+ "shebang-command": "1.2.0",
+ "which": "1.3.1"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "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.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.3",
+ "strip-eof": "1.0.0"
+ }
+ },
"find-up": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"dev": true,
"requires": {
- "locate-path": "^2.0.0"
+ "locate-path": "2.0.0"
}
},
"get-caller-file": {
@@ -22801,6 +20632,12 @@
"integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
"dev": true
},
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
"has-flag": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
@@ -22813,7 +20650,7 @@
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
- "number-is-nan": "^1.0.0"
+ "number-is-nan": "1.0.1"
}
},
"json5": {
@@ -22828,10 +20665,10 @@
"integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "strip-bom": "^3.0.0"
+ "graceful-fs": "4.2.6",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
}
},
"loader-utils": {
@@ -22840,9 +20677,9 @@
"integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
"dev": true,
"requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
+ "big.js": "5.2.2",
+ "emojis-list": "3.0.0",
+ "json5": "1.0.1"
},
"dependencies": {
"json5": {
@@ -22851,7 +20688,7 @@
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"dev": true,
"requires": {
- "minimist": "^1.2.0"
+ "minimist": "1.2.5"
}
}
}
@@ -22862,8 +20699,8 @@
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"dev": true,
"requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
}
},
"mkdirp": {
@@ -22872,7 +20709,18 @@
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
- "minimist": "^1.2.5"
+ "minimist": "1.2.5"
+ }
+ },
+ "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": {
@@ -22881,7 +20729,7 @@
"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"dev": true,
"requires": {
- "p-try": "^1.0.0"
+ "p-try": "1.0.0"
}
},
"p-locate": {
@@ -22890,7 +20738,7 @@
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
"dev": true,
"requires": {
- "p-limit": "^1.1.0"
+ "p-limit": "1.3.0"
}
},
"p-try": {
@@ -22911,7 +20759,7 @@
"integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
"dev": true,
"requires": {
- "pify": "^2.0.0"
+ "pify": "2.3.0"
}
},
"read-pkg": {
@@ -22920,9 +20768,9 @@
"integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
"dev": true,
"requires": {
- "load-json-file": "^2.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^2.0.0"
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.5.0",
+ "path-type": "2.0.0"
}
},
"read-pkg-up": {
@@ -22931,8 +20779,8 @@
"integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
"dev": true,
"requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^2.0.0"
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
}
},
"require-main-filename": {
@@ -22941,14 +20789,29 @@
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
"dev": true
},
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "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"
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
},
"dependencies": {
"ansi-regex": {
@@ -22969,7 +20832,7 @@
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true,
"requires": {
- "ansi-regex": "^3.0.0"
+ "ansi-regex": "3.0.0"
}
}
}
@@ -22980,7 +20843,7 @@
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
- "ansi-regex": "^2.0.0"
+ "ansi-regex": "2.1.1"
}
},
"strip-bom": {
@@ -22995,7 +20858,16 @@
"integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
"dev": true,
"requires": {
- "has-flag": "^2.0.0"
+ "has-flag": "2.0.0"
+ }
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
}
},
"wrap-ansi": {
@@ -23004,8 +20876,8 @@
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"dev": true,
"requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
},
"dependencies": {
"string-width": {
@@ -23014,17 +20886,17 @@
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
}
}
}
},
"y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+ "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==",
"dev": true
},
"yargs": {
@@ -23033,19 +20905,19 @@
"integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
"dev": true,
"requires": {
- "camelcase": "^4.1.0",
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "os-locale": "^2.0.0",
- "read-pkg-up": "^2.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",
- "yargs-parser": "^7.0.0"
+ "camelcase": "4.1.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.3",
+ "os-locale": "2.1.0",
+ "read-pkg-up": "2.0.0",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
+ "y18n": "3.2.2",
+ "yargs-parser": "7.0.0"
}
},
"yargs-parser": {
@@ -23054,50 +20926,32 @@
"integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
"dev": true,
"requires": {
- "camelcase": "^4.1.0"
+ "camelcase": "4.1.0"
}
}
}
},
"webpack-bundle-analyzer": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz",
- "integrity": "sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==",
- "dev": true,
- "requires": {
- "acorn": "^7.1.1",
- "acorn-walk": "^7.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.15",
- "mkdirp": "^0.5.1",
- "opener": "^1.5.1",
- "ws": "^6.0.0"
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz",
+ "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==",
+ "dev": true,
+ "requires": {
+ "acorn": "7.4.1",
+ "acorn-walk": "7.2.0",
+ "bfj": "6.1.2",
+ "chalk": "2.4.2",
+ "commander": "2.20.3",
+ "ejs": "2.7.4",
+ "express": "4.17.1",
+ "filesize": "3.6.1",
+ "gzip-size": "5.1.1",
+ "lodash": "4.17.21",
+ "mkdirp": "0.5.5",
+ "opener": "1.5.2",
+ "ws": "6.2.2"
},
"dependencies": {
- "acorn": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
- "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
- "dev": true
- },
- "acorn-walk": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
- "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
- "dev": true
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
"ejs": {
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
@@ -23110,16 +20964,16 @@
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
- "minimist": "^1.2.5"
+ "minimist": "1.2.5"
}
},
"ws": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
- "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
+ "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
"dev": true,
"requires": {
- "async-limiter": "~1.0.0"
+ "async-limiter": "1.0.1"
}
}
}
@@ -23130,8 +20984,8 @@
"integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=",
"dev": true,
"requires": {
- "source-list-map": "~0.1.7",
- "source-map": "~0.4.1"
+ "source-list-map": "0.1.8",
+ "source-map": "0.4.4"
},
"dependencies": {
"source-list-map": {
@@ -23146,7 +21000,7 @@
"integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
"dev": true,
"requires": {
- "amdefine": ">=0.0.4"
+ "amdefine": "1.0.1"
}
}
}
@@ -23157,19 +21011,19 @@
"integrity": "sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw==",
"dev": true,
"requires": {
- "loud-rejection": "^1.6.0",
- "memory-fs": "~0.4.1",
- "mime": "^2.1.0",
- "path-is-absolute": "^1.0.0",
- "range-parser": "^1.0.3",
- "url-join": "^2.0.2",
- "webpack-log": "^1.0.1"
+ "loud-rejection": "1.6.0",
+ "memory-fs": "0.4.1",
+ "mime": "2.5.2",
+ "path-is-absolute": "1.0.1",
+ "range-parser": "1.2.1",
+ "url-join": "2.0.5",
+ "webpack-log": "1.2.0"
},
"dependencies": {
"mime": {
- "version": "2.4.6",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
- "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
+ "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==",
"dev": true
}
}
@@ -23180,10 +21034,10 @@
"integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==",
"dev": true,
"requires": {
- "chalk": "^2.1.0",
- "log-symbols": "^2.1.0",
- "loglevelnext": "^1.0.1",
- "uuid": "^3.1.0"
+ "chalk": "2.4.2",
+ "log-symbols": "2.2.0",
+ "loglevelnext": "1.0.5",
+ "uuid": "3.4.0"
},
"dependencies": {
"log-symbols": {
@@ -23192,7 +21046,7 @@
"integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
"dev": true,
"requires": {
- "chalk": "^2.0.1"
+ "chalk": "2.4.2"
}
},
"uuid": {
@@ -23209,8 +21063,8 @@
"integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
"dev": true,
"requires": {
- "source-list-map": "^2.0.0",
- "source-map": "~0.6.1"
+ "source-list-map": "2.0.1",
+ "source-map": "0.6.1"
},
"dependencies": {
"source-map": {
@@ -23227,13 +21081,13 @@
"integrity": "sha1-Oh0WD7EdQXJ7fObzL3IkZPmLIYY=",
"dev": true,
"requires": {
- "gulp-util": "^3.0.7",
- "lodash.clone": "^4.3.2",
- "lodash.some": "^4.2.2",
- "memory-fs": "^0.3.0",
- "through": "^2.3.8",
- "vinyl": "^1.1.0",
- "webpack": "^1.12.9"
+ "gulp-util": "3.0.8",
+ "lodash.clone": "4.5.0",
+ "lodash.some": "4.6.0",
+ "memory-fs": "0.3.0",
+ "through": "2.3.8",
+ "vinyl": "1.2.0",
+ "webpack": "1.15.0"
},
"dependencies": {
"acorn": {
@@ -23248,8 +21102,8 @@
"integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
"dev": true,
"requires": {
- "micromatch": "^2.1.5",
- "normalize-path": "^2.0.0"
+ "micromatch": "2.3.11",
+ "normalize-path": "2.1.1"
}
},
"arr-diff": {
@@ -23258,7 +21112,7 @@
"integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
"dev": true,
"requires": {
- "arr-flatten": "^1.0.1"
+ "arr-flatten": "1.1.0"
}
},
"array-unique": {
@@ -23291,9 +21145,9 @@
"integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
"dev": true,
"requires": {
- "expand-range": "^1.8.1",
- "preserve": "^0.2.0",
- "repeat-element": "^1.1.2"
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.4"
}
},
"browserify-aes": {
@@ -23302,7 +21156,7 @@
"integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=",
"dev": true,
"requires": {
- "inherits": "^2.0.1"
+ "inherits": "2.0.3"
}
},
"browserify-zlib": {
@@ -23311,7 +21165,7 @@
"integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
"dev": true,
"requires": {
- "pako": "~0.2.0"
+ "pako": "0.2.9"
}
},
"buffer": {
@@ -23320,9 +21174,9 @@
"integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
"dev": true,
"requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
+ "base64-js": "1.5.1",
+ "ieee754": "1.2.1",
+ "isarray": "1.0.0"
}
},
"camelcase": {
@@ -23337,15 +21191,15 @@
"integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
"dev": true,
"requires": {
- "anymatch": "^1.3.0",
- "async-each": "^1.0.0",
- "fsevents": "^1.0.0",
- "glob-parent": "^2.0.0",
- "inherits": "^2.0.1",
- "is-binary-path": "^1.0.0",
- "is-glob": "^2.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.0.0"
+ "anymatch": "1.3.2",
+ "async-each": "1.0.3",
+ "fsevents": "1.2.13",
+ "glob-parent": "2.0.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "2.0.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.2.1"
}
},
"cliui": {
@@ -23354,8 +21208,8 @@
"integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
"dev": true,
"requires": {
- "center-align": "^0.1.1",
- "right-align": "^0.1.1",
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
"wordwrap": "0.0.2"
}
},
@@ -23377,6 +21231,12 @@
"sha.js": "2.2.6"
}
},
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
"emojis-list": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
@@ -23389,9 +21249,9 @@
"integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "memory-fs": "^0.2.0",
- "tapable": "^0.1.8"
+ "graceful-fs": "4.2.6",
+ "memory-fs": "0.2.0",
+ "tapable": "0.1.10"
},
"dependencies": {
"memory-fs": {
@@ -23414,7 +21274,7 @@
"integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
"dev": true,
"requires": {
- "is-posix-bracket": "^0.1.0"
+ "is-posix-bracket": "0.1.1"
}
},
"extglob": {
@@ -23423,7 +21283,7 @@
"integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
"dev": true,
"requires": {
- "is-extglob": "^1.0.0"
+ "is-extglob": "1.0.0"
}
},
"fill-range": {
@@ -23432,10 +21292,10 @@
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
"dev": true,
"requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
},
"dependencies": {
"extend-shallow": {
@@ -23444,7 +21304,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -23456,8 +21316,8 @@
"dev": true,
"optional": true,
"requires": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1"
+ "bindings": "1.5.0",
+ "nan": "2.14.2"
}
},
"glob-parent": {
@@ -23466,7 +21326,7 @@
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"dev": true,
"requires": {
- "is-glob": "^2.0.0"
+ "is-glob": "2.0.1"
}
},
"has-flag": {
@@ -23493,7 +21353,7 @@
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
"dev": true,
"requires": {
- "kind-of": "^6.0.0"
+ "kind-of": "6.0.3"
},
"dependencies": {
"kind-of": {
@@ -23510,22 +21370,16 @@
"integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
"dev": true,
"requires": {
- "binary-extensions": "^1.0.0"
+ "binary-extensions": "1.13.1"
}
},
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
"is-data-descriptor": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
"dev": true,
"requires": {
- "kind-of": "^6.0.0"
+ "kind-of": "6.0.3"
},
"dependencies": {
"kind-of": {
@@ -23542,9 +21396,9 @@
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.3"
},
"dependencies": {
"kind-of": {
@@ -23567,7 +21421,7 @@
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
"requires": {
- "is-extglob": "^1.0.0"
+ "is-extglob": "1.0.0"
}
},
"is-number": {
@@ -23576,7 +21430,7 @@
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "kind-of": "3.2.2"
}
},
"json5": {
@@ -23591,7 +21445,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
},
"loader-utils": {
@@ -23600,10 +21454,10 @@
"integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
"dev": true,
"requires": {
- "big.js": "^3.1.3",
- "emojis-list": "^2.0.0",
- "json5": "^0.5.0",
- "object-assign": "^4.0.1"
+ "big.js": "3.2.0",
+ "emojis-list": "2.1.0",
+ "json5": "0.5.1",
+ "object-assign": "4.1.1"
}
},
"memory-fs": {
@@ -23612,8 +21466,8 @@
"integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=",
"dev": true,
"requires": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
+ "errno": "0.1.8",
+ "readable-stream": "2.3.7"
}
},
"micromatch": {
@@ -23622,19 +21476,19 @@
"integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
"dev": true,
"requires": {
- "arr-diff": "^2.0.0",
- "array-unique": "^0.2.1",
- "braces": "^1.8.2",
- "expand-brackets": "^0.1.4",
- "extglob": "^0.3.1",
- "filename-regex": "^2.0.0",
- "is-extglob": "^1.0.0",
- "is-glob": "^2.0.1",
- "kind-of": "^3.0.2",
- "normalize-path": "^2.0.1",
- "object.omit": "^2.0.0",
- "parse-glob": "^3.0.4",
- "regex-cache": "^0.4.2"
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
}
},
"mkdirp": {
@@ -23643,7 +21497,7 @@
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
- "minimist": "^1.2.5"
+ "minimist": "1.2.5"
}
},
"node-libs-browser": {
@@ -23652,28 +21506,28 @@
"integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=",
"dev": true,
"requires": {
- "assert": "^1.1.1",
- "browserify-zlib": "^0.1.4",
- "buffer": "^4.9.0",
- "console-browserify": "^1.1.0",
- "constants-browserify": "^1.0.0",
+ "assert": "1.5.0",
+ "browserify-zlib": "0.1.4",
+ "buffer": "4.9.2",
+ "console-browserify": "1.2.0",
+ "constants-browserify": "1.0.0",
"crypto-browserify": "3.3.0",
- "domain-browser": "^1.1.1",
- "events": "^1.0.0",
+ "domain-browser": "1.2.0",
+ "events": "1.1.1",
"https-browserify": "0.0.1",
- "os-browserify": "^0.2.0",
+ "os-browserify": "0.2.1",
"path-browserify": "0.0.0",
- "process": "^0.11.0",
- "punycode": "^1.2.4",
- "querystring-es3": "^0.2.0",
- "readable-stream": "^2.0.5",
- "stream-browserify": "^2.0.1",
- "stream-http": "^2.3.1",
- "string_decoder": "^0.10.25",
- "timers-browserify": "^2.0.2",
+ "process": "0.11.10",
+ "punycode": "1.4.1",
+ "querystring-es3": "0.2.1",
+ "readable-stream": "2.3.7",
+ "stream-browserify": "2.0.2",
+ "stream-http": "2.8.3",
+ "string_decoder": "0.10.31",
+ "timers-browserify": "2.0.12",
"tty-browserify": "0.0.0",
- "url": "^0.11.0",
- "util": "^0.10.3",
+ "url": "0.11.0",
+ "util": "0.10.4",
"vm-browserify": "0.0.4"
},
"dependencies": {
@@ -23691,7 +21545,7 @@
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
"dev": true,
"requires": {
- "remove-trailing-separator": "^1.0.1"
+ "remove-trailing-separator": "1.1.0"
}
},
"os-browserify": {
@@ -23724,13 +21578,13 @@
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.1",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
}
},
"readdirp": {
@@ -23739,9 +21593,9 @@
"integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
+ "graceful-fs": "4.2.6",
+ "micromatch": "3.1.10",
+ "readable-stream": "2.3.7"
},
"dependencies": {
"arr-diff": {
@@ -23762,16 +21616,16 @@
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
"dev": true,
"requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.4",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
},
"dependencies": {
"extend-shallow": {
@@ -23780,7 +21634,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -23791,13 +21645,13 @@
"integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
"dev": true,
"requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
},
"dependencies": {
"define-property": {
@@ -23806,7 +21660,7 @@
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
"dev": true,
"requires": {
- "is-descriptor": "^0.1.0"
+ "is-descriptor": "0.1.6"
}
},
"extend-shallow": {
@@ -23815,7 +21669,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
},
"is-descriptor": {
@@ -23824,9 +21678,9 @@
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
"dev": true,
"requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
}
},
"kind-of": {
@@ -23843,14 +21697,14 @@
"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
"dev": true,
"requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
},
"dependencies": {
"define-property": {
@@ -23859,7 +21713,7 @@
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
"dev": true,
"requires": {
- "is-descriptor": "^1.0.0"
+ "is-descriptor": "1.0.2"
}
},
"extend-shallow": {
@@ -23868,7 +21722,7 @@
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
"dev": true,
"requires": {
- "is-extendable": "^0.1.0"
+ "is-extendable": "0.1.1"
}
}
}
@@ -23879,7 +21733,7 @@
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "kind-of": "3.2.2"
},
"dependencies": {
"kind-of": {
@@ -23888,7 +21742,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
@@ -23899,7 +21753,7 @@
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "kind-of": "3.2.2"
},
"dependencies": {
"kind-of": {
@@ -23908,7 +21762,7 @@
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"dev": true,
"requires": {
- "is-buffer": "^1.1.5"
+ "is-buffer": "1.1.6"
}
}
}
@@ -23925,19 +21779,19 @@
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
"dev": true,
"requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.3",
+ "nanomatch": "1.2.13",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
}
}
}
@@ -23960,13 +21814,22 @@
"integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=",
"dev": true
},
+ "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==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
"supports-color": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
"integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
"dev": true,
"requires": {
- "has-flag": "^1.0.0"
+ "has-flag": "1.0.0"
}
},
"tapable": {
@@ -23981,8 +21844,8 @@
"integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
"dev": true,
"requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
}
},
"uglify-js": {
@@ -23991,10 +21854,10 @@
"integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=",
"dev": true,
"requires": {
- "async": "~0.2.6",
- "source-map": "~0.5.1",
- "uglify-to-browserify": "~1.0.0",
- "yargs": "~3.10.0"
+ "async": "0.2.10",
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
},
"dependencies": {
"async": {
@@ -24020,8 +21883,8 @@
"integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
"dev": true,
"requires": {
- "clone": "^1.0.0",
- "clone-stats": "^0.0.1",
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
"replace-ext": "0.0.1"
}
},
@@ -24040,9 +21903,9 @@
"integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=",
"dev": true,
"requires": {
- "async": "^0.9.0",
- "chokidar": "^1.0.0",
- "graceful-fs": "^4.1.2"
+ "async": "0.9.2",
+ "chokidar": "1.7.0",
+ "graceful-fs": "4.2.6"
},
"dependencies": {
"async": {
@@ -24059,21 +21922,21 @@
"integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=",
"dev": true,
"requires": {
- "acorn": "^3.0.0",
- "async": "^1.3.0",
- "clone": "^1.0.2",
- "enhanced-resolve": "~0.9.0",
- "interpret": "^0.6.4",
- "loader-utils": "^0.2.11",
- "memory-fs": "~0.3.0",
- "mkdirp": "~0.5.0",
- "node-libs-browser": "^0.7.0",
- "optimist": "~0.6.0",
- "supports-color": "^3.1.0",
- "tapable": "~0.1.8",
- "uglify-js": "~2.7.3",
- "watchpack": "^0.2.1",
- "webpack-core": "~0.6.9"
+ "acorn": "3.3.0",
+ "async": "1.5.2",
+ "clone": "1.0.4",
+ "enhanced-resolve": "0.9.1",
+ "interpret": "0.6.6",
+ "loader-utils": "0.2.17",
+ "memory-fs": "0.3.0",
+ "mkdirp": "0.5.5",
+ "node-libs-browser": "0.7.0",
+ "optimist": "0.6.1",
+ "supports-color": "3.2.3",
+ "tapable": "0.1.10",
+ "uglify-js": "2.7.5",
+ "watchpack": "0.2.9",
+ "webpack-core": "0.6.9"
}
},
"wordwrap": {
@@ -24088,9 +21951,9 @@
"integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
"dev": true,
"requires": {
- "camelcase": "^1.0.2",
- "cliui": "^2.1.0",
- "decamelize": "^1.0.0",
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
"window-size": "0.1.0"
}
}
@@ -24102,9 +21965,9 @@
"integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
"dev": true,
"requires": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
+ "http-parser-js": "0.5.3",
+ "safe-buffer": "5.1.2",
+ "websocket-extensions": "0.1.4"
}
},
"websocket-extensions": {
@@ -24113,52 +21976,26 @@
"integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
"dev": true
},
- "whatwg-encoding": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
- "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
- "dev": true,
- "requires": {
- "iconv-lite": "0.4.24"
- }
- },
- "whatwg-mimetype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
- "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
- "dev": true
- },
- "whatwg-url": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
- "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
- "dev": true,
- "requires": {
- "lodash.sortby": "^4.7.0",
- "tr46": "^1.0.1",
- "webidl-conversions": "^4.0.2"
- }
- },
"which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": {
- "isexe": "^2.0.0"
+ "isexe": "2.0.0"
}
},
"which-boxed-primitive": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz",
- "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
"dev": true,
"requires": {
- "is-bigint": "^1.0.0",
- "is-boolean-object": "^1.0.0",
- "is-number-object": "^1.0.3",
- "is-string": "^1.0.4",
- "is-symbol": "^1.0.2"
+ "is-bigint": "1.0.2",
+ "is-boolean-object": "1.1.1",
+ "is-number-object": "1.0.5",
+ "is-string": "1.0.6",
+ "is-symbol": "1.0.4"
}
},
"which-collection": {
@@ -24167,10 +22004,10 @@
"integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
"dev": true,
"requires": {
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-weakmap": "^2.0.1",
- "is-weakset": "^2.0.1"
+ "is-map": "2.0.2",
+ "is-set": "2.0.2",
+ "is-weakmap": "2.0.1",
+ "is-weakset": "2.0.1"
}
},
"which-module": {
@@ -24180,17 +22017,18 @@
"dev": true
},
"which-typed-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz",
- "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz",
+ "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==",
"dev": true,
"requires": {
- "available-typed-arrays": "^1.0.2",
- "es-abstract": "^1.17.5",
- "foreach": "^2.0.5",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.1",
- "is-typed-array": "^1.1.3"
+ "available-typed-arrays": "1.0.4",
+ "call-bind": "1.0.2",
+ "es-abstract": "1.18.3",
+ "foreach": "2.0.5",
+ "function-bind": "1.1.1",
+ "has-symbols": "1.0.2",
+ "is-typed-array": "1.1.5"
}
},
"wide-align": {
@@ -24199,7 +22037,7 @@
"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
"dev": true,
"requires": {
- "string-width": "^1.0.2 || 2"
+ "string-width": "2.1.1"
},
"dependencies": {
"ansi-regex": {
@@ -24220,8 +22058,8 @@
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"dev": true,
"requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
}
},
"strip-ansi": {
@@ -24230,7 +22068,7 @@
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true,
"requires": {
- "ansi-regex": "^3.0.0"
+ "ansi-regex": "3.0.0"
}
}
}
@@ -24254,30 +22092,29 @@
"dev": true
},
"workerpool": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz",
- "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==",
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.4.tgz",
+ "integrity": "sha512-jGWPzsUqzkow8HoAvqaPWTUPCrlPJaJ5tY8Iz7n1uCz3tTp6s3CDG0FF1NsX42WNlkRSW6Mr+CDZGnNoSsKa7g==",
"dev": true
},
"wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
+ "ansi-styles": "4.3.0",
+ "string-width": "4.2.2",
+ "strip-ansi": "6.0.0"
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
+ "color-convert": "2.0.1"
}
},
"color-convert": {
@@ -24286,7 +22123,7 @@
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "color-name": "~1.1.4"
+ "color-name": "1.1.4"
}
},
"color-name": {
@@ -24309,7 +22146,7 @@
"integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
"dev": true,
"requires": {
- "mkdirp": "^0.5.1"
+ "mkdirp": "0.5.5"
},
"dependencies": {
"mkdirp": {
@@ -24318,44 +22155,15 @@
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
- "minimist": "^1.2.5"
+ "minimist": "1.2.5"
}
}
}
},
- "write-file-atomic": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz",
- "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.11",
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.2"
- }
- },
"ws": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
- "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
- "dev": true
- },
- "x-is-string": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
- "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
- "dev": true
- },
- "xml-name-validator": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
- "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
- "dev": true
- },
- "xmlhttprequest-ssl": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
- "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
+ "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
"dev": true
},
"xtend": {
@@ -24365,9 +22173,9 @@
"dev": true
},
"y18n": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
- "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true
},
"yallist": {
@@ -24383,147 +22191,28 @@
"dev": true
},
"yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
},
"yargs-unparser": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
- "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
"dev": true,
"requires": {
- "flat": "^4.1.0",
- "lodash": "^4.17.15",
- "yargs": "^13.3.0"
+ "camelcase": "6.2.0",
+ "decamelize": "4.0.0",
+ "flat": "5.0.2",
+ "is-plain-obj": "2.1.0"
},
"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
- },
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- }
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.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=",
- "dev": true
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "camelcase": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
"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"
- }
- },
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- }
- },
- "yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "dev": true,
- "requires": {
- "cliui": "^5.0.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^2.0.1",
- "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.1.2"
- }
- },
- "yargs-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
}
}
},
@@ -24533,9 +22222,9 @@
"integrity": "sha1-V/RQULgu/VcYKzlzxUqgXLXSUjA=",
"dev": true,
"requires": {
- "cac": "^3.0.3",
- "chalk": "^1.1.3",
- "cross-spawn": "^4.0.2"
+ "cac": "3.0.4",
+ "chalk": "1.1.3",
+ "cross-spawn": "4.0.2"
},
"dependencies": {
"ansi-regex": {
@@ -24556,11 +22245,11 @@
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
}
},
"strip-ansi": {
@@ -24569,7 +22258,7 @@
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
- "ansi-regex": "^2.0.0"
+ "ansi-regex": "2.1.1"
}
},
"supports-color": {
@@ -24586,26 +22275,32 @@
"integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
"dev": true,
"requires": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
+ "buffer-crc32": "0.2.13",
+ "fd-slicer": "1.1.0"
}
},
- "yeast": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
- "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true
},
"zip-stream": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-3.0.1.tgz",
- "integrity": "sha512-r+JdDipt93ttDjsOVPU5zaq5bAyY+3H19bDrThkvuVxC0xMQzU1PJcS6D+KrP3u96gH9XLomcHPb+2skoDjulQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz",
+ "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==",
"dev": true,
"requires": {
- "archiver-utils": "^2.1.0",
- "compress-commons": "^3.0.0",
- "readable-stream": "^3.6.0"
+ "archiver-utils": "2.1.0",
+ "compress-commons": "4.1.1",
+ "readable-stream": "3.6.0"
}
+ },
+ "zwitch": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
+ "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
+ "dev": true
}
}
}
diff --git a/package.json b/package.json
index 6df9993806c..f4835b03bdc 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "4.42.0-pre",
+ "version": "5.7.0-pre",
"description": "Header Bidding Management Library",
"main": "src/prebid.js",
"scripts": {
@@ -28,28 +28,29 @@
"@babel/preset-env": "^7.8.4",
"@jsdevtools/coverage-istanbul-loader": "^3.0.3",
"@wdio/browserstack-service": "^6.1.4",
- "@wdio/cli": "^6.1.5",
- "@wdio/concise-reporter": "^6.1.5",
- "@wdio/local-runner": "^6.1.7",
- "@wdio/mocha-framework": "^6.1.6",
- "@wdio/spec-reporter": "^6.1.5",
- "@wdio/sync": "^6.1.5",
+ "@wdio/cli": "^7.5.2",
+ "@wdio/concise-reporter": "^7.5.2",
+ "@wdio/local-runner": "^7.5.2",
+ "@wdio/mocha-framework": "^7.5.2",
+ "@wdio/spec-reporter": "^7.5.2",
+ "@wdio/sync": "^7.5.2",
"ajv": "5.5.2",
"babel-loader": "^8.0.5",
"body-parser": "^1.19.0",
"chai": "^4.2.0",
"coveralls": "^3.1.0",
"deep-equal": "^2.0.3",
- "documentation": "^5.2.2",
+ "documentation": "^13.2.5",
"es5-shim": "^4.5.14",
+ "eslint": "^7.27.0",
"eslint-config-standard": "^10.2.1",
"eslint-plugin-import": "^2.20.2",
- "eslint-plugin-node": "^5.1.0",
+ "eslint-plugin-node": "^11.1.0",
"eslint-plugin-prebid": "file:./plugins/eslint",
- "eslint-plugin-promise": "^3.5.0",
+ "eslint-plugin-promise": "^5.1.0",
"eslint-plugin-standard": "^3.0.1",
"execa": "^1.0.0",
- "faker": "^3.1.0",
+ "faker": "^5.5.3",
"fs.extra": "^1.3.2",
"gulp": "^4.0.0",
"gulp-clean": "^0.3.2",
@@ -57,34 +58,34 @@
"gulp-connect": "^5.7.0",
"gulp-eslint": "^4.0.0",
"gulp-footer": "^2.0.2",
- "gulp-header": "^1.7.1",
- "gulp-if": "^2.0.2",
+ "gulp-header": "^2.0.9",
+ "gulp-if": "^3.0.0",
"gulp-js-escape": "^1.0.1",
"gulp-replace": "^1.0.0",
- "gulp-shell": "^0.5.2",
- "gulp-sourcemaps": "^2.6.0",
- "gulp-uglify": "^3.0.0",
+ "gulp-shell": "^0.8.0",
+ "gulp-sourcemaps": "^3.0.0",
+ "gulp-terser": "^2.0.1",
"gulp-util": "^3.0.0",
- "is-docker": "^1.1.0",
+ "is-docker": "^2.2.1",
"istanbul": "^0.4.5",
- "karma": "^4.0.0",
- "karma-babel-preprocessor": "^6.0.1",
+ "karma": "^6.3.2",
+ "karma-babel-preprocessor": "^8.0.1",
"karma-browserstack-launcher": "1.4.0",
"karma-chai": "^0.1.0",
- "karma-chrome-launcher": "^2.2.0",
+ "karma-chrome-launcher": "^3.1.0",
"karma-coverage": "^2.0.1",
- "karma-coverage-istanbul-reporter": "^1.3.0",
+ "karma-coverage-istanbul-reporter": "^3.0.3",
"karma-es5-shim": "^0.0.4",
- "karma-firefox-launcher": "^1.3.0",
+ "karma-firefox-launcher": "^2.1.0",
"karma-ie-launcher": "^1.0.0",
- "karma-mocha": "^1.3.0",
+ "karma-mocha": "^2.0.1",
"karma-mocha-reporter": "^2.2.5",
"karma-opera-launcher": "^1.0.0",
"karma-safari-launcher": "^1.0.0",
"karma-script-launcher": "^1.0.0",
"karma-sinon": "^1.0.5",
"karma-sourcemap-loader": "^0.3.7",
- "karma-spec-reporter": "^0.0.31",
+ "karma-spec-reporter": "^0.0.32",
"karma-webpack": "^3.0.5",
"lodash": "^4.17.21",
"mocha": "^5.0.0",
@@ -92,9 +93,9 @@
"opn": "^5.4.0",
"resolve-from": "^5.0.0",
"sinon": "^4.1.3",
- "through2": "^2.0.3",
+ "through2": "^4.0.2",
"url-parse": "^1.0.5",
- "webdriverio": "^6.1.5",
+ "webdriverio": "^7.6.1",
"webpack": "^3.0.0",
"webpack-bundle-analyzer": "^3.8.0",
"webpack-stream": "^3.2.0",
@@ -102,8 +103,8 @@
},
"dependencies": {
"babel-plugin-transform-object-assign": "^6.22.0",
- "core-js": "^3.0.0",
- "core-js-pure": "^3.6.5",
+ "core-js": "^3.13.0",
+ "core-js-pure": "^3.13.0",
"criteo-direct-rsa-validate": "^1.1.0",
"crypto-js": "^3.3.0",
"dlv": "1.1.3",
diff --git a/src/AnalyticsAdapter.js b/src/AnalyticsAdapter.js
index 80c12a3eb8e..97513b80cc7 100644
--- a/src/AnalyticsAdapter.js
+++ b/src/AnalyticsAdapter.js
@@ -18,6 +18,7 @@ const {
BIDDER_DONE,
SET_TARGETING,
AD_RENDER_FAILED,
+ AD_RENDER_SUCCEEDED,
AUCTION_DEBUG,
ADD_AD_UNITS
}
@@ -113,6 +114,7 @@ export default function AnalyticsAdapter({ url, analyticsType, global, handler }
[SET_TARGETING]: args => this.enqueue({ eventType: SET_TARGETING, args }),
[AUCTION_END]: args => this.enqueue({ eventType: AUCTION_END, args }),
[AD_RENDER_FAILED]: args => this.enqueue({ eventType: AD_RENDER_FAILED, args }),
+ [AD_RENDER_SUCCEEDED]: args => this.enqueue({ eventType: AD_RENDER_SUCCEEDED, args }),
[AUCTION_DEBUG]: args => this.enqueue({ eventType: AUCTION_DEBUG, args }),
[ADD_AD_UNITS]: args => this.enqueue({ eventType: ADD_AD_UNITS, args }),
[AUCTION_INIT]: args => {
diff --git a/src/ajax.js b/src/ajax.js
index b1e4cbdbdff..a6317e7963d 100644
--- a/src/ajax.js
+++ b/src/ajax.js
@@ -66,7 +66,7 @@ export function ajaxBuilder(timeout = 3000, {request, done} = {}) {
}
x.open(method, url, true);
- // IE needs timoeut to be set after open - see #1410
+ // IE needs timeout to be set after open - see #1410
// Disabled timeout temporarily to avoid xhr failed requests. https://github.com/prebid/Prebid.js/issues/2648
if (!config.getConfig('disableAjaxTimeout')) {
x.timeout = timeout;
@@ -94,6 +94,7 @@ export function ajaxBuilder(timeout = 3000, {request, done} = {}) {
}
} catch (error) {
utils.logError('xhr construction', error);
+ typeof callback === 'object' && callback !== null && callback.error(error);
}
}
}
diff --git a/src/constants.json b/src/constants.json
index c43e88cf75f..77d87e056d9 100644
--- a/src/constants.json
+++ b/src/constants.json
@@ -37,6 +37,7 @@
"REQUEST_BIDS": "requestBids",
"ADD_AD_UNITS": "addAdUnits",
"AD_RENDER_FAILED": "adRenderFailed",
+ "AD_RENDER_SUCCEEDED": "adRenderSucceeded",
"TCF2_ENFORCEMENT": "tcf2Enforcement",
"AUCTION_DEBUG": "auctionDebug",
"BID_VIEWABLE": "bidViewable",
@@ -79,10 +80,8 @@
"PRICE_BUCKET": "hb_pb",
"SIZE": "hb_size",
"DEAL": "hb_deal",
- "SOURCE": "hb_source",
"FORMAT": "hb_format",
"UUID": "hb_uuid",
- "CACHE_ID": "hb_cache_id",
"CACHE_HOST": "hb_cache_host"
},
"NATIVE_KEYS": {
diff --git a/src/prebid.js b/src/prebid.js
index f58c97ec581..3264a5fc60b 100644
--- a/src/prebid.js
+++ b/src/prebid.js
@@ -23,7 +23,7 @@ const events = require('./events.js');
const { triggerUserSyncs } = userSync;
/* private variables */
-const { ADD_AD_UNITS, BID_WON, REQUEST_BIDS, SET_TARGETING, AD_RENDER_FAILED, STALE_RENDER } = CONSTANTS.EVENTS;
+const { ADD_AD_UNITS, BID_WON, REQUEST_BIDS, SET_TARGETING, AD_RENDER_FAILED, AD_RENDER_SUCCEEDED, STALE_RENDER } = CONSTANTS.EVENTS;
const { PREVENT_WRITING_ON_MAIN_DOCUMENT, NO_AD, EXCEPTION, CANNOT_FIND_AD, MISSING_DOC_OR_ADID } = CONSTANTS.AD_RENDER_FAILED_REASON;
const eventValidators = {
@@ -140,6 +140,20 @@ function validateNativeMediaType(adUnit) {
return validatedAdUnit;
}
+function validateAdUnitPos(adUnit, mediaType) {
+ let pos = utils.deepAccess(adUnit, `mediaTypes.${mediaType}.pos`);
+
+ if (!pos || !utils.isNumber(pos) || !isFinite(pos)) {
+ let warning = `Value of property 'pos' on ad unit ${adUnit.code} should be of type: Number`;
+
+ utils.logWarn(warning);
+ events.emit(CONSTANTS.EVENTS.AUCTION_DEBUG, {type: 'WARNING', arguments: warning});
+ delete adUnit.mediaTypes[mediaType].pos;
+ }
+
+ return adUnit
+}
+
export const adUnitSetupChecks = {
validateBannerMediaType,
validateVideoMediaType,
@@ -167,10 +181,12 @@ export const checkAdUnitSetup = hook('sync', function (adUnits) {
if (mediaTypes.banner) {
validatedBanner = validateBannerMediaType(adUnit);
+ if (mediaTypes.banner.hasOwnProperty('pos')) validatedBanner = validateAdUnitPos(validatedBanner, 'banner');
}
if (mediaTypes.video) {
validatedVideo = validatedBanner ? validateVideoMediaType(validatedBanner) : validateVideoMediaType(adUnit);
+ if (mediaTypes.video.hasOwnProperty('pos')) validatedVideo = validateAdUnitPos(validatedVideo, 'video');
}
if (mediaTypes.native) {
@@ -375,6 +391,14 @@ function emitAdRenderFail({ reason, message, bid, id }) {
events.emit(AD_RENDER_FAILED, data);
}
+function emitAdRenderSucceeded({ doc, bid, id }) {
+ const data = { doc };
+ if (bid) data.bid = bid;
+ if (id) data.adId = id;
+
+ events.emit(AD_RENDER_SUCCEEDED, data);
+}
+
/**
* This function will render the ad (based on params) in the given iframe document passed through.
* Note that doc SHOULD NOT be the parent document page as we can't doc.write() asynchronously
@@ -382,7 +406,7 @@ function emitAdRenderFail({ reason, message, bid, id }) {
* @param {string} id bid id to locate the ad
* @alias module:pbjs.renderAd
*/
-$$PREBID_GLOBAL$$.renderAd = function (doc, id, options) {
+$$PREBID_GLOBAL$$.renderAd = hook('async', function (doc, id, options) {
utils.logInfo('Invoking $$PREBID_GLOBAL$$.renderAd', arguments);
utils.logMessage('Calling renderAd with adId :' + id);
@@ -422,10 +446,11 @@ $$PREBID_GLOBAL$$.renderAd = function (doc, id, options) {
const {height, width, ad, mediaType, adUrl, renderer} = bid;
const creativeComment = document.createComment(`Creative ${bid.creativeId} served by ${bid.bidder} Prebid.js Header Bidding`);
- utils.insertElement(creativeComment, doc, 'body');
if (isRendererRequired(renderer)) {
executeRenderer(renderer, bid);
+ utils.insertElement(creativeComment, doc, 'html');
+ emitAdRenderSucceeded({ doc, bid, id });
} else if ((doc === document && !utils.inIframe()) || mediaType === 'video') {
const message = `Error trying to write ad. Ad render call ad id ${id} was prevented from writing to the main document.`;
emitAdRenderFail({reason: PREVENT_WRITING_ON_MAIN_DOCUMENT, message, bid, id});
@@ -443,7 +468,9 @@ $$PREBID_GLOBAL$$.renderAd = function (doc, id, options) {
doc.write(ad);
doc.close();
setRenderSize(doc, width, height);
+ utils.insertElement(creativeComment, doc, 'html');
utils.callBurl(bid);
+ emitAdRenderSucceeded({ doc, bid, id });
} else if (adUrl) {
const iframe = utils.createInvisibleIframe();
iframe.height = height;
@@ -454,7 +481,9 @@ $$PREBID_GLOBAL$$.renderAd = function (doc, id, options) {
utils.insertElement(iframe, doc, 'body');
setRenderSize(doc, width, height);
+ utils.insertElement(creativeComment, doc, 'html');
utils.callBurl(bid);
+ emitAdRenderSucceeded({ doc, bid, id });
} else {
const message = `Error trying to write ad. No ad for bid response id: ${id}`;
emitAdRenderFail({reason: NO_AD, message, bid, id});
@@ -472,7 +501,7 @@ $$PREBID_GLOBAL$$.renderAd = function (doc, id, options) {
const message = `Error trying to write ad Id :${id} to the page. Missing document or adId`;
emitAdRenderFail({ reason: MISSING_DOC_OR_ADID, message, id });
}
-};
+});
/**
* Remove adUnit from the $$PREBID_GLOBAL$$ configuration, if there are no addUnitCode(s) it will remove all
diff --git a/src/refererDetection.js b/src/refererDetection.js
index 56d1fa43f7b..7e9f2a7e6c7 100644
--- a/src/refererDetection.js
+++ b/src/refererDetection.js
@@ -42,6 +42,10 @@ export function detectReferer(win) {
* @returns {string|null}
*/
function getCanonicalUrl(doc) {
+ let pageURL = config.getConfig('pageUrl');
+
+ if (pageURL) return pageURL;
+
try {
const element = doc.querySelector("link[rel='canonical']");
diff --git a/src/secureCreatives.js b/src/secureCreatives.js
index a172ec62630..60e60688c64 100644
--- a/src/secureCreatives.js
+++ b/src/secureCreatives.js
@@ -6,7 +6,7 @@
import events from './events.js';
import { fireNativeTrackers, getAssetMessage, getAllAssetsMessage } from './native.js';
import constants from './constants.json';
-import { logWarn, replaceAuctionPrice, deepAccess } from './utils.js';
+import { logWarn, replaceAuctionPrice, deepAccess, isGptPubadsDefined, isApnGetTagDefined } from './utils.js';
import { auctionManager } from './auctionManager.js';
import find from 'core-js-pure/features/array/find.js';
import { isRendererRequired, executeRenderer } from './Renderer.js';
@@ -118,9 +118,9 @@ function resizeRemoteCreative({ adId, adUnitCode, width, height }) {
}
function getElementIdBasedOnAdServer(adId, adUnitCode) {
- if (window.googletag) {
+ if (isGptPubadsDefined()) {
return getDfpElementId(adId)
- } else if (window.apntag) {
+ } else if (isApnGetTagDefined()) {
return getAstElementId(adUnitCode)
} else {
return adUnitCode;
diff --git a/src/sizeMapping.js b/src/sizeMapping.js
index 313da3f422a..cd5f1190069 100644
--- a/src/sizeMapping.js
+++ b/src/sizeMapping.js
@@ -121,22 +121,17 @@ function evaluateSizeConfig(configs) {
return configs.reduce((results, config) => {
if (
typeof config === 'object' &&
- typeof config.mediaQuery === 'string'
+ typeof config.mediaQuery === 'string' &&
+ config.mediaQuery.length > 0
) {
let ruleMatch = false;
- // TODO: (Prebid - 4.0) Remove empty mediaQuery string check. Disallow empty mediaQuery in sizeConfig.
- // Refer: https://github.com/prebid/Prebid.js/pull/4691, https://github.com/prebid/Prebid.js/issues/4810 for more details.
- if (config.mediaQuery === '') {
- ruleMatch = true;
- } else {
- try {
- ruleMatch = getWindowTop().matchMedia(config.mediaQuery).matches;
- } catch (e) {
- logWarn('Unfriendly iFrame blocks sizeConfig from being correctly evaluated');
-
- ruleMatch = matchMedia(config.mediaQuery).matches;
- }
+ try {
+ ruleMatch = getWindowTop().matchMedia(config.mediaQuery).matches;
+ } catch (e) {
+ logWarn('Unfriendly iFrame blocks sizeConfig from being correctly evaluated');
+
+ ruleMatch = matchMedia(config.mediaQuery).matches;
}
if (ruleMatch) {
diff --git a/src/targeting.js b/src/targeting.js
index 365453e1e8f..edf9521c251 100644
--- a/src/targeting.js
+++ b/src/targeting.js
@@ -597,13 +597,19 @@ export function newTargeting(auctionManager) {
const standardKeys = TARGETING_KEYS.concat(NATIVE_TARGETING_KEYS);
const adUnitBidLimit = config.getConfig('sendBidsControl.bidLimit');
const bids = getHighestCpmBidsFromBidPool(bidsReceived, getHighestCpm, adUnitBidLimit);
+ const allowSendAllBidsTargetingKeys = config.getConfig('targetingControls.allowSendAllBidsTargetingKeys');
+
+ const allowedSendAllBidTargeting = allowSendAllBidsTargetingKeys
+ ? allowSendAllBidsTargetingKeys.map((key) => CONSTANTS.TARGETING_KEYS[key])
+ : standardKeys;
// populate targeting keys for the remaining bids
return bids.map(bid => {
if (bidShouldBeAddedToTargeting(bid, adUnitCodes)) {
return {
[bid.adUnitCode]: getTargetingMap(bid, standardKeys.filter(
- key => typeof bid.adserverTargeting[key] !== 'undefined')
+ key => typeof bid.adserverTargeting[key] !== 'undefined' &&
+ allowedSendAllBidTargeting.indexOf(key) !== -1)
)
};
}
diff --git a/src/utils.js b/src/utils.js
index 35ce3e7d0dd..03c76529ddf 100644
--- a/src/utils.js
+++ b/src/utils.js
@@ -665,6 +665,12 @@ export function isGptPubadsDefined() {
}
}
+export function isApnGetTagDefined() {
+ if (window.apntag && isFn(window.apntag.getTag)) {
+ return true;
+ }
+}
+
// This function will get highest cpm value bid, in case of tie it will return the bid with lowest timeToRespond
export const getHighestCpm = getHighestCpmCallback('timeToRespond', (previous, current) => previous > current);
diff --git a/test/.eslintrc.js b/test/.eslintrc.js
index 842bccd99b1..1048b8be173 100644
--- a/test/.eslintrc.js
+++ b/test/.eslintrc.js
@@ -25,6 +25,7 @@ module.exports = {
"no-tabs": "off",
"no-unused-expressions": "off",
"import/no-duplicates": "off",
+ "import/extensions": "off",
"no-template-curly-in-string": "off",
"no-global-assign": "off",
"no-path-concat": "off",
diff --git a/test/spec/AnalyticsAdapter_spec.js b/test/spec/AnalyticsAdapter_spec.js
index 2b36848bd8f..a4acb6fc414 100644
--- a/test/spec/AnalyticsAdapter_spec.js
+++ b/test/spec/AnalyticsAdapter_spec.js
@@ -9,6 +9,7 @@ const BID_RESPONSE = CONSTANTS.EVENTS.BID_RESPONSE;
const BID_WON = CONSTANTS.EVENTS.BID_WON;
const BID_TIMEOUT = CONSTANTS.EVENTS.BID_TIMEOUT;
const AD_RENDER_FAILED = CONSTANTS.EVENTS.AD_RENDER_FAILED;
+const AD_RENDER_SUCCEEDED = CONSTANTS.EVENTS.AD_RENDER_SUCCEEDED;
const AUCTION_DEBUG = CONSTANTS.EVENTS.AUCTION_DEBUG;
const ADD_AD_UNITS = CONSTANTS.EVENTS.ADD_AD_UNITS;
@@ -86,6 +87,17 @@ FEATURE: Analytics Adapters API
expect(result).to.deep.equal({args: {call: 'adRenderFailed'}, eventType: 'adRenderFailed'});
});
+ it('SHOULD call global when a adRenderSucceeded event occurs', function () {
+ const eventType = AD_RENDER_SUCCEEDED;
+ const args = { call: 'adRenderSucceeded' };
+
+ adapter.enableAnalytics();
+ events.emit(eventType, args);
+
+ let result = JSON.parse(server.requests[0].requestBody);
+ expect(result).to.deep.equal({args: {call: 'adRenderSucceeded'}, eventType: 'adRenderSucceeded'});
+ });
+
it('SHOULD call global when an auction debug event occurs', function () {
const eventType = AUCTION_DEBUG;
const args = { call: 'auctionDebug' };
diff --git a/test/spec/integration/faker/fixtures.js b/test/spec/integration/faker/fixtures.js
index a11bd126d61..6a65da37d37 100644
--- a/test/spec/integration/faker/fixtures.js
+++ b/test/spec/integration/faker/fixtures.js
@@ -23,7 +23,7 @@ export function makeBidder(overrides = {}) {
bidder: `${faker.company.bsBuzz()}Media`,
params: {
abc: faker.random.alphaNumeric(10),
- xyz: faker.random.number({ max: 10, precision: 2 })
+ xyz: faker.datatype.number({ max: 10, precision: 2 })
},
callBids: sinon.spy()
}, overrides);
@@ -39,4 +39,4 @@ export function makeRequest(overrides = {}) {
}, overrides);
}
-export function randomFive() { return faker.random.number({ min: 10000, max: 99999 }); }
+export function randomFive() { return faker.datatype.number({ min: 10000, max: 99999 }); }
diff --git a/test/spec/modules/microadBidAdapter_spec.js b/test/spec/microadBidAdapter_spec.js
similarity index 86%
rename from test/spec/modules/microadBidAdapter_spec.js
rename to test/spec/microadBidAdapter_spec.js
index 8298e2bd559..be310fb8e3c 100644
--- a/test/spec/modules/microadBidAdapter_spec.js
+++ b/test/spec/microadBidAdapter_spec.js
@@ -265,6 +265,36 @@ describe('microadBidAdapter', () => {
expect(request.url.lastIndexOf('https', 0) === 0).to.be.true;
});
});
+
+ it('should add Liveramp identity link if it is available in request parameters', () => {
+ const bidRequestWithLiveramp = Object.assign({}, bidRequestTemplate, {
+ userId: {idl_env: 'idl-env-sample'}
+ });
+ const requests = spec.buildRequests([bidRequestWithLiveramp], bidderRequest)
+ requests.forEach(request => {
+ expect(request.data).to.deep.equal(
+ Object.assign({}, expectedResultTemplate, {
+ cbt: request.data.cbt,
+ idl_env: 'idl-env-sample'
+ })
+ );
+ })
+ });
+
+ it('should not add Liveramp identity link if it is not available in request parameters', () => {
+ const bidRequestWithLiveramp = Object.assign({}, bidRequestTemplate, {
+ userId: {}
+ });
+ const requests = spec.buildRequests([bidRequestWithLiveramp], bidderRequest)
+ const expectedResult = Object.assign({}, expectedResultTemplate)
+ requests.forEach(request => {
+ expect(request.data).to.deep.equal(
+ Object.assign({}, expectedResultTemplate, {
+ cbt: request.data.cbt
+ })
+ );
+ })
+ });
});
describe('interpretResponse', () => {
@@ -278,7 +308,10 @@ describe('microadBidAdapter', () => {
ttl: 10,
creativeId: 'creative-id',
netRevenue: true,
- currency: 'JPY'
+ currency: 'JPY',
+ meta: {
+ advertiserDomains: ['foobar.com']
+ }
}
};
const expectedBidResponseTemplate = {
@@ -290,7 +323,10 @@ describe('microadBidAdapter', () => {
ttl: 10,
creativeId: 'creative-id',
netRevenue: true,
- currency: 'JPY'
+ currency: 'JPY',
+ meta: {
+ advertiserDomains: ['foobar.com']
+ }
};
it('should return nothing if server response body does not contain cpm', () => {
@@ -324,6 +360,16 @@ describe('microadBidAdapter', () => {
expect(spec.interpretResponse(serverResponseWithDealId)).to.deep.equal([expectedBidResponse]);
});
+
+ it('should return a valid bidResponse without meta if serverResponse is valid, has a nonzero cpm and no deal id', () => {
+ const serverResponseWithoutMeta = Object.assign({}, utils.deepClone(serverResponseTemplate));
+ delete serverResponseWithoutMeta.body.meta;
+ const expectedBidResponse = Object.assign({}, expectedBidResponseTemplate, {
+ meta: { advertiserDomains: [] }
+ });
+
+ expect(spec.interpretResponse(serverResponseWithoutMeta)).to.deep.equal([expectedBidResponse]);
+ });
});
describe('getUserSyncs', () => {
diff --git a/test/spec/modules/1ad4goodBidAdapter_spec.js b/test/spec/modules/1ad4goodBidAdapter_spec.js
deleted file mode 100644
index b9cd86a4cf7..00000000000
--- a/test/spec/modules/1ad4goodBidAdapter_spec.js
+++ /dev/null
@@ -1,548 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/1ad4goodBidAdapter.js';
-import { newBidder } from 'src/adapters/bidderFactory.js';
-import * as bidderFactory from 'src/adapters/bidderFactory.js';
-import { deepClone } from 'src/utils.js';
-import { config } from 'src/config.js';
-
-const ENDPOINT = 'https://hb.1ad4good.org/prebid';
-
-describe('AdforgoodAdapter', 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': '1ad4good',
- 'params': {
- 'placementId': '10433394'
- },
- 'adUnitCode': 'adunit-code',
- '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 = {
- 'placementId': 0
- };
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- let bidRequests = [
- {
- 'bidder': '1ad4good',
- 'params': {
- 'placementId': '10433394'
- },
- 'adUnitCode': 'adunit-code',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '30b31c1838de1e',
- 'bidderRequestId': '22edbae2733bf6',
- 'auctionId': '1d1a030790a475',
- }
- ];
-
- it('should parse out private sizes', function () {
- let bidRequest = Object.assign({},
- bidRequests[0],
- {
- params: {
- placementId: '10433394',
- privateSizes: [300, 250]
- }
- }
- );
-
- const request = spec.buildRequests([bidRequest]);
- const payload = JSON.parse(request.data);
-
- expect(payload.tags[0].private_sizes).to.exist;
- expect(payload.tags[0].private_sizes).to.deep.equal([{width: 300, height: 250}]);
- });
-
- it('should add source and verison to the tag', function () {
- const request = spec.buildRequests(bidRequests);
- const payload = JSON.parse(request.data);
- expect(payload.sdk).to.exist;
- expect(payload.sdk).to.deep.equal({
- source: 'pbjs',
- version: '$prebid.version$'
- });
- });
-
- it('should populate the ad_types array on all requests', function () {
- ['banner', 'video'].forEach(type => {
- const bidRequest = Object.assign({}, bidRequests[0]);
- bidRequest.mediaTypes = {};
- bidRequest.mediaTypes[type] = {};
-
- const request = spec.buildRequests([bidRequest]);
- const payload = JSON.parse(request.data);
-
- expect(payload.tags[0].ad_types).to.deep.equal([type]);
- });
- });
-
- it('should populate the ad_types array on outstream requests', function () {
- const bidRequest = Object.assign({}, bidRequests[0]);
- bidRequest.mediaTypes = {};
- bidRequest.mediaTypes.video = {context: 'outstream'};
-
- const request = spec.buildRequests([bidRequest]);
- const payload = JSON.parse(request.data);
-
- expect(payload.tags[0].ad_types).to.deep.equal(['video']);
- });
-
- it('sends bid request to ENDPOINT via POST', function () {
- const request = spec.buildRequests(bidRequests);
- expect(request.url).to.equal(ENDPOINT);
- expect(request.method).to.equal('POST');
- });
-
- it('should attach valid video params to the tag', function () {
- let bidRequest = Object.assign({},
- bidRequests[0],
- {
- params: {
- placementId: '10433394',
- video: {
- id: 123,
- minduration: 100,
- foobar: 'invalid'
- }
- }
- }
- );
-
- const request = spec.buildRequests([bidRequest]);
- const payload = JSON.parse(request.data);
- expect(payload.tags[0].video).to.deep.equal({
- id: 123,
- minduration: 100
- });
- });
-
- it('should add video property when adUnit includes a renderer', function () {
- const videoData = {
- mediaTypes: {
- video: {
- context: 'outstream',
- mimes: ['video/mp4']
- }
- },
- params: {
- placementId: '10433394',
- video: {
- skippable: true,
- playback_method: ['auto_play_sound_off']
- }
- }
- };
-
- let bidRequest1 = deepClone(bidRequests[0]);
- bidRequest1 = Object.assign({}, bidRequest1, videoData, {
- renderer: {
- url: 'http://test.renderer.url',
- render: function () {}
- }
- });
-
- let bidRequest2 = deepClone(bidRequests[0]);
- bidRequest2.adUnitCode = 'adUnit_code_2';
- bidRequest2 = Object.assign({}, bidRequest2, videoData);
-
- const request = spec.buildRequests([bidRequest1, bidRequest2]);
- const payload = JSON.parse(request.data);
- expect(payload.tags[0].video).to.deep.equal({
- skippable: true,
- playback_method: ['auto_play_sound_off'],
- custom_renderer_present: true
- });
- expect(payload.tags[1].video).to.deep.equal({
- skippable: true,
- playback_method: ['auto_play_sound_off']
- });
- });
-
- it('should attach valid user params to the tag', function () {
- let bidRequest = Object.assign({},
- bidRequests[0],
- {
- params: {
- placementId: '10433394',
- user: {
- externalUid: '123',
- foobar: 'invalid'
- }
- }
- }
- );
-
- const request = spec.buildRequests([bidRequest]);
- const payload = JSON.parse(request.data);
-
- expect(payload.user).to.exist;
- expect(payload.user).to.deep.equal({
- externalUid: '123',
- });
- });
-
- // it('should always populated tags[].sizes with 1,1 for native if otherwise not defined', function () {
- // let bidRequest = Object.assign({},
- // bidRequests[0],
- // {
- // mediaType: 'native',
- // nativeParams: {
- // image: { required: true }
- // }
- // }
- // );
- // bidRequest.sizes = [[150, 100], [300, 250]];
-
- // let request = spec.buildRequests([bidRequest]);
- // let payload = JSON.parse(request.data);
- // expect(payload.tags[0].sizes).to.deep.equal([{width: 150, height: 100}, {width: 300, height: 250}]);
-
- // delete bidRequest.sizes;
-
- // request = spec.buildRequests([bidRequest]);
- // payload = JSON.parse(request.data);
-
- // expect(payload.tags[0].sizes).to.deep.equal([{width: 1, height: 1}]);
- // });
-
- it('should convert keyword params to proper form and attaches to request', function () {
- let bidRequest = Object.assign({},
- bidRequests[0],
- {
- params: {
- placementId: '10433394',
- keywords: {
- single: 'val',
- singleArr: ['val'],
- singleArrNum: [5],
- multiValMixed: ['value1', 2, 'value3'],
- singleValNum: 123,
- emptyStr: '',
- emptyArr: [''],
- badValue: {'foo': 'bar'} // should be dropped
- }
- }
- }
- );
-
- const request = spec.buildRequests([bidRequest]);
- const payload = JSON.parse(request.data);
-
- expect(payload.tags[0].keywords).to.deep.equal([{
- 'key': 'single',
- 'value': ['val']
- }, {
- 'key': 'singleArr',
- 'value': ['val']
- }, {
- 'key': 'singleArrNum',
- 'value': ['5']
- }, {
- 'key': 'multiValMixed',
- 'value': ['value1', '2', 'value3']
- }, {
- 'key': 'singleValNum',
- 'value': ['123']
- }, {
- 'key': 'emptyStr'
- }, {
- 'key': 'emptyArr'
- }]);
- });
-
- it('should add payment rules to the request', function () {
- let bidRequest = Object.assign({},
- bidRequests[0],
- {
- params: {
- placementId: '10433394',
- usePaymentRule: true
- }
- }
- );
-
- const request = spec.buildRequests([bidRequest]);
- const payload = JSON.parse(request.data);
-
- expect(payload.tags[0].use_pmt_rule).to.equal(true);
- });
-
- it('should add gdpr consent information to the request', function () {
- let consentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
- let bidderRequest = {
- 'bidderCode': '1ad4good',
- 'auctionId': '1d1a030790a475',
- 'bidderRequestId': '22edbae2733bf6',
- 'timeout': 3000,
- 'gdprConsent': {
- consentString: consentString,
- gdprApplies: true
- }
- };
- bidderRequest.bids = bidRequests;
-
- const request = spec.buildRequests(bidRequests, bidderRequest);
- const payload = JSON.parse(request.data);
-
- expect(payload.gdpr_consent).to.exist;
- expect(payload.gdpr_consent.consent_string).to.exist.and.to.equal(consentString);
- expect(payload.gdpr_consent.consent_required).to.exist.and.to.be.true;
- });
-
- it('supports sending hybrid mobile app parameters', function () {
- let appRequest = Object.assign({},
- bidRequests[0],
- {
- params: {
- placementId: '10433394',
- app: {
- id: 'B1O2W3M4AN.com.prebid.webview',
- geo: {
- lat: 40.0964439,
- lng: -75.3009142
- },
- device_id: {
- idfa: '4D12078D-3246-4DA4-AD5E-7610481E7AE', // Apple advertising identifier
- aaid: '38400000-8cf0-11bd-b23e-10b96e40000d', // Android advertising identifier
- md5udid: '5756ae9022b2ea1e47d84fead75220c8', // MD5 hash of the ANDROID_ID
- sha1udid: '4DFAA92388699AC6539885AEF1719293879985BF', // SHA1 hash of the ANDROID_ID
- windowsadid: '750c6be243f1c4b5c9912b95a5742fc5' // Windows advertising identifier
- }
- }
- }
- }
- );
- const request = spec.buildRequests([appRequest]);
- const payload = JSON.parse(request.data);
- expect(payload.app).to.exist;
- expect(payload.app).to.deep.equal({
- appid: 'B1O2W3M4AN.com.prebid.webview'
- });
- expect(payload.device.device_id).to.exist;
- expect(payload.device.device_id).to.deep.equal({
- aaid: '38400000-8cf0-11bd-b23e-10b96e40000d',
- idfa: '4D12078D-3246-4DA4-AD5E-7610481E7AE',
- md5udid: '5756ae9022b2ea1e47d84fead75220c8',
- sha1udid: '4DFAA92388699AC6539885AEF1719293879985BF',
- windowsadid: '750c6be243f1c4b5c9912b95a5742fc5'
- });
- expect(payload.device.geo).to.exist;
- expect(payload.device.geo).to.deep.equal({
- lat: 40.0964439,
- lng: -75.3009142
- });
- });
-
- 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,
- stack: [
- 'http://example.com/page.html',
- 'http://example.com/iframe1.html',
- 'http://example.com/iframe2.html'
- ]
- }
- }
- const request = spec.buildRequests([bidRequest], bidderRequest);
- const payload = JSON.parse(request.data);
-
- expect(payload.referrer_detection).to.exist;
- expect(payload.referrer_detection).to.deep.equal({
- rd_ref: 'http%3A%2F%2Fexample.com%2Fpage.html',
- rd_top: true,
- rd_ifs: 2,
- rd_stk: bidderRequest.refererInfo.stack.map((url) => encodeURIComponent(url)).join(',')
- });
- });
- })
-
- describe('interpretResponse', function () {
- let bfStub;
- before(function() {
- bfStub = sinon.stub(bidderFactory, 'getIabSubCategory');
- });
-
- after(function() {
- bfStub.restore();
- });
-
- let response = {
- 'version': '3.0.0',
- 'tags': [
- {
- 'uuid': '3db3773286ee59',
- 'tag_id': 10433394,
- 'auction_id': '4534722592064951574',
- 'nobid': false,
- 'no_ad_url': 'http://lax1-ib.adnxs.com/no-ad',
- 'timeout_ms': 10000,
- 'ad_profile_id': 27079,
- 'ads': [
- {
- 'content_source': 'rtb',
- 'ad_type': 'banner',
- 'buyer_member_id': 958,
- 'creative_id': 29681110,
- 'media_type_id': 1,
- 'media_subtype_id': 1,
- 'cpm': 0.5,
- 'cpm_publisher_currency': 0.5,
- 'publisher_currency_code': '$',
- 'client_initiated_ad_counting': true,
- 'viewability': {
- 'config': ''
- },
- 'rtb': {
- 'banner': {
- 'content': '',
- 'width': 300,
- 'height': 250
- },
- 'trackers': [
- {
- 'impression_urls': [
- 'http://lax1-ib.adnxs.com/impression'
- ],
- 'video_events': {}
- }
- ]
- }
- }
- ]
- }
- ]
- };
-
- it('should get correct bid response', function () {
- let expectedResponse = [
- {
- 'requestId': '3db3773286ee59',
- 'cpm': 0.5,
- 'creativeId': 29681110,
- 'dealId': undefined,
- 'width': 300,
- 'height': 250,
- 'ad': '',
- 'mediaType': 'banner',
- 'currency': 'USD',
- 'ttl': 300,
- 'netRevenue': true,
- 'adUnitCode': 'code',
- 'ads4good': {
- 'buyerMemberId': 958
- }
- }
- ];
- let bidderRequest = {
- bids: [{
- bidId: '3db3773286ee59',
- adUnitCode: 'code'
- }]
- }
- let result = spec.interpretResponse({ body: response }, {bidderRequest});
- expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
- });
-
- it('handles nobid responses', function () {
- let response = {
- 'version': '0.0.1',
- 'tags': [{
- 'uuid': '84ab500420319d',
- 'tag_id': 5976557,
- 'auction_id': '297492697822162468',
- 'nobid': true
- }]
- };
- let bidderRequest;
-
- let result = spec.interpretResponse({ body: response }, {bidderRequest});
- expect(result.length).to.equal(0);
- });
-
- it('handles non-banner media responses', function () {
- let response = {
- 'tags': [{
- 'uuid': '84ab500420319d',
- 'ads': [{
- 'ad_type': 'video',
- 'cpm': 0.500000,
- 'notify_url': 'imptracker.com',
- 'rtb': {
- 'video': {
- 'content': ''
- }
- },
- 'javascriptTrackers': ''
- }]
- }]
- };
- let bidderRequest = {
- bids: [{
- bidId: '84ab500420319d',
- adUnitCode: 'code'
- }]
- }
-
- let result = spec.interpretResponse({ body: response }, {bidderRequest});
- expect(result[0]).to.have.property('vastUrl');
- expect(result[0]).to.have.property('vastImpUrl');
- expect(result[0]).to.have.property('mediaType', 'video');
- });
-
- it('should add deal_priority and deal_code', function() {
- let responseWithDeal = deepClone(response);
- responseWithDeal.tags[0].ads[0].deal_priority = 'high';
- responseWithDeal.tags[0].ads[0].deal_code = '123';
-
- let bidderRequest = {
- bids: [{
- bidId: '3db3773286ee59',
- adUnitCode: 'code'
- }]
- }
- let result = spec.interpretResponse({ body: responseWithDeal }, {bidderRequest});
- expect(Object.keys(result[0].ads4good)).to.include.members(['buyerMemberId', 'dealPriority', 'dealCode']);
- });
-
- it('should add advertiser id', function() {
- let responseAdvertiserId = deepClone(response);
- responseAdvertiserId.tags[0].ads[0].advertiser_id = '123';
-
- let bidderRequest = {
- bids: [{
- bidId: '3db3773286ee59',
- adUnitCode: 'code'
- }]
- }
- let result = spec.interpretResponse({ body: responseAdvertiserId }, {bidderRequest});
- expect(Object.keys(result[0].meta)).to.include.members(['advertiserId']);
- })
- });
-});
diff --git a/test/spec/modules/7xbidBidAdapter_spec.js b/test/spec/modules/7xbidBidAdapter_spec.js
deleted file mode 100644
index bed2c604349..00000000000
--- a/test/spec/modules/7xbidBidAdapter_spec.js
+++ /dev/null
@@ -1,160 +0,0 @@
-import {expect} from 'chai';
-import {spec, _getUrlVars} from 'modules/7xbidBidAdapter.js';
-import * as utils from 'src/utils.js';
-
-const BASE_URI = '//bidder.7xbid.com/api/v1/prebid/banner'
-const NATIVE_BASE_URI = '//bidder.7xbid.com/api/v1/prebid/native'
-
-describe('7xbid adapter', function() {
- let bidRequests;
- let nativeBidRequests;
-
- beforeEach(function() {
- bidRequests = [
- {
- bidder: '7xbid',
- params: {
- placementId: 1425292,
- currency: 'USD'
- }
- }
- ]
-
- nativeBidRequests = [
- {
- bidder: '7xbid',
- params: {
- placementId: 1429695,
- currency: 'USD'
- },
- nativeParams: {
- title: {
- required: true,
- len: 80
- },
- image: {
- required: true,
- sizes: [150, 50]
- },
- sponsoredBy: {
- required: true
- }
- }
- }
- ]
- })
- describe('isBidRequestValid', function () {
- it('valid bid case', function () {
- let validBid = {
- bidder: '7xbid',
- params: {
- placementId: 1425292,
- currency: 'USD'
- }
- }
- let isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(true);
- });
-
- it('invalid bid case: placementId is not passed', function() {
- let validBid = {
- bidder: '7xbid',
- params: {
- }
- }
- let isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- })
-
- it('invalid bid case: currency is not support', function() {
- let validBid = {
- bidder: '7xbid',
- params: {
- placementId: 1108295,
- currency: 'AUD'
- }
- }
- let isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- })
- })
-
- describe('buildRequests', function () {
- it('sends bid request to ENDPOINT via GET', function () {
- const request = spec.buildRequests(bidRequests)[0];
- expect(request.url).to.equal(BASE_URI);
- expect(request.method).to.equal('GET');
- });
-
- it('sends native bid request to ENDPOINT via GET', function () {
- const request = spec.buildRequests(nativeBidRequests)[0];
- expect(request.url).to.equal(NATIVE_BASE_URI);
- expect(request.method).to.equal('GET');
- });
-
- it('buildRequests function should not modify original bidRequests object', function () {
- let originalBidRequests = utils.deepClone(bidRequests);
- let request = spec.buildRequests(bidRequests);
- expect(bidRequests).to.deep.equal(originalBidRequests);
- });
-
- it('buildRequests function should not modify original nativeBidRequests object', function () {
- let originalBidRequests = utils.deepClone(nativeBidRequests);
- let request = spec.buildRequests(nativeBidRequests);
- expect(nativeBidRequests).to.deep.equal(originalBidRequests);
- });
-
- it('Request params check', function() {
- let request = spec.buildRequests(bidRequests)[0];
- const data = _getUrlVars(request.data)
- expect(parseInt(data.placementid)).to.exist.and.to.equal(bidRequests[0].params.placementId);
- expect(data.cur).to.exist.and.to.equal(bidRequests[0].params.currency);
- })
-
- it('Native request params check', function() {
- let request = spec.buildRequests(nativeBidRequests)[0];
- const data = _getUrlVars(request.data)
- expect(parseInt(data.placementid)).to.exist.and.to.equal(nativeBidRequests[0].params.placementId);
- expect(data.cur).to.exist.and.to.equal(nativeBidRequests[0].params.currency);
- })
- })
-
- describe('interpretResponse', function () {
- let response = {
- 1425292:
- {
- 'creativeId': '',
- 'cur': 'USD',
- 'price': 0.0920,
- 'width': 300,
- 'height': 250,
- 'requestid': '2e42361a6172bf',
- 'adm': ''
- }
- }
-
- it('should get correct bid response', function () {
- let expectedResponse = [
- {
- 'requestId': '2e42361a6172bf',
- 'cpm': 0.0920,
- 'width': 300,
- 'height': 250,
- 'netRevenue': true,
- 'currency': 'USD',
- 'creativeId': '',
- 'ttl': 700,
- 'ad': ''
- }
- ];
- let request = spec.buildRequests(bidRequests)[0];
- let result = spec.interpretResponse({body: response}, request);
- expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
- expect(result[0].cpm).to.not.equal(null);
- expect(result[0].creativeId).to.not.equal(null);
- expect(result[0].ad).to.not.equal(null);
- expect(result[0].currency).to.equal('USD');
- expect(result[0].netRevenue).to.equal(true);
- });
- })
-})
diff --git a/test/spec/modules/aardvarkBidAdapter_spec.js b/test/spec/modules/aardvarkBidAdapter_spec.js
deleted file mode 100644
index 9671f961407..00000000000
--- a/test/spec/modules/aardvarkBidAdapter_spec.js
+++ /dev/null
@@ -1,569 +0,0 @@
-import { expect } from 'chai';
-import * as utils from 'src/utils.js';
-import { spec, resetUserSync } from 'modules/aardvarkBidAdapter.js';
-
-describe('aardvarkAdapterTest', function () {
- describe('forming valid bidRequests', function () {
- it('should accept valid bidRequests', function () {
- expect(spec.isBidRequestValid({
- bidder: 'aardvark',
- params: {
- ai: 'xiby',
- sc: 'TdAx',
- },
- sizes: [[300, 250]]
- })).to.equal(true);
- });
-
- it('should reject invalid bidRequests', function () {
- expect(spec.isBidRequestValid({
- bidder: 'aardvark',
- params: {
- ai: 'xiby',
- },
- sizes: [[300, 250]]
- })).to.equal(false);
- });
- });
-
- describe('executing network requests', function () {
- const bidRequests = [{
- bidder: 'aardvark',
- params: {
- ai: 'xiby',
- sc: 'TdAx',
- },
- adUnitCode: 'aaa',
- 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' }
- },
- {
- bidder: 'aardvark',
- params: {
- ai: 'xiby',
- sc: 'RAZd',
- host: 'adzone.pub.com'
- },
- adUnitCode: 'bbb',
- transactionId: '193995b4-7122-4739-959b-2463282a138b',
- sizes: [[800, 600]],
- bidId: '22aidtbx5eabd9',
- bidderRequestId: '70deaff71c281d',
- auctionId: 'e97cafd0-ebfc-4f5c-b7c9-baa0fd335a4a'
- }];
-
- const bidderRequest = {
- refererInfo: {
- referer: 'https://example.com'
- }
- };
-
- it('should use HTTP GET method', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- requests.forEach(function (requestItem) {
- expect(requestItem.method).to.equal('GET');
- });
- });
-
- it('should call the correct bidRequest url', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- expect(requests.length).to.equal(1);
- expect(requests[0].url).to.match(new RegExp('^https:\/\/adzone.pub.com/xiby/TdAx_RAZd/aardvark\?'));
- });
-
- it('should have correct data', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- expect(requests.length).to.equal(1);
- expect(requests[0].data.version).to.equal(1);
- expect(requests[0].data.jsonp).to.equal(false);
- expect(requests[0].data.TdAx).to.equal('1abgs362e0x48a8');
- expect(requests[0].data.rtkreferer).to.not.be.undefined;
- expect(requests[0].data.RAZd).to.equal('22aidtbx5eabd9');
- });
-
- it('should have tdid, it is available in bidRequest', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- requests.forEach(function (requestItem) {
- expect(requestItem.data.tdid).to.equal('eff98622-b5fd-44fa-9a49-6e846922d532');
- });
- });
- });
-
- describe('splitting multi-auction ad units into own requests', function () {
- const bidRequests = [{
- bidder: 'aardvark',
- params: {
- ai: 'Toby',
- sc: 'TdAx',
- categories: ['cat1', 'cat2']
- },
- adUnitCode: 'aaa',
- transactionId: '1b8389fe-615c-482d-9f1a-177fb8f7d5b0',
- sizes: [300, 250],
- bidId: '1abgs362e0x48a8',
- bidderRequestId: '70deaff71c281d',
- auctionId: '5c66da22-426a-4bac-b153-77360bef5337'
- },
- {
- bidder: 'aardvark',
- params: {
- ai: 'xiby',
- sc: 'RAZd',
- host: 'adzone.pub.com'
- },
- adUnitCode: 'bbb',
- transactionId: '193995b4-7122-4739-959b-2463282a138b',
- sizes: [[800, 600]],
- bidId: '22aidtbx5eabd9',
- bidderRequestId: '70deaff71c281d',
- auctionId: 'e97cafd0-ebfc-4f5c-b7c9-baa0fd335a4a'
- }];
-
- const bidderRequest = {
- refererInfo: {
- referer: 'https://example.com'
- }
- };
-
- it('should use HTTP GET method', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- requests.forEach(function (requestItem) {
- expect(requestItem.method).to.equal('GET');
- });
- });
-
- it('should call the correct bidRequest urls for each auction', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- expect(requests[0].url).to.match(new RegExp('^https:\/\/bidder.rtk.io/Toby/TdAx/aardvark\?'));
- expect(requests[0].data.categories.length).to.equal(2);
- expect(requests[1].url).to.match(new RegExp('^https:\/\/adzone.pub.com/xiby/RAZd/aardvark\?'));
- });
-
- it('should have correct data', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- expect(requests.length).to.equal(2);
- expect(requests[0].data.version).to.equal(1);
- expect(requests[0].data.jsonp).to.equal(false);
- expect(requests[0].data.TdAx).to.equal('1abgs362e0x48a8');
- expect(requests[0].data.rtkreferer).to.not.be.undefined;
- expect(requests[0].data.RAZd).to.be.undefined;
- expect(requests[1].data.version).to.equal(1);
- expect(requests[1].data.jsonp).to.equal(false);
- expect(requests[1].data.TdAx).to.be.undefined;
- expect(requests[1].data.rtkreferer).to.not.be.undefined;
- expect(requests[1].data.RAZd).to.equal('22aidtbx5eabd9');
- });
-
- it('should have no tdid, it is not available in bidRequest', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- requests.forEach(function (requestItem) {
- expect(requestItem.data.tdid).to.be.undefined;
- });
- });
- });
-
- describe('GDPR conformity', function () {
- const bidRequests = [{
- bidder: 'aardvark',
- params: {
- ai: 'xiby',
- sc: 'TdAx',
- },
- adUnitCode: 'aaa',
- transactionId: '1b8389fe-615c-482d-9f1a-177fb8f7d5b0',
- sizes: [300, 250],
- bidId: '1abgs362e0x48a8',
- bidderRequestId: '70deaff71c281d',
- auctionId: '5c66da22-426a-4bac-b153-77360bef5337'
- }];
-
- const bidderRequest = {
- gdprConsent: {
- consentString: 'awefasdfwefasdfasd',
- gdprApplies: true
- },
- refererInfo: {
- referer: 'https://example.com'
- }
- };
-
- it('should transmit correct data', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- expect(requests.length).to.equal(1);
- expect(requests[0].data.gdpr).to.equal(true);
- expect(requests[0].data.consent).to.equal('awefasdfwefasdfasd');
- });
- });
-
- describe('GDPR absence conformity', function () {
- const bidRequests = [{
- bidder: 'aardvark',
- params: {
- ai: 'xiby',
- sc: 'TdAx',
- },
- adUnitCode: 'aaa',
- transactionId: '1b8389fe-615c-482d-9f1a-177fb8f7d5b0',
- sizes: [300, 250],
- bidId: '1abgs362e0x48a8',
- bidderRequestId: '70deaff71c281d',
- auctionId: '5c66da22-426a-4bac-b153-77360bef5337'
- }];
-
- const bidderRequest = {
- gdprConsent: undefined,
- refererInfo: {
- referer: 'https://example.com'
- }
- };
-
- it('should transmit correct data', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- expect(requests.length).to.equal(1);
- expect(requests[0].data.gdpr).to.be.undefined;
- expect(requests[0].data.consent).to.be.undefined;
- });
- });
-
- describe('CCPA conformity', function () {
- const bidRequests = [{
- bidder: 'aardvark',
- params: {
- ai: 'xiby',
- sc: 'TdAx',
- },
- adUnitCode: 'aaa',
- transactionId: '1b8389fe-615c-482d-9f1a-177fb8f7d5b0',
- sizes: [300, 250],
- bidId: '1abgs362e0x48a8',
- bidderRequestId: '70deaff71c281d',
- auctionId: '5c66da22-426a-4bac-b153-77360bef5337'
- }];
-
- it('should transmit us_privacy data', function () {
- const usp = '1NY-';
- const bidderRequest = {
- gdprConsent: {
- consentString: 'awefasdfwefasdfasd',
- gdprApplies: true
- },
- refererInfo: {
- referer: 'http://example.com'
- },
- uspConsent: usp
- };
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- expect(requests.length).to.equal(1);
- expect(requests[0].data.gdpr).to.equal(true);
- expect(requests[0].data.consent).to.equal('awefasdfwefasdfasd');
- expect(requests[0].data.us_privacy).to.equal(usp);
- });
-
- it('should not send us_privacy', function () {
- const bidderRequest = {
- refererInfo: {
- referer: 'http://example.com'
- }
- };
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- expect(requests.length).to.equal(1);
- expect(requests[0].data.gdpr).to.be.undefined;
- expect(requests[0].data.consent).to.be.undefined;
- expect(requests[0].data.us_privacy).to.be.undefined;
- });
- });
-
- describe('interpretResponse', function () {
- it('should handle bid responses', function () {
- const serverResponse = {
- body: [
- {
- media: 'banner',
- nurl: 'https://www.nurl.com/0',
- cpm: 0.09,
- width: 300,
- height: 250,
- cid: '22aidtbx5eabd9',
- adm: '',
- dealId: 'dealing',
- ttl: 200,
- },
- {
- media: 'banner',
- nurl: 'https://www.nurl.com/1',
- cpm: 0.19,
- width: 300,
- height: 250,
- cid: '1abgs362e0x48a8',
- adm: '',
- ttl: 200,
- ex: 'extraproperty'
- }
- ],
- headers: {}
- };
-
- const result = spec.interpretResponse(serverResponse, {});
- expect(result.length).to.equal(2);
-
- expect(result[0].requestId).to.equal('22aidtbx5eabd9');
- expect(result[0].cpm).to.equal(0.09);
- expect(result[0].width).to.equal(300);
- expect(result[0].height).to.equal(250);
- expect(result[0].currency).to.equal('USD');
- expect(result[0].ttl).to.equal(200);
- expect(result[0].dealId).to.equal('dealing');
- expect(result[0].ex).to.be.undefined;
- expect(result[0].ad).to.not.be.undefined;
-
- expect(result[1].requestId).to.equal('1abgs362e0x48a8');
- expect(result[1].cpm).to.equal(0.19);
- expect(result[1].width).to.equal(300);
- expect(result[1].height).to.equal(250);
- expect(result[1].currency).to.equal('USD');
- expect(result[1].ttl).to.equal(200);
- expect(result[1].ad).to.not.be.undefined;
- expect(result[1].ex).to.equal('extraproperty');
- });
-
- it('should handle nobid responses', function () {
- var emptyResponse = [{
- nurl: '',
- cid: '9e5a09319e18f1',
- media: 'banner',
- error: 'No bids received for 9DgF',
- adm: '',
- id: '9DgF',
- cpm: 0.00
- }];
-
- var result = spec.interpretResponse({ body: emptyResponse }, {});
- expect(result.length).to.equal(0);
- });
- });
-
- describe('getUserSyncs', function () {
- const syncOptions = {
- iframeEnabled: true
- };
-
- it('should produce sync url', function () {
- const syncs = spec.getUserSyncs(syncOptions);
- expect(syncs.length).to.equal(1);
- expect(syncs[0].type).to.equal('iframe');
- expect(syncs[0].url).to.equal('https://sync.rtk.io/cs');
- });
-
- it('should return empty, as we sync only once', function () {
- const syncs = spec.getUserSyncs(syncOptions);
- expect(syncs.length).to.equal(0);
- });
-
- it('should reset hasSynced flag, allowing another sync', function () {
- resetUserSync();
-
- const syncs = spec.getUserSyncs(syncOptions);
- expect(syncs.length).to.equal(1);
- });
-
- it('should return empty when iframe disallowed', function () {
- resetUserSync();
-
- const noIframeOptions = { iframeEnabled: false };
- const syncs = spec.getUserSyncs(noIframeOptions);
- expect(syncs.length).to.equal(0);
- });
-
- it('should produce sync url with gdpr params', function () {
- const gdprConsent = {
- gdprApplies: true,
- consentString: 'BOEFEAyOEFEAyAHABDENAI4AAAB9vABAASA'
- };
-
- resetUserSync();
-
- const syncs = spec.getUserSyncs(syncOptions, null, gdprConsent);
- expect(syncs.length).to.equal(1);
- expect(syncs[0].type).to.equal('iframe');
- expect(syncs[0].url).to.equal('https://sync.rtk.io/cs?g=1&c=BOEFEAyOEFEAyAHABDENAI4AAAB9vABAASA');
- });
-
- it('should produce sync url with ccpa params', function () {
- resetUserSync();
-
- const syncs = spec.getUserSyncs(syncOptions, null, {}, '1YYN');
- expect(syncs.length).to.equal(1);
- expect(syncs[0].type).to.equal('iframe');
- expect(syncs[0].url).to.equal('https://sync.rtk.io/cs?us_privacy=1YYN');
- });
- });
-
- 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: 'https://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);
- });
- });
- });
- });
-
- describe('schain support', function() {
- const nodePropsOrder = ['asi', 'sid', 'hp', 'rid', 'name', 'domain'];
- let schainConfig = {
- ver: '1.0',
- complete: 1,
- nodes: [
- {
- asi: 'rtk.io',
- sid: '1234',
- hp: 1,
- rid: 'bid-request-1',
- name: 'first pub',
- domain: 'first.com'
- },
- {
- asi: 'rtk.io',
- sid: '5678',
- hp: 1,
- rid: 'bid-request-2',
- name: 'second pub',
- domain: 'second.com'
- }
- ]
- };
-
- const bidRequests = [{
- bidder: 'aardvark',
- params: {
- ai: 'xiby',
- sc: 'TdAx',
- },
- adUnitCode: 'aaa',
- transactionId: '1b8389fe-615c-482d-9f1a-177fb8f7d5b0',
- sizes: [300, 250],
- bidId: '1abgs362e0x48a8',
- bidderRequestId: '70deaff71c281d',
- auctionId: '5c66da22-426a-4bac-b153-77360bef5337',
- schain: schainConfig,
- }];
-
- const bidderRequest = {
- gdprConsent: undefined,
- refererInfo: {
- referer: 'https://example.com'
- }
- };
-
- it('should properly serialize schain object with correct delimiters', () => {
- const results = spec.buildRequests(bidRequests, bidderRequest);
- const numNodes = schainConfig.nodes.length;
-
- const schain = results[0].data.schain;
-
- // each node serialization should start with an !
- expect(schain.match(/!/g).length).to.equal(numNodes);
-
- // 5 commas per node plus 1 for version
- expect(schain.match(/,/g).length).to.equal(numNodes * 5 + 1);
- });
-
- it('should send the proper version for the schain', () => {
- const results = spec.buildRequests(bidRequests, bidderRequest);
- const schain = decodeURIComponent(results[0].data.schain).split('!');
- const version = schain.shift().split(',')[0];
- expect(version).to.equal(bidRequests[0].schain.ver);
- });
-
- it('should send the correct value for complete in schain', () => {
- const results = spec.buildRequests(bidRequests, bidderRequest);
- const schain = decodeURIComponent(results[0].data.schain).split('!');
- const complete = schain.shift().split(',')[1];
- expect(complete).to.equal(String(bidRequests[0].schain.complete));
- });
-
- it('should send available params in the right order', () => {
- const results = spec.buildRequests(bidRequests, bidderRequest);
- const schain = decodeURIComponent(results[0].data.schain).split('!');
- schain.shift();
-
- schain.forEach((serializeNode, nodeIndex) => {
- const nodeProps = serializeNode.split(',');
- nodeProps.forEach((nodeProp, propIndex) => {
- const node = schainConfig.nodes[nodeIndex];
- const key = nodePropsOrder[propIndex];
- expect(nodeProp).to.equal(node[key] ? String(node[key]) : '');
- });
- });
- });
- });
-});
diff --git a/test/spec/modules/adagioBidAdapter_spec.js b/test/spec/modules/adagioBidAdapter_spec.js
index 4b66a96be16..7c8e6ec2362 100644
--- a/test/spec/modules/adagioBidAdapter_spec.js
+++ b/test/spec/modules/adagioBidAdapter_spec.js
@@ -1,20 +1,23 @@
-import find from 'core-js-pure/features/array/find.js';
-import { expect, util } from 'chai';
+import { expect } from 'chai';
import {
_features,
internal as adagio,
adagioScriptFromLocalStorageCb,
getAdagioScript,
storage,
+ setExtraParam,
spec,
ENDPOINT,
VERSION,
- RENDERER_URL
+ RENDERER_URL,
+ GlobalExchange
} from '../../../modules/adagioBidAdapter.js';
import { loadExternalScript } from '../../../src/adloader.js';
import * as utils from '../../../src/utils.js';
import { config } from '../../../src/config.js';
import { NATIVE } from '../../../src/mediaTypes.js';
+import * as prebidGlobal from 'src/prebidGlobal.js';
+import { executeRenderer } from '../../../src/Renderer.js';
const BidRequestBuilder = function BidRequestBuilder(options) {
const defaults = {
@@ -115,6 +118,9 @@ describe('Adagio bid adapter', () => {
window.ADAGIO.versions.adagioBidderAdapter = VERSION;
window.ADAGIO.pageviewId = 'dda61753-4059-4f75-b0bf-3f60bd2c4d9a';
+ GlobalExchange.clearFeatures();
+ GlobalExchange.clearExchangeData();
+
adagioMock = sinon.mock(adagio);
utilsMock = sinon.mock(utils);
@@ -130,6 +136,46 @@ describe('Adagio bid adapter', () => {
sandbox.restore();
});
+ describe('get and set params at adUnit level from global Prebid configuration', function() {
+ it('should set params get from ortb2 config or bidderSettings. Priority to bidderSetting', function() {
+ const bid = new BidRequestBuilder().build();
+
+ sandbox.stub(config, 'getConfig').callsFake(key => {
+ const config = {
+ adagio: {
+ pagetype: 'article'
+ },
+ ortb2: {
+ site: {
+ ext: {
+ data: {
+ environment: 'desktop',
+ pagetype: 'abc'
+ }
+ }
+ }
+ }
+ };
+ return utils.deepAccess(config, key);
+ });
+
+ setExtraParam(bid, 'environment');
+ expect(bid.params.environment).to.equal('desktop');
+
+ setExtraParam(bid, 'pagetype')
+ expect(bid.params.pagetype).to.equal('article');
+ });
+
+ it('should use the adUnit param unit if defined', function() {
+ const bid = new BidRequestBuilder({ params: { pagetype: 'article' } }).build();
+ sandbox.stub(config, 'getConfig').withArgs('adagio').returns({
+ pagetype: 'ignore-me'
+ });
+ setExtraParam(bid, 'pagetype')
+ expect(bid.params.pagetype).to.equal('article');
+ });
+ })
+
describe('isBidRequestValid()', function() {
it('should return true when required params have been found', function() {
const bid = new BidRequestBuilder().withParams().build();
@@ -137,6 +183,19 @@ describe('Adagio bid adapter', () => {
expect(spec.isBidRequestValid(bid)).to.equal(true);
});
+ it('should compute organizationId and site params from global BidderSettings config', function() {
+ sandbox.stub(adagio, 'getRefererInfo').returns({ reachedTop: true });
+ sandbox.stub(config, 'getConfig').withArgs('adagio').returns({
+ siteId: '1000:SITE-NAME'
+ });
+
+ const bid = new BidRequestBuilder({
+ params: { placement: 'PAVE_ATF' }
+ }).build();
+
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
+ })
+
it('should return false if bid.params is missing', function() {
sandbox.spy(utils, 'logWarn');
const bid01 = new BidRequestBuilder().build();
@@ -156,7 +215,7 @@ describe('Adagio bid adapter', () => {
expect(spec.isBidRequestValid(bid01)).to.equal(true);
expect(bid01.params.adUnitElementId).to.equal('adunit-code');
expect(bid01.params.placement).to.equal('adunit-code');
- })
+ });
it('should return false when a required param is missing', function() {
const bid01 = new BidRequestBuilder({ params: {
@@ -174,9 +233,16 @@ describe('Adagio bid adapter', () => {
site: 'SITE-NAME'
}}).build();
+ sandbox.stub(config, 'getConfig').withArgs('adagio').returns({
+ siteId: '1000'
+ });
+
+ const bid04 = new BidRequestBuilder({ params: { placement: 'PAVE_ATF' } }).build();
+
expect(spec.isBidRequestValid(bid01)).to.equal(false);
expect(spec.isBidRequestValid(bid02)).to.equal(false);
expect(spec.isBidRequestValid(bid03)).to.equal(false);
+ expect(spec.isBidRequestValid(bid04)).to.equal(false);
});
it('should return false when refererInfo.reachedTop is false', function() {
@@ -188,134 +254,6 @@ describe('Adagio bid adapter', () => {
sinon.assert.callCount(utils.logWarn, 1);
sinon.assert.calledWith(utils.logWarn, 'Adagio: the main page url is unreachabled.');
});
-
- it('should log warning and enqueue the bid object in ADAGIO.queue when isBidRequestValid is false', function() {
- sandbox.stub(Date, 'now').returns(12345);
- sandbox.spy(utils, 'logWarn');
- sandbox.spy(adagio, 'enqueue');
-
- const bid = new BidRequestBuilder({'params': {
- organizationId: '1000',
- placement: 'PAVE_ATF'
- }}).build();
-
- const expectedEnqueued = {
- action: 'pb-dbg',
- ts: 12345,
- data: { bid }
- };
-
- spec.isBidRequestValid(bid);
-
- sinon.assert.calledWith(adagio.enqueue, expectedEnqueued);
- sinon.assert.callCount(utils.logWarn, 1);
- });
-
- describe('Store ADAGIO global in window.top or window.self depending on context', function() {
- const bid01 = new BidRequestBuilder({
- adUnitCode: 'adunit-code-01',
- sizes: [[300, 250], [300, 600]]
- }).withParams().build();
-
- const bid02 = new BidRequestBuilder({
- adUnitCode: 'adunit-code-02',
- mediaTypes: {
- banner: { sizes: [[300, 250]] }
- },
- }).withParams().build();
-
- const bid03 = new BidRequestBuilder({
- adUnitCode: 'adunit-code-02',
- mediaTypes: {
- banner: { sizes: [[300, 600]] }
- },
- }).withParams().build();
-
- const expected = [
- {
- code: 'adunit-code-01',
- sizes: [[300, 250], [300, 600]],
- mediaTypes: {},
- bids: [{
- bidder: 'adagio',
- params: {
- organizationId: '1000',
- placement: 'PAVE_ATF',
- site: 'SITE-NAME',
- adUnitElementId: 'gpt-adunit-code',
- environment: 'desktop',
- supportIObs: true
- }
- }],
- auctionId: '4fd1ca2d-846c-4211-b9e5-321dfe1709c9',
- pageviewId: 'dda61753-4059-4f75-b0bf-3f60bd2c4d9a',
- printNumber: 1,
- },
- {
- code: 'adunit-code-02',
- sizes: [[300, 600]],
- mediaTypes: {
- banner: { sizes: [[300, 600]] }
- },
- bids: [{
- bidder: 'adagio',
- params: {
- organizationId: '1000',
- placement: 'PAVE_ATF',
- site: 'SITE-NAME',
- adUnitElementId: 'gpt-adunit-code',
- environment: 'desktop',
- supportIObs: true
- }
- }],
- auctionId: '4fd1ca2d-846c-4211-b9e5-321dfe1709c9',
- pageviewId: 'dda61753-4059-4f75-b0bf-3f60bd2c4d9a',
- printNumber: 2,
- }
- ];
-
- it('should store bids config once by bid in window.top if it accessible', function() {
- sandbox.stub(adagio, 'getCurrentWindow').returns(window.top);
- sandbox.stub(adagio, 'supportIObs').returns(true);
-
- // replace by the values defined in beforeEach
- window.top.ADAGIO = {
- ...window.ADAGIO
- };
-
- spec.isBidRequestValid(bid01);
- spec.isBidRequestValid(bid02);
- spec.isBidRequestValid(bid03);
-
- expect(find(window.top.ADAGIO.pbjsAdUnits, aU => aU.code === 'adunit-code-01')).to.deep.eql(expected[0]);
- expect(find(window.top.ADAGIO.pbjsAdUnits, aU => aU.code === 'adunit-code-02')).to.deep.eql(expected[1]);
- });
-
- it('should detect IntersectionObserver support', function() {
- sandbox.stub(adagio, 'getCurrentWindow').returns(window.top);
- sandbox.stub(adagio, 'supportIObs').returns(false);
-
- window.top.ADAGIO = {
- ...window.ADAGIO
- };
-
- spec.isBidRequestValid(bid01);
- const validBidReq = find(window.top.ADAGIO.pbjsAdUnits, aU => aU.code === 'adunit-code-01');
- expect(validBidReq.bids[0].params.supportIObs).to.equal(false);
- });
-
- it('should store bids config once by bid in current window', function() {
- sandbox.stub(adagio, 'getCurrentWindow').returns(window.self);
- sandbox.stub(adagio, 'supportIObs').returns(true);
-
- spec.isBidRequestValid(bid01);
- spec.isBidRequestValid(bid02);
- spec.isBidRequestValid(bid03);
-
- expect(find(window.ADAGIO.pbjsAdUnits, aU => aU.code === 'adunit-code-01')).to.deep.eql(expected[0]);
- expect(find(window.ADAGIO.pbjsAdUnits, aU => aU.code === 'adunit-code-02')).to.deep.eql(expected[1]);
- });
- });
});
describe('buildRequests()', function() {
@@ -331,7 +269,6 @@ describe('Adagio bid adapter', () => {
'user',
'schain',
'prebidVersion',
- 'adapterVersion',
'featuresVersion',
'data'
];
@@ -360,7 +297,6 @@ describe('Adagio bid adapter', () => {
sandbox.stub(adagio, 'getDevice').returns({ a: 'a' });
sandbox.stub(adagio, 'getSite').returns({ domain: 'adagio.io', 'page': 'https://adagio.io/hb' });
sandbox.stub(adagio, 'getPageviewId').returns('1234-567');
- sandbox.stub(adagio, 'getFeatures').returns({});
const bid01 = new BidRequestBuilder().withParams().build();
const bidderRequest = new BidderRequestBuilder().build();
@@ -377,24 +313,11 @@ describe('Adagio bid adapter', () => {
it('should enqueue computed features for collect usage', function() {
sandbox.stub(Date, 'now').returns(12345);
- for (const prop in _features) {
- sandbox.stub(_features, prop).returns('');
- }
-
- adagioMock.expects('enqueue').withExactArgs({
- action: 'features',
- ts: 12345,
- data: {
- 'gpt-adunit-code': {
- features: {},
- version: '1'
- }
- }
- }).atLeast(1);
-
const bid01 = new BidRequestBuilder().withParams().build();
const bidderRequest = new BidderRequestBuilder().build();
+ adagioMock.expects('enqueue').withArgs(sinon.match({ action: 'features' })).atLeast(1);
+
const requests = spec.buildRequests([bid01], bidderRequest);
expect(requests[0].data).to.have.all.keys(expectedDataKeys);
@@ -497,7 +420,7 @@ describe('Adagio bid adapter', () => {
const requests = spec.buildRequests([bid01], bidderRequest);
expect(requests).to.have.lengthOf(1);
expect(requests[0].data.adUnits[0].mediaTypes.video).to.deep.equal(expected);
- sinon.assert.calledTwice(utils.logWarn);
+ sinon.assert.calledTwice(utils.logWarn.withArgs(sinon.match(new RegExp(/^Adagio: The OpenRTB/))));
});
});
@@ -696,7 +619,7 @@ describe('Adagio bid adapter', () => {
describe('with userID modules', function() {
const userId = {
- sharedid: {id: '01EAJWWNEPN3CYMM5N8M5VXY22', third: '01EAJWWNEPN3CYMM5N8M5VXY22'},
+ pubcid: '01EAJWWNEPN3CYMM5N8M5VXY22',
unsuported: '666'
};
@@ -710,13 +633,10 @@ describe('Adagio bid adapter', () => {
const requests = spec.buildRequests([bid01], bidderRequest);
const expected = [{
- source: 'sharedid.org',
+ source: 'pubcid.org',
uids: [
{
atype: 1,
- ext: {
- third: '01EAJWWNEPN3CYMM5N8M5VXY22'
- },
id: '01EAJWWNEPN3CYMM5N8M5VXY22'
}
]
@@ -1000,6 +920,20 @@ describe('Adagio bid adapter', () => {
expect(bidResponse.height).to.equal(250);
expect(bidResponse.vastUrl).to.match(/^data:text\/xml;/)
});
+
+ it('should execute Adagio outstreamPlayer if defined', function() {
+ window.ADAGIO.outstreamPlayer = sinon.stub();
+ const bidResponse = spec.interpretResponse(serverResponseWithOutstream, bidRequestWithOutstream)[0];
+ executeRenderer(bidResponse.renderer, bidResponse)
+ sinon.assert.calledOnce(window.ADAGIO.outstreamPlayer);
+ delete window.ADAGIO.outstreamPlayer;
+ });
+
+ it('should logError if Adagio outstreamPlayer is not defined', function() {
+ const bidResponse = spec.interpretResponse(serverResponseWithOutstream, bidRequestWithOutstream)[0];
+ executeRenderer(bidResponse.renderer, bidResponse)
+ utilsMock.expects('logError').withExactArgs('Adagio: Adagio outstream player is not defined').once();
+ });
});
describe('Response with native add', () => {
@@ -1009,7 +943,7 @@ describe('Adagio bid adapter', () => {
ver: '1.2',
link: {
url: 'https://i.am.a.click.url',
- clickTrackers: [
+ clicktrackers: [
'https://i.am.a.clicktracker.url'
]
},
@@ -1036,7 +970,6 @@ describe('Adagio bid adapter', () => {
],
assets: [
{
- required: 1,
title: {
text: 'My title'
}
@@ -1084,34 +1017,32 @@ describe('Adagio bid adapter', () => {
};
const bidRequestNative = utils.deepClone(bidRequest)
- bidRequestNative.mediaTypes = {
- native: {
- sendTargetingKeys: false,
+ bidRequestNative.nativeParams = {
+ sendTargetingKeys: false,
- clickUrl: {
- required: true,
- },
- title: {
- required: true,
- },
- body: {
- required: true,
- },
- sponsoredBy: {
- required: false
- },
- image: {
- required: true
- },
- icon: {
- required: true
- },
- privacyLink: {
- required: false
- },
- ext: {
- adagio_bvw: {}
- }
+ clickUrl: {
+ required: true,
+ },
+ title: {
+ required: true,
+ },
+ body: {
+ required: true,
+ },
+ sponsoredBy: {
+ required: false
+ },
+ image: {
+ required: true
+ },
+ icon: {
+ required: true
+ },
+ privacyLink: {
+ required: false
+ },
+ ext: {
+ adagio_bvw: {}
}
};
@@ -1202,12 +1133,52 @@ describe('Adagio bid adapter', () => {
});
});
- describe('Adagio features', function() {
+ describe('transformBidParams', function() {
+ it('Compute additional params in s2s mode', function() {
+ GlobalExchange.prepareExchangeData('{}');
+
+ sandbox.stub(window.top.document, 'getElementById').returns(
+ fixtures.getElementById()
+ );
+ sandbox.stub(window.top, 'getComputedStyle').returns({ display: 'block' });
+ sandbox.stub(utils, 'inIframe').returns(false);
+
+ const adUnit = {
+ code: 'adunit-code',
+ params: {
+ organizationId: '1000'
+ }
+ };
+ const bid01 = new BidRequestBuilder({
+ 'mediaTypes': {
+ banner: { sizes: [[300, 250]] }
+ }
+ }).withParams().build();
+
+ const params = spec.transformBidParams({ organizationId: '1000' }, true, adUnit, [{ bidderCode: 'adagio', bids: [bid01] }]);
+
+ expect(params.organizationId).to.exist;
+ expect(params.organizationId).to.exist;
+ expect(params.features).to.exist;
+ expect(params.features.page_dimensions).to.exist;
+ expect(params.features.adunit_position).to.exist;
+ expect(params.features.dom_loading).to.exist;
+ expect(params.features.print_number).to.exist;
+ expect(params.features.user_timestamp).to.exist;
+ expect(params.placement).to.exist;
+ expect(params.adUnitElementId).to.exist;
+ expect(params.site).to.exist;
+ expect(params.data.session).to.exist;
+ });
+ });
+
+ describe('Adagio features when prebid in top.window', function() {
it('should return all expected features when all expected bidder params are available', function() {
sandbox.stub(window.top.document, 'getElementById').returns(
fixtures.getElementById()
);
sandbox.stub(window.top, 'getComputedStyle').returns({ display: 'block' });
+ sandbox.stub(utils, 'inIframe').returns(false);
const bidRequest = new BidRequestBuilder({
'mediaTypes': {
@@ -1217,7 +1188,8 @@ describe('Adagio bid adapter', () => {
const bidderRequest = new BidderRequestBuilder().build();
- const result = adagio.getFeatures(bidRequest, bidderRequest);
+ const requests = spec.buildRequests([bidRequest], bidderRequest);
+ const result = requests[0].data.adUnits[0].features;
expect(result.adunit_position).to.match(/^[\d]+x[\d]+$/);
expect(result.page_dimensions).to.match(/^[\d]+x[\d]+$/);
@@ -1225,13 +1197,15 @@ describe('Adagio bid adapter', () => {
expect(result.print_number).to.be.a('String');
expect(result.dom_loading).to.be.a('String');
expect(result.user_timestamp).to.be.a('String');
- expect(result.url).to.be.a('String');
- expect(result.device).to.be.a('String');
- expect(result.os).to.be.a('String');
- expect(result.browser).to.be.a('String');
+ expect(result.url).to.not.exist;
+ expect(result.device).to.not.exist;
+ expect(result.os).to.not.exist;
+ expect(result.browser).to.not.exist;
});
it('should return all expected features when `adUnitElementId` param is not available', function() {
+ sandbox.stub(utils, 'inIframe').returns(false);
+
const bidRequest = new BidRequestBuilder({
params: {
organizationId: '1000',
@@ -1245,7 +1219,8 @@ describe('Adagio bid adapter', () => {
const bidderRequest = new BidderRequestBuilder().build();
- const result = adagio.getFeatures(bidRequest, bidderRequest);
+ const requests = spec.buildRequests([bidRequest], bidderRequest);
+ const result = requests[0].data.adUnits[0].features;
expect(result.adunit_position).to.not.exist;
expect(result.page_dimensions).to.be.a('String');
@@ -1253,16 +1228,23 @@ describe('Adagio bid adapter', () => {
expect(result.print_number).to.be.a('String');
expect(result.dom_loading).to.be.a('String');
expect(result.user_timestamp).to.be.a('String');
- expect(result.url).to.be.a('String');
- expect(result.device).to.be.a('String');
- expect(result.os).to.be.a('String');
- expect(result.browser).to.be.a('String');
+ });
+ });
+
+ describe('Adagio features when prebid in Safeframe', function() {
+ beforeEach(function () {
+ window.$sf = $sf;
});
- it('should not return feature with an empty value', function() {
- sandbox.stub(_features, 'getDomLoadingDuration').returns('');
- sandbox.stub(_features, 'getUrl').returns('');
- sandbox.stub(_features, 'getBrowser').returns('');
+ afterEach(function () {
+ delete window.$sf;
+ });
+
+ it('should return all expected features when prebid is in safeframe iframe', function() {
+ sandbox.stub(window.$sf.ext, 'geom').returns({
+ win: {t: 23, r: 1920, b: 1200, l: 0, w: 1920, h: 1177},
+ self: {t: 210, r: 1159, b: 460, l: 859, w: 300, h: 250},
+ });
const bidRequest = new BidRequestBuilder({
'mediaTypes': {
@@ -1272,178 +1254,85 @@ describe('Adagio bid adapter', () => {
const bidderRequest = new BidderRequestBuilder().build();
- const result = adagio.getFeatures(bidRequest, bidderRequest);
+ const requests = spec.buildRequests([bidRequest], bidderRequest);
+ const result = requests[0].data.adUnits[0].features;
- expect(result.adunit_position).to.not.exist;
- expect(result.page_dimensions).to.exist;
- expect(result.viewport_dimensions).to.exist;
- expect(result.print_number).to.exist;
- expect(result.dom_loading).to.not.exist;
- expect(result.user_timestamp).to.exist;
- expect(result.url).to.not.exist;
- expect(result.device).to.exist;
- expect(result.os).to.exist;
- expect(result.browser).to.not.exist;
+ expect(result.page_dimensions).to.not.exist;
+ expect(result.viewport_dimensions).to.be.a('String');
+ expect(result.print_number).to.be.a('String');
+ expect(result.dom_loading).to.be.a('String');
+ expect(result.user_timestamp).to.be.a('String');
+ expect(result.adunit_position).to.exist;
});
- describe('getPageDimensions feature', function() {
- afterEach(() => {
- delete window.$sf;
- });
-
- it('should not compute the page dimensions in cross-origin iframe', function() {
- sandbox.stub(utils, 'getWindowTop').throws();
- const result = _features.getPageDimensions();
- expect(result).to.eq('');
- });
+ it('should return all expected features when prebid safeframe api not properly implemented', function() {
+ const bidRequest = new BidRequestBuilder({
+ 'mediaTypes': {
+ banner: { sizes: [[300, 250]] }
+ }
+ }).withParams().build();
- it('should not compute the page dimensions even with safeFrame api', function() {
- window.$sf = $sf;
- const result = _features.getPageDimensions();
- expect(result).to.eq('');
- });
+ const bidderRequest = new BidderRequestBuilder().build();
- it('should not compute the page dimensions if is not in the DOM', function() {
- sandbox.stub(window.top.document, 'querySelector').withArgs('body').returns(null);
- const result = _features.getPageDimensions();
- expect(result).to.eq('');
- });
+ const requests = spec.buildRequests([bidRequest], bidderRequest);
+ const result = requests[0].data.adUnits[0].features;
- it('should compute the page dimensions based on body and viewport dimensions', function() {
- sandbox.stub(window.top.document, 'querySelector').withArgs('body').returns({ scrollWidth: 1360, offsetWidth: 1280, scrollHeight: 2000, offsetHeight: 1000 });
- const result = _features.getPageDimensions();
- expect(result).to.eq('1360x2000');
- });
+ expect(result.page_dimensions).to.not.exist;
+ expect(result.viewport_dimensions).to.not.exist;
+ expect(result.print_number).to.be.a('String');
+ expect(result.dom_loading).to.be.a('String');
+ expect(result.user_timestamp).to.be.a('String');
+ expect(result.adunit_position).to.not.exist;
});
- describe('getViewPortDimensions feature', function() {
- afterEach(() => {
- delete window.$sf;
- });
-
- it('should not compute the viewport dimensions in cross-origin iframe', function() {
- sandbox.stub(utils, 'getWindowTop').throws();
- const result = _features.getViewPortDimensions();
- expect(result).to.eq('');
- });
-
- it('should compute the viewport dimensions in cross-origin iframe w/ safeFrame api', function() {
- window.$sf = $sf;
- sandbox.stub(window.$sf.ext, 'geom').returns({
- win: {t: 23, r: 1920, b: 1200, l: 0, w: 1920, h: 1177},
- self: {t: 210, r: 1159, b: 460, l: 859, w: 300, h: 250},
- });
- const result = _features.getViewPortDimensions();
- expect(result).to.eq('1920x1177');
- });
+ it('should return all expected features when prebid safeframe api not properly implemented bis', function() {
+ window.$sf.ext.geom = undefined;
- it('should not compute the viewport dimensions if safeFrame api is misimplemented', function() {
- window.$sf = {
- ext: { geom: 'nothing' }
- };
- const result = _features.getViewPortDimensions();
- expect(result).to.eq('');
- });
+ const bidRequest = new BidRequestBuilder({
+ 'mediaTypes': {
+ banner: { sizes: [[300, 250]] }
+ }
+ }).withParams().build();
- it('should not compute the viewport dimensions if is not in the DOM', function() {
- const querySelectorSpy = sandbox.spy(() => null);
- sandbox.stub(utils, 'getWindowTop').returns({
- location: { href: 'https://mytest.io' },
- document: { querySelector: querySelectorSpy }
- });
- const result = _features.getViewPortDimensions();
- expect(result).to.eq('');
- });
+ const bidderRequest = new BidderRequestBuilder().build();
- it('should compute the viewport dimensions based on window', function() {
- sandbox.stub(utils, 'getWindowTop').returns({
- location: { href: 'https://mytest.io' },
- innerWidth: 960,
- innerHeight: 3000
- });
- const result = _features.getViewPortDimensions();
- expect(result).to.eq('960x3000');
- });
+ const requests = spec.buildRequests([bidRequest], bidderRequest);
+ const result = requests[0].data.adUnits[0].features;
- it('should compute the viewport dimensions based on body', function() {
- const querySelectorSpy = sandbox.spy(() => ({ clientWidth: 1024, clientHeight: 2000 }));
- sandbox.stub(utils, 'getWindowTop').returns({
- location: { href: 'https://mytest.io' },
- document: { querySelector: querySelectorSpy }
- });
- const result = _features.getViewPortDimensions();
- expect(result).to.eq('1024x2000');
- });
+ expect(result.page_dimensions).to.not.exist;
+ expect(result.viewport_dimensions).to.not.exist;
+ expect(result.print_number).to.be.a('String');
+ expect(result.dom_loading).to.be.a('String');
+ expect(result.user_timestamp).to.be.a('String');
+ expect(result.adunit_position).to.not.exist;
});
+ });
- describe('getSlotPosition feature', function() {
- let getElementByIdStub;
- let getComputedStyleStub;
-
- beforeEach(() => {
- getElementByIdStub = sandbox.stub(window.top.document, 'getElementById');
- getElementByIdStub.returns(fixtures.getElementById());
- getComputedStyleStub = sandbox.stub(window.top, 'getComputedStyle');
- getComputedStyleStub.returns({ display: 'block' });
- });
-
- afterEach(() => {
- delete window.$sf;
- getElementByIdStub.restore();
- getComputedStyleStub.restore();
- });
-
- it('should not compute the slot position in cross-origin iframe', function() {
- sandbox.stub(utils, 'getWindowTop').throws();
- const result = _features.getSlotPosition({ adUnitElementId: 'gpt-adunit-code', postBid: false });
- expect(result).to.eq('');
- });
-
- it('should compute the slot position in cross-origin iframe w/ safeFrame api', function() {
- window.$sf = $sf;
- sandbox.stub(window.$sf.ext, 'geom').returns({
- win: {t: 23, r: 1920, b: 1200, l: 0, w: 1920, h: 1177},
- self: {t: 210, r: 1159, b: 460, l: 859, w: 300, h: 250},
- });
- const result = _features.getSlotPosition({ adUnitElementId: 'gpt-adunit-code', postBid: false });
- expect(result).to.eq('210x859');
- });
-
- it('should not compute the slot position if safeFrame api is misimplemented', function() {
- window.$sf = {
- ext: { geom: 'nothing' }
- };
- utilsMock.expects('logWarn').once();
- const result = _features.getSlotPosition({ adUnitElementId: 'gpt-adunit-code', postBid: false });
- expect(result).to.eq('');
- utilsMock.verify();
- });
+ describe('Adagio features when prebid in crossdomain iframe', function() {
+ it('should return all expected features', function() {
+ sandbox.stub(utils, 'getWindowTop').throws();
- it('should not compute the slot position due to unreachable adUnitElementId', function() {
- getElementByIdStub.returns(null);
- const result = _features.getSlotPosition({ adUnitElementId: 'gpt-adunit-code', postBid: false });
- expect(result).to.eq('');
- });
+ const bidRequest = new BidRequestBuilder({
+ 'mediaTypes': {
+ banner: { sizes: [[300, 250]] }
+ }
+ }).withParams().build();
- it('should use a quick switch to display slot and compute position', function() {
- getComputedStyleStub.returns({ display: 'none' });
- const result = _features.getSlotPosition({ adUnitElementId: 'gpt-adunit-code', postBid: false });
- expect(result).to.eq('800x300');
- });
+ const bidderRequest = new BidderRequestBuilder().build();
- it('should compute the slot position based on window.top w/o postBid param', function() {
- const result = _features.getSlotPosition({ adUnitElementId: 'gpt-adunit-code', postBid: false });
- expect(result).to.eq('800x300');
- });
+ const requests = spec.buildRequests([bidRequest], bidderRequest);
+ const result = requests[0].data.adUnits[0].features;
- it.skip('should compute the slot position inside the parent window (window.top) when safeFrame is not available and postBid params is `true`', function() {
- const result = _features.getSlotPosition({ adUnitElementId: 'gpt-adunit-code', postBid: true });
- // expect(result).to.eq('800x300');
- });
+ expect(result.page_dimensions).to.not.exist;
+ expect(result.viewport_dimensions).to.not.exist;
+ expect(result.print_number).to.be.a('String');
+ expect(result.dom_loading).to.be.a('String');
+ expect(result.user_timestamp).to.be.a('String');
+ expect(result.adunit_position).to.not.exist;
});
});
- describe('optional params auto detection', function() {
+ describe.skip('optional params auto detection', function() {
it('should auto detect environment', function() {
const getDeviceStub = sandbox.stub(_features, 'getDevice');
@@ -1463,7 +1352,7 @@ describe('Adagio bid adapter', () => {
});
});
- describe('print number handling', function() {
+ describe.skip('print number handling', function() {
it('should return 1 if no adunit-code found. This means it is the first auction', function() {
sandbox.stub(adagio, 'getPageviewId').returns('abc-def');
expect(adagio.computePrintNumber('adunit-code')).to.eql(1);
diff --git a/test/spec/modules/adbookpspBidAdapter_spec.js b/test/spec/modules/adbookpspBidAdapter_spec.js
new file mode 100755
index 00000000000..a6b8a794eeb
--- /dev/null
+++ b/test/spec/modules/adbookpspBidAdapter_spec.js
@@ -0,0 +1,1323 @@
+import { expect } from 'chai';
+import * as utils from '../../../src/utils.js';
+import {
+ spec,
+ storage,
+ DEFAULT_BIDDER_CONFIG,
+ VERSION,
+ common,
+} from '../../../modules/adbookpspBidAdapter.js';
+
+describe('adbookpsp bid adapter', () => {
+ let sandbox;
+
+ beforeEach(function () {
+ sandbox = sinon.sandbox.create();
+
+ sandbox
+ .stub(common, 'generateUUID')
+ .returns('54444444-5444-4444-9444-544444444444');
+ sandbox.stub(common, 'getWindowDimensions').returns({
+ innerWidth: 100,
+ innerHeight: 100,
+ });
+ });
+
+ afterEach(function () {
+ sandbox.restore();
+ });
+
+ describe('isBidRequestValid()', () => {
+ it('should return false when there is no banner in mediaTypes', () => {
+ const bid = utils.deepClone(bannerBid);
+ delete bid.mediaTypes.banner;
+
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
+
+ it('should return false when orgId and placementId is not defined', () => {
+ const bid = utils.deepClone(bannerBid);
+ delete bid.params.placementId;
+ delete bid.params.orgId;
+
+ expect(spec.isBidRequestValid(bid)).to.be.false;
+ });
+
+ it('should return true when orgId is set in config', () => {
+ const bid = utils.deepClone(bannerBid);
+
+ delete bid.params.placementId;
+ delete bid.params.orgId;
+
+ sandbox
+ .stub(common, 'getConfig')
+ .withArgs('adbookpsp.orgId')
+ .returns('129576');
+
+ expect(spec.isBidRequestValid(bid)).to.be.true;
+ });
+
+ it('should return true when required params found', () => {
+ expect(spec.isBidRequestValid(bannerBid)).to.equal(true);
+ expect(spec.isBidRequestValid(videoBid)).to.equal(true);
+ expect(spec.isBidRequestValid(mixedBid)).to.equal(true);
+ });
+
+ it('should return false when sizes for banner are not specified', () => {
+ const bid = utils.deepClone(bannerBid);
+ delete bid.mediaTypes.banner.sizes;
+
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
+
+ it('should return false when sizes for banner are invalid', () => {
+ const bid = utils.deepClone(bannerBid);
+ delete bid.mediaTypes.banner.sizes;
+
+ bid.mediaTypes.banner.sizes = [['123', 'foo']];
+
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
+
+ it('should return true if player size is set via playerSize', () => {
+ expect(spec.isBidRequestValid(videoBid)).to.equal(true);
+ });
+
+ it('should return true if player size is set via w and h', () => {
+ const bid = utils.deepClone(videoBid);
+ delete bid.mediaTypes.video.playerSize;
+
+ bid.mediaTypes.video.w = 400;
+ bid.mediaTypes.video.h = 300;
+
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
+ });
+
+ it('should reutrn false if player size is not set', () => {
+ const bid = utils.deepClone(videoBid);
+ delete bid.mediaTypes.video.playerSize;
+
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
+ });
+
+ describe('buildRequests()', () => {
+ it('should build correct request for banner bid', () => {
+ sandbox
+ .stub(common, 'getConfig')
+ .withArgs('adbookpsp.orgId')
+ .returns(undefined)
+ .withArgs('adbookpsp.exchangeUrl')
+ .returns('https://ex.fattail.com/openrtb2');
+
+ const requests = spec.buildRequests([bannerBid], bidderRequest);
+
+ expect(requests).to.have.lengthOf(1);
+ expect(requests[0]).to.deep.include({
+ method: 'POST',
+ url: 'https://ex.fattail.com/openrtb2',
+ options: {
+ contentType: 'application/json',
+ withCredentials: true,
+ },
+ });
+ expect(JSON.parse(requests[0].data)).to.deep.equal(bannerExchangeRequest);
+ });
+
+ it('should build correct request for video bid', () => {
+ sandbox
+ .stub(common, 'getConfig')
+ .withArgs('adbookpsp')
+ .returns(DEFAULT_BIDDER_CONFIG)
+ .withArgs('adbookpsp.exchangeUrl')
+ .returns(DEFAULT_BIDDER_CONFIG.exchangeUrl)
+ .withArgs('adbookpsp.orgId')
+ .returns(undefined);
+
+ const requests = spec.buildRequests([videoBid], bidderRequest);
+
+ expect(requests).to.have.lengthOf(1);
+ expect(requests[0]).to.deep.include({
+ method: 'POST',
+ url: 'https://ex.fattail.com/openrtb2',
+ options: {
+ contentType: 'application/json',
+ withCredentials: true,
+ },
+ });
+ expect(JSON.parse(requests[0].data)).to.deep.include({
+ ...videoExchangeRequest,
+ ext: {
+ adbook: {
+ config: DEFAULT_BIDDER_CONFIG,
+ version: {
+ adapter: VERSION,
+ prebid: '$prebid.version$',
+ },
+ },
+ },
+ });
+ });
+
+ it('should build correct request for video bid with w and h', () => {
+ const bid = utils.deepClone(videoBid);
+
+ delete bid.mediaTypes.video.playerSize;
+
+ bid.mediaTypes.video.w = 400;
+ bid.mediaTypes.video.h = 300;
+
+ const [request] = spec.buildRequests([bid], bidderRequest);
+ const requestData = JSON.parse(request.data);
+
+ expect(requestData.imp[0].video.w).to.equal(400);
+ expect(requestData.imp[0].video.h).to.equal(300);
+ });
+
+ it('should build correct request for video bid with both w, h and playerSize', () => {
+ const bid = utils.deepClone(videoBid);
+
+ bid.mediaTypes.video.w = 640;
+ bid.mediaTypes.video.h = 480;
+
+ const [request] = spec.buildRequests([bid], bidderRequest);
+ const requestData = JSON.parse(request.data);
+
+ expect(requestData.imp[0].video.w).to.equal(640);
+ expect(requestData.imp[0].video.h).to.equal(480);
+ });
+
+ it('should build correct request for mixed bid', () => {
+ sandbox
+ .stub(common, 'getConfig')
+ .withArgs('adbookpsp.orgId')
+ .returns(undefined)
+ .withArgs('adbookpsp.exchangeUrl')
+ .returns('https://ex.fattail.com/openrtb2');
+
+ const requests = spec.buildRequests([mixedBid], bidderRequest);
+
+ expect(requests).to.have.lengthOf(1);
+ expect(requests[0]).to.deep.include({
+ method: 'POST',
+ url: 'https://ex.fattail.com/openrtb2',
+ options: {
+ contentType: 'application/json',
+ withCredentials: true,
+ },
+ });
+ expect(JSON.parse(requests[0].data)).to.deep.include(
+ mixedExchangeRequest
+ );
+ });
+
+ it('should use orgId from config', () => {
+ const bid = utils.deepClone(bannerBid);
+
+ delete bid.params;
+
+ sandbox
+ .stub(common, 'getConfig')
+ .withArgs('adbookpsp.orgId')
+ .returns('129576');
+
+ const requests = spec.buildRequests([bid], bidderRequest);
+ const request = JSON.parse(requests[0].data);
+
+ expect(request.imp[0].ext).to.deep.include({
+ adbook: {
+ orgId: '129576',
+ },
+ });
+ });
+
+ it('should use orgId from adUnit when orgId is also set in config', () => {
+ const bid = utils.deepClone(bannerBid);
+
+ delete bid.params.placementId;
+
+ bid.params.orgId = 'adUnitOrgId';
+
+ sandbox
+ .stub(common, 'getConfig')
+ .withArgs('adbookpsp.orgId')
+ .returns('configOrgId');
+
+ const requests = spec.buildRequests([bid], bidderRequest);
+ const request = JSON.parse(requests[0].data);
+
+ expect(request.imp[0].ext).to.deep.include({
+ adbook: {
+ orgId: 'adUnitOrgId',
+ },
+ });
+ });
+
+ it('should include in request GDPR options if available', () => {
+ const request = utils.deepClone(bidderRequest);
+
+ delete request.uspConsent;
+
+ const requests = spec.buildRequests([bannerBid, mixedBid], request);
+
+ expect(JSON.parse(requests[0].data)).to.deep.include({
+ regs: {
+ coppa: 0,
+ ext: {
+ gdpr: 1,
+ gdprConsentString: 'gdprConsentString',
+ },
+ },
+ });
+ });
+
+ it('should include in request USP (CPPA) options if available', () => {
+ const request = utils.deepClone(bidderRequest);
+
+ delete request.gdprConsent;
+
+ const requests = spec.buildRequests([bannerBid, mixedBid], request);
+
+ expect(JSON.parse(requests[0].data)).to.deep.include({
+ regs: {
+ coppa: 0,
+ ext: {
+ us_privacy: 'uspConsentString',
+ },
+ },
+ });
+ });
+
+ it('should pass valid coppa flag based on config', () => {
+ sandbox.stub(common, 'getConfig').withArgs('coppa').returns(true);
+
+ const request = utils.deepClone(bidderRequest);
+
+ delete request.gdprConsent;
+ delete request.uspConsent;
+
+ const requests = spec.buildRequests([bannerBid, mixedBid], request);
+
+ expect(JSON.parse(requests[0].data)).to.deep.include({
+ regs: {
+ coppa: 1,
+ },
+ });
+ });
+
+ it('should pass GDPR, USP (CCPA) and COPPA options', () => {
+ sandbox.stub(common, 'getConfig').withArgs('coppa').returns(true);
+
+ const requests = spec.buildRequests([bannerBid, mixedBid], bidderRequest);
+
+ expect(JSON.parse(requests[0].data)).to.deep.include({
+ regs: {
+ coppa: 1,
+ ext: {
+ gdpr: 1,
+ gdprConsentString: 'gdprConsentString',
+ us_privacy: 'uspConsentString',
+ },
+ },
+ });
+ });
+
+ it('should generate and pass user id when is not present in cookie and local storage is not enabled', () => {
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(false);
+ const requests = spec.buildRequests([bannerBid, mixedBid], bidderRequest);
+ const rtbRequest = JSON.parse(requests[0].data);
+
+ expect(rtbRequest.user.id).to.have.lengthOf(36);
+ });
+
+ it('should pass user id when is present in cookie', () => {
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(false);
+ sandbox
+ .stub(storage, 'getCookie')
+ .returns('e35da6bb-f2f8-443b-aeff-3375bef45c9d');
+ const requests = spec.buildRequests([bannerBid, mixedBid], bidderRequest);
+ const rtbRequest = JSON.parse(requests[0].data);
+
+ expect(rtbRequest.user.id).to.equal(
+ 'e35da6bb-f2f8-443b-aeff-3375bef45c9d'
+ );
+ });
+
+ it('should pass user id if is present in local storage', () => {
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
+ sandbox
+ .stub(storage, 'getDataFromLocalStorage')
+ .returns('e35da6bb-f2f8-443b-aeff-3375bef45c9d');
+
+ const requests = spec.buildRequests([bannerBid, mixedBid], bidderRequest);
+ const rtbRequest = JSON.parse(requests[0].data);
+ expect(rtbRequest.user.id).to.equal(
+ 'e35da6bb-f2f8-443b-aeff-3375bef45c9d'
+ );
+ });
+
+ it('should regenerate user id if it is invalid', () => {
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
+ sandbox.stub(storage, 'getDataFromLocalStorage').returns('foo');
+
+ const requests = spec.buildRequests([bannerBid, mixedBid], bidderRequest);
+ const rtbRequest = JSON.parse(requests[0].data);
+ expect(rtbRequest.user.id).to.have.lengthOf(36);
+ });
+
+ it('should pass schain if available', () => {
+ const bid = utils.deepClone(bannerBid);
+ const schain = {
+ ver: '1.0',
+ complete: 1,
+ nodes: [
+ {
+ asi: 'exchange1.com',
+ sid: '1234',
+ hp: 1,
+ rid: 'bid-request-1',
+ name: 'publisher',
+ domain: 'publisher.com',
+ },
+ ],
+ };
+
+ bid.schain = schain;
+
+ const requests = spec.buildRequests([bid], bidderRequest);
+
+ expect(JSON.parse(requests[0].data).source).to.deep.include({
+ ext: {
+ schain,
+ },
+ });
+ });
+
+ it('return empty array if there are no valid bid requests', () => {
+ const requests = spec.buildRequests([], bidderRequest);
+
+ expect(requests).to.deep.equal([]);
+ });
+
+ it('should prioritize device information set in config', () => {
+ const ua =
+ 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1';
+
+ sandbox.stub(common, 'getConfig').withArgs('device').returns({
+ ua,
+ });
+
+ const requests = spec.buildRequests([bannerBid], bidderRequest);
+
+ expect(JSON.parse(requests[0].data).device.ua).to.equal(ua);
+ });
+
+ it('should include bidder config', () => {
+ const bidderConfig = {
+ bidTTL: 500,
+ defaultCurrency: 'USD',
+ exchangeUrl: 'https://exsb.fattail.com/openrtb2',
+ winTrackingEnabled: true,
+ winTrackingUrl: 'https://evsb.fattail.com/wins',
+ orgId: '129576',
+ };
+ sandbox
+ .stub(common, 'getConfig')
+ .withArgs('adbookpsp')
+ .returns(bidderConfig);
+
+ const requests = spec.buildRequests([bannerBid], bidderRequest);
+ const request = JSON.parse(requests[0].data);
+
+ expect(request.ext).to.deep.include({
+ adbook: {
+ config: bidderConfig,
+ version: {
+ adapter: VERSION,
+ prebid: '$prebid.version$',
+ },
+ },
+ });
+ });
+
+ it('should use bidder video params if they are set', () => {
+ const videoBidWithParams = utils.deepClone(videoBid);
+ const bidderVideoParams = {
+ api: [1, 2],
+ mimes: ['video/mp4', 'video/x-flv'],
+ playbackmethod: [3, 4],
+ protocols: [5, 6],
+ minduration: 10,
+ maxduration: 30,
+ };
+ videoBidWithParams.params.video = bidderVideoParams;
+
+ const requests = spec.buildRequests([videoBidWithParams], bidderRequest);
+ const request = JSON.parse(requests[0].data);
+
+ expect(request.imp[0]).to.deep.include({
+ video: {
+ ...bidderVideoParams,
+ w: videoBidWithParams.mediaTypes.video.playerSize[0][0],
+ h: videoBidWithParams.mediaTypes.video.playerSize[0][1],
+ },
+ });
+ });
+ });
+
+ describe('interpretResponse()', () => {
+ it('should correctly interpret valid response', () => {
+ sandbox
+ .stub(common, 'getConfig')
+ .withArgs('adbookpsp.defaultCurrency')
+ .returns(DEFAULT_BIDDER_CONFIG.defaultCurrency)
+ .withArgs('adbookpsp.bidTTL')
+ .returns(DEFAULT_BIDDER_CONFIG.bidTTL);
+
+ const response = utils.deepClone(exchangeResponse);
+ const bids = spec.interpretResponse(
+ { body: response },
+ { data: JSON.stringify(exchangeBidRequest) }
+ );
+
+ expect(bids).to.deep.equal([
+ {
+ bidderRequestId: '999ccceeee11',
+ requestId: '9873kfse',
+ bidId: 'bid123456',
+ width: 300,
+ height: 250,
+ ttl: 300,
+ cpm: 0.5,
+ currency: 'USD',
+ creativeId: '123456789',
+ mediaType: 'banner',
+ meta: {
+ advertiserDomains: ['advertiser.com'],
+ mediaType: 'banner',
+ primaryCatId: 'IAB2-1',
+ secondaryCatIds: ['IAB2-2', 'IAB2-3'],
+ },
+ netRevenue: true,
+ nurl: 'http://win.example.url',
+ adUnitCode: 'div-gpt-ad-837465923534-0',
+ ad: 'ad
',
+ adId: '5',
+ adserverTargeting: {
+ hb_adid_c_adbookpsp: '5',
+ hb_deal_adbookpsp: 'werwetwerw',
+ hb_liid_adbookpsp: '2342345',
+ },
+ referrer: 'http://prebid-test-page.io:8080/banner.html',
+ lineItemId: '2342345',
+ },
+ {
+ ad: ' ',
+ adId: '10',
+ adUnitCode: 'div-gpt-ad-837465923534-0',
+ adserverTargeting: {
+ hb_adid_c_adbookpsp: '10',
+ hb_deal_adbookpsp: 'dsfxcxcvxc',
+ hb_liid_adbookpsp: '2121221',
+ },
+ bidId: 'bid4321',
+ bidderRequestId: '999ccceeee11',
+ cpm: 0.45,
+ creativeId: '543123',
+ currency: 'USD',
+ height: 250,
+ lineItemId: '2121221',
+ mediaType: 'video',
+ meta: {
+ advertiserDomains: ['advertiser.com', 'campaign.advertiser.com'],
+ mediaType: 'video',
+ primaryCatId: 'IAB2-3',
+ secondaryCatIds: [],
+ },
+ netRevenue: true,
+ nurl: 'http://win.example.url',
+ referrer: 'http://prebid-test-page.io:8080/banner.html',
+ requestId: '120kfeske',
+ ttl: 300,
+ vastXml:
+ ' ',
+ width: 300,
+ },
+ ]);
+ });
+
+ it('should place valid GAM targeting for all bids when multiple bids are present for multiple impressions', () => {
+ const response = utils.deepClone(exchangeResponse);
+
+ const bids = spec.interpretResponse(
+ { body: response },
+ { data: JSON.stringify(exchangeBidRequest) }
+ );
+
+ expect(bids).to.have.length(2);
+ expect(bids[0].adserverTargeting).to.deep.equal({
+ hb_deal_adbookpsp: 'werwetwerw',
+ hb_liid_adbookpsp: '2342345',
+ hb_adid_c_adbookpsp: '5',
+ });
+ expect(bids[1].adserverTargeting).to.deep.equal({
+ hb_deal_adbookpsp: 'dsfxcxcvxc',
+ hb_liid_adbookpsp: '2121221',
+ hb_adid_c_adbookpsp: '10',
+ });
+ });
+
+ it('should place valid GAM targeting for all bids when multiple bids are present for single impression', () => {
+ const response = utils.deepClone(exchangeResponse);
+
+ response.seatbid[1].bid[0].impid = '9873kfse';
+
+ const bids = spec.interpretResponse(
+ { body: response },
+ { data: JSON.stringify(exchangeBidRequest) }
+ );
+
+ expect(bids).to.have.length(2);
+ for (const bid of bids) {
+ expect(bid.adserverTargeting).to.deep.equal({
+ hb_deal_adbookpsp: 'werwetwerw,dsfxcxcvxc',
+ hb_liid_adbookpsp: '2342345,2121221',
+ hb_adid_c_adbookpsp: '5,10',
+ });
+ }
+ });
+
+ it('should return no bids if response id does not match bidderRequestId', () => {
+ const body = utils.deepClone(exchangeResponse);
+ body.id = '999';
+
+ const bids = spec.interpretResponse(
+ { body },
+ { data: JSON.stringify(exchangeBidRequest) }
+ );
+
+ expect(bids).to.deep.equal([]);
+ });
+
+ it('should return no bids if response does not include seatbid', () => {
+ const body = utils.deepClone(exchangeResponse);
+ delete body.seatbid;
+
+ const bids = spec.interpretResponse(
+ { body },
+ { data: JSON.stringify(exchangeBidRequest) }
+ );
+
+ expect(bids).to.deep.equal([]);
+ });
+
+ it('should return no bids if response does not include any bids', () => {
+ const body = utils.deepClone(exchangeResponse);
+ body.seatbid = [];
+
+ const bids = spec.interpretResponse(
+ { body },
+ { data: JSON.stringify(exchangeBidRequest) }
+ );
+
+ expect(bids).to.deep.equal([]);
+ });
+
+ it('should exclude invalid video bids', () => {
+ const body = utils.deepClone(exchangeResponse);
+
+ body.seatbid.shift();
+ body.seatbid[0].bid[0].adid = 34;
+
+ const bids = spec.interpretResponse(
+ { body },
+ { data: JSON.stringify(exchangeBidRequest) }
+ );
+
+ expect(bids).to.deep.equal([]);
+ });
+
+ it('should exclude invalid banner bids', () => {
+ const body = utils.deepClone(exchangeResponse);
+ const request = utils.deepClone(exchangeBidRequest);
+
+ body.seatbid.pop();
+
+ delete body.seatbid[0].bid[0].w;
+ delete body.seatbid[0].bid[0].h;
+
+ request.imp[0].banner.format.push({ w: 300, h: 600 });
+
+ const bids = spec.interpretResponse(
+ { body },
+ { data: JSON.stringify(request) }
+ );
+
+ expect(bids).to.deep.equal([]);
+ });
+
+ it('should not include invalid banner bids in targeting map', () => {
+ const body = utils.deepClone(exchangeResponse);
+ const request = utils.deepClone(exchangeBidRequest);
+
+ body.seatbid[0].bid[0].h = '600';
+
+ request.imp[0].banner.format.push({ w: 300, h: 600 });
+
+ const bids = spec.interpretResponse(
+ { body },
+ { data: JSON.stringify(exchangeBidRequest) }
+ );
+
+ expect(bids[0].adserverTargeting).to.deep.equal({
+ hb_adid_c_adbookpsp: '10',
+ hb_deal_adbookpsp: 'dsfxcxcvxc',
+ hb_liid_adbookpsp: '2121221',
+ });
+ });
+
+ it('should not validate banner bid dimensions if bid request has single size', () => {
+ const body = utils.deepClone(exchangeResponse);
+ const request = utils.deepClone(exchangeBidRequest);
+
+ delete body.seatbid[1];
+ delete body.seatbid[0].bid[0].h;
+ delete body.seatbid[0].bid[0].w;
+
+ const bids = spec.interpretResponse(
+ { body },
+ { data: JSON.stringify(request) }
+ );
+
+ expect(bids.length).to.equal(1);
+ });
+ });
+
+ describe('getUserSyncs()', () => {
+ it('should return user syncs if there are included in the response and syncs are enabled', () => {
+ const syncs = spec.getUserSyncs(
+ {
+ pixelEnabled: true,
+ iframeEnabled: true,
+ },
+ [{ body: exchangeResponse }]
+ );
+
+ expect(syncs).to.deep.equal([
+ {
+ type: 'image',
+ url: 'http://sometest.com/sync/1234567',
+ },
+ {
+ type: 'iframe',
+ url: 'http://sometest.com/sync/1234567',
+ },
+ ]);
+ });
+
+ it('should not return user syncs if syncs are disabled', () => {
+ const syncs = spec.getUserSyncs(
+ {
+ pixelEnabled: false,
+ iframeEnabled: false,
+ },
+ [{ body: exchangeResponse }]
+ );
+
+ expect(syncs).to.deep.equal([]);
+ });
+
+ it('should return image syncs if they are enabled', () => {
+ const syncs = spec.getUserSyncs(
+ {
+ pixelEnabled: true,
+ iframeEnabled: false,
+ },
+ [{ body: exchangeResponse }]
+ );
+
+ expect(syncs).to.deep.equal([
+ {
+ type: 'image',
+ url: 'http://sometest.com/sync/1234567',
+ },
+ ]);
+ });
+
+ it('should return iframe syncs if they are enabled', () => {
+ const syncs = spec.getUserSyncs(
+ {
+ pixelEnabled: false,
+ iframeEnabled: true,
+ },
+ [{ body: exchangeResponse }]
+ );
+
+ expect(syncs).to.deep.equal([
+ {
+ type: 'iframe',
+ url: 'http://sometest.com/sync/1234567',
+ },
+ ]);
+ });
+
+ it('should append COPPA status to sync url', () => {
+ sandbox.stub(common, 'getConfig').withArgs('coppa').returns(true);
+ const syncs = spec.getUserSyncs(
+ {
+ pixelEnabled: false,
+ iframeEnabled: true,
+ },
+ [{ body: utils.deepClone(exchangeResponse) }]
+ );
+
+ expect(syncs).to.deep.equal([
+ {
+ type: 'iframe',
+ url: 'http://sometest.com/sync/1234567?coppa=1',
+ },
+ ]);
+ });
+
+ it('should append GDPR consent data to url', () => {
+ sandbox.stub(common, 'getConfig').withArgs('coppa').returns(false);
+ const syncs = spec.getUserSyncs(
+ {
+ pixelEnabled: false,
+ iframeEnabled: true,
+ },
+ [{ body: utils.deepClone(exchangeResponse) }],
+ { gdprApplies: true, consentString: 'gdprConsentString' }
+ );
+
+ expect(syncs).to.deep.equal([
+ {
+ type: 'iframe',
+ url: 'http://sometest.com/sync/1234567?gdpr=1&consentString=gdprConsentString',
+ },
+ ]);
+ });
+
+ it('should append USP (CCPA) consent string to url', () => {
+ const syncs = spec.getUserSyncs(
+ {
+ pixelEnabled: false,
+ iframeEnabled: true,
+ },
+ [{ body: utils.deepClone(exchangeResponse) }],
+ undefined,
+ 'uspConsentString'
+ );
+
+ expect(syncs).to.deep.equal([
+ {
+ type: 'iframe',
+ url: 'http://sometest.com/sync/1234567?us_privacy=uspConsentString',
+ },
+ ]);
+ });
+
+ it('should append COPPA, GDPR and USP (CCPA) url params', () => {
+ sandbox.stub(common, 'getConfig').withArgs('coppa').returns(true);
+ const syncs = spec.getUserSyncs(
+ {
+ pixelEnabled: true,
+ iframeEnabled: true,
+ },
+ [{ body: utils.deepClone(exchangeResponse) }],
+ { gdprApplies: true, consentString: 'gdprConsentString' },
+ 'uspConsentString'
+ );
+
+ expect(syncs).to.deep.equal([
+ {
+ type: 'image',
+ url: 'http://sometest.com/sync/1234567?gdpr=1&consentString=gdprConsentString&us_privacy=uspConsentString&coppa=1',
+ },
+ {
+ type: 'iframe',
+ url: 'http://sometest.com/sync/1234567?gdpr=1&consentString=gdprConsentString&us_privacy=uspConsentString&coppa=1',
+ },
+ ]);
+ });
+
+ it('should respect url param syntax when appending params', () => {
+ sandbox.stub(common, 'getConfig').withArgs('coppa').returns(true);
+
+ const response = utils.deepClone(exchangeResponse);
+
+ response.ext.sync[0] = {
+ type: 'image',
+ url: 'http://sometest.com/sync/1234567?horseCount=4',
+ };
+
+ const syncs = spec.getUserSyncs(
+ {
+ pixelEnabled: true,
+ iframeEnabled: false,
+ },
+ [{ body: response }],
+ { gdprApplies: true, consentString: 'gdprConsentString' },
+ 'uspConsentString'
+ );
+
+ expect(syncs).to.deep.equal([
+ {
+ type: 'image',
+ url: 'http://sometest.com/sync/1234567?horseCount=4&gdpr=1&consentString=gdprConsentString&us_privacy=uspConsentString&coppa=1',
+ },
+ ]);
+ });
+ });
+
+ describe('onBidWon()', () => {
+ it('should track win if win tracking is enabled', () => {
+ const spy = sandbox.spy(utils, 'triggerPixel');
+
+ sandbox
+ .stub(common, 'getConfig')
+ .withArgs('adbookpsp.winTrackingEnabled')
+ .returns(true)
+ .withArgs('adbookpsp.winTrackingUrl')
+ .returns('https://ev.fattail.com/wins');
+
+ spec.onBidWon({
+ requestId: 'requestId',
+ bidderRequestId: 'bidderRequestId',
+ bidId: 'bidId',
+ });
+
+ expect(
+ spy.calledWith(
+ 'https://ev.fattail.com/wins?impId=requestId&reqId=bidderRequestId&bidId=bidId'
+ )
+ ).to.equal(true);
+ });
+ it('should call bid.nurl if win tracking is enabled', () => {
+ const spy = sandbox.spy(utils, 'triggerPixel');
+
+ sandbox
+ .stub(common, 'getConfig')
+ .withArgs('adbookpsp.winTrackingEnabled')
+ .returns(true)
+ .withArgs('adbookpsp.winTrackingUrl')
+ .returns('https://ev.fattail.com/wins');
+
+ spec.onBidWon({
+ requestId: 'requestId',
+ bidderRequestId: 'bidderRequestId',
+ bidId: 'bidId',
+ nurl: 'http://win.example.url',
+ });
+
+ expect(spy.calledWith('http://win.example.url')).to.equal(true);
+ });
+ it('should not track win nor call bid.nurl if win tracking is disabled', () => {
+ const spy = sandbox.spy(utils, 'triggerPixel');
+
+ sandbox
+ .stub(common, 'getConfig')
+ .withArgs('adbookpsp.winTrackingEnabled')
+ .returns(false)
+ .withArgs('adbookpsp.winTrackingUrl')
+ .returns('https://ev.fattail.com/wins');
+
+ spec.onBidWon({
+ requestId: 'requestId',
+ bidderRequestId: 'bidderRequestId',
+ bidId: 'bidId',
+ nurl: 'http://win.example.url',
+ });
+
+ expect(spy.notCalled).to.equal(true);
+ });
+ });
+});
+
+const bidderRequest = {
+ auctionId: 'aaccee333311',
+ bidderRequestId: '999ccceeee11',
+ timeout: 200,
+ refererInfo: {
+ referer: 'http://example-domain.com/foo',
+ },
+ gdprConsent: {
+ gdprApplies: 1,
+ consentString: 'gdprConsentString',
+ },
+ uspConsent: 'uspConsentString',
+};
+
+const bannerBid = {
+ bidder: 'adbookpsp',
+ params: {
+ placementId: '12390123',
+ },
+ mediaTypes: {
+ banner: {
+ sizes: [
+ [300, 250],
+ [300, 600],
+ ],
+ },
+ },
+ adUnitCode: 'div-gpt-ad-837465923534-0',
+ transactionId: 'sfsf89e-mck3-asf3-fe45-feksjfi123mfs',
+ bidId: '9873kfse',
+ bidderRequestId: '999ccceeee11',
+ auctionId: 'aaccee333311',
+ lineItemId: 123123123,
+};
+
+const bannerExchangeRequest = {
+ id: '999ccceeee11',
+ device: {
+ h: 100,
+ w: 100,
+ js: true,
+ ua: navigator.userAgent,
+ dnt: 0,
+ },
+ regs: {
+ coppa: 0,
+ ext: {
+ gdpr: 1,
+ gdprConsentString: 'gdprConsentString',
+ us_privacy: 'uspConsentString',
+ },
+ },
+ site: {
+ domain: location.hostname,
+ page: location.href,
+ ref: 'http://example-domain.com/foo',
+ },
+ source: {
+ fd: 1,
+ tid: 'aaccee333311',
+ },
+ tmax: 200,
+ user: {
+ gdprConsentString: 'gdprConsentString',
+ id: '54444444-5444-4444-9444-544444444444',
+ },
+ imp: [
+ {
+ banner: {
+ format: [
+ {
+ w: 300,
+ h: 250,
+ },
+ {
+ w: 300,
+ h: 600,
+ },
+ ],
+ w: 300,
+ h: 250,
+ topframe: 0,
+ pos: 0,
+ },
+ ext: {
+ adbook: {
+ placementId: '12390123',
+ },
+ },
+ id: '9873kfse',
+ tagid: 'div-gpt-ad-837465923534-0',
+ },
+ ],
+ ext: {
+ adbook: {
+ version: {
+ adapter: VERSION,
+ prebid: '$prebid.version$',
+ },
+ },
+ },
+};
+
+const videoBid = {
+ bidder: 'adbookpsp',
+ params: {
+ placementId: '129576',
+ },
+ mediaTypes: {
+ video: {
+ api: [1, 2, 4, 6],
+ mimes: ['video/mp4'],
+ playbackmethod: [2, 4, 6],
+ playerSize: [[400, 300]],
+ protocols: [3, 4, 7, 8, 10],
+ },
+ },
+ adUnitCode: 'div-gpt-ad-9383743831-6',
+ transactionId: 'aacc3fasf-fere-1335-8m1s-785393mc3fj',
+ bidId: '120kfeske',
+ bidderRequestId: '999ccceeee11',
+ auctionId: 'aaccee333311',
+ lineItemId: 321321321,
+};
+
+const videoExchangeRequest = {
+ id: '999ccceeee11',
+ device: {
+ h: 100,
+ w: 100,
+ js: true,
+ ua: navigator.userAgent,
+ dnt: 0,
+ },
+ regs: {
+ coppa: 0,
+ ext: {
+ gdpr: 1,
+ gdprConsentString: 'gdprConsentString',
+ us_privacy: 'uspConsentString',
+ },
+ },
+ site: {
+ domain: location.hostname,
+ page: location.href,
+ ref: 'http://example-domain.com/foo',
+ },
+ source: {
+ fd: 1,
+ tid: 'aaccee333311',
+ },
+ tmax: 200,
+ user: {
+ gdprConsentString: 'gdprConsentString',
+ id: '54444444-5444-4444-9444-544444444444',
+ },
+ imp: [
+ {
+ video: {
+ api: [1, 2, 4, 6],
+ h: 300,
+ mimes: ['video/mp4'],
+ playbackmethod: [2, 4, 6],
+ protocols: [3, 4, 7, 8, 10],
+ w: 400,
+ },
+ ext: {
+ adbook: {
+ placementId: '129576',
+ },
+ },
+ id: '120kfeske',
+ tagid: 'div-gpt-ad-9383743831-6',
+ },
+ ],
+ ext: {
+ adbook: {
+ version: {
+ adapter: VERSION,
+ prebid: '$prebid.version$',
+ },
+ },
+ },
+};
+
+const mixedBid = {
+ bidder: 'adbookpsp',
+ params: {
+ orgId: '129576',
+ },
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 600]],
+ },
+ video: {
+ mimes: ['video/mp4'],
+ playerSize: [[300, 600]],
+ },
+ },
+ adUnitCode: 'div-gpt-ad-9383743831-5',
+ transactionId: 'aacc3fasf-fere-1335-8m1s-785393mc3fj',
+ bidId: '120kfeske',
+ bidderRequestId: '999ccceeee11',
+ auctionId: 'aaccee333311',
+ lineItemId: 12341234,
+};
+
+const mixedExchangeRequest = {
+ id: '999ccceeee11',
+ device: {
+ h: 100,
+ w: 100,
+ js: true,
+ ua: navigator.userAgent,
+ dnt: 0,
+ },
+ regs: {
+ coppa: 0,
+ ext: {
+ gdpr: 1,
+ gdprConsentString: 'gdprConsentString',
+ us_privacy: 'uspConsentString',
+ },
+ },
+ site: {
+ domain: location.hostname,
+ page: location.href,
+ ref: 'http://example-domain.com/foo',
+ },
+ source: {
+ fd: 1,
+ tid: 'aaccee333311',
+ },
+ tmax: 200,
+ user: {
+ gdprConsentString: 'gdprConsentString',
+ id: '54444444-5444-4444-9444-544444444444',
+ },
+ imp: [
+ {
+ banner: {
+ format: [
+ {
+ w: 300,
+ h: 600,
+ },
+ ],
+ w: 300,
+ h: 600,
+ topframe: 0,
+ pos: 0,
+ },
+ video: {
+ h: 600,
+ mimes: ['video/mp4'],
+ w: 300,
+ },
+ ext: {
+ adbook: {
+ orgId: '129576',
+ },
+ },
+ id: '120kfeske',
+ tagid: 'div-gpt-ad-9383743831-5',
+ },
+ ],
+ ext: {
+ adbook: {
+ version: {
+ adapter: VERSION,
+ prebid: '$prebid.version$',
+ },
+ },
+ },
+};
+
+const exchangeBidRequest = {
+ id: '999ccceeee11',
+ tmax: 200,
+ imp: [
+ {
+ id: '9873kfse',
+ banner: {
+ format: [
+ {
+ w: 300,
+ h: 250,
+ },
+ ],
+ },
+ video: {
+ w: 300,
+ h: 250,
+ },
+ tagid: 'div-gpt-ad-837465923534-0',
+ },
+ {
+ id: '120kfeske',
+ banner: {
+ format: [
+ {
+ w: 300,
+ h: 250,
+ },
+ ],
+ },
+ video: {
+ w: 300,
+ h: 250,
+ },
+ tagid: 'div-gpt-ad-837465923534-0',
+ },
+ ],
+ source: {
+ fd: 1,
+ tid: 'aaccee333311',
+ },
+ site: {
+ domain: location.hostname,
+ page: location.href,
+ ref: 'http://prebid-test-page.io:8080/banner.html',
+ },
+};
+
+const exchangeResponse = {
+ id: '999ccceeee11',
+ seatbid: [
+ {
+ seat: 'adbookpsp',
+ group: 0,
+ bid: [
+ {
+ id: 'bid123456',
+ w: 300,
+ h: 250,
+ impid: '9873kfse',
+ price: 0.5,
+ exp: 300,
+ crid: '123456789',
+ adm: 'ad
',
+ adid: '5',
+ dealid: 'werwetwerw',
+ nurl: 'http://win.example.url',
+ ext: {
+ liid: '2342345',
+ },
+ cat: ['IAB2-1', 'IAB2-2', 'IAB2-3'],
+ adomain: ['advertiser.com'],
+ },
+ ],
+ },
+ {
+ seat: 'adbookpsp',
+ group: 0,
+ bid: [
+ {
+ id: 'bid4321',
+ impid: '120kfeske',
+ price: 0.45,
+ exp: 300,
+ crid: '543123',
+ adm: ' ',
+ adid: '10',
+ dealid: 'dsfxcxcvxc',
+ nurl: 'http://win.example.url',
+ ext: {
+ liid: '2121221',
+ },
+ cat: ['IAB2-3'],
+ adomain: ['advertiser.com', 'campaign.advertiser.com'],
+ },
+ ],
+ },
+ ],
+ ext: {
+ sync: [
+ {
+ type: 'image',
+ url: 'http://sometest.com/sync/1234567',
+ },
+ {
+ type: 'iframe',
+ url: 'http://sometest.com/sync/1234567',
+ },
+ ],
+ },
+};
diff --git a/test/spec/modules/adbutlerBidAdapter_spec.js b/test/spec/modules/adbutlerBidAdapter_spec.js
deleted file mode 100644
index 6dedce321d8..00000000000
--- a/test/spec/modules/adbutlerBidAdapter_spec.js
+++ /dev/null
@@ -1,231 +0,0 @@
-import {expect} from 'chai';
-import {spec} from 'modules/adbutlerBidAdapter.js';
-
-describe('AdButler adapter', function () {
- let bidRequests;
-
- beforeEach(function () {
- bidRequests = [
- {
- bidder: 'adbutler',
- params: {
- accountID: '167283',
- zoneID: '210093',
- keyword: 'red',
- minCPM: '1.00',
- maxCPM: '5.00',
- extra: {
- foo: 'bar',
- }
- },
- placementCode: '/19968336/header-bid-tag-1',
- mediaTypes: {
- banner: {
- sizes: [[300, 250], [300, 600]],
- },
- },
- bidId: '23acc48ad47af5',
- auctionId: '0fb4905b-9456-4152-86be-c6f6d259ba99',
- bidderRequestId: '1c56ad30b9b8ca8',
- transactionId: '92489f71-1bf2-49a0-adf9-000cea934729'
- }
- ];
- });
-
- describe('implementation', function () {
- describe('for requests', function () {
- it('should accept valid bid', function () {
- let validBid = {
- bidder: 'adbutler',
- params: {
- accountID: '167283',
- zoneID: '210093'
- }
- },
- isValid = spec.isBidRequestValid(validBid);
-
- expect(isValid).to.equal(true);
- });
-
- it('should reject invalid bid', function () {
- let invalidBid = {
- bidder: 'adbutler',
- params: {
- accountID: '167283',
- }
- },
- isValid = spec.isBidRequestValid(invalidBid);
-
- expect(isValid).to.equal(false);
- });
-
- it('should use custom domain string', function () {
- let bidRequests = [
- {
- bidId: '3c9408cdbf2f68',
- sizes: [[300, 250]],
- bidder: 'adbutler',
- params: {
- accountID: '107878',
- zoneID: '86133',
- domain: 'servedbyadbutler.com.dan.test'
- },
- auctionId: '10b327aa396609',
- placementCode: '/123456/header-bid-tag-1'
- }
- ],
- requests = spec.buildRequests(bidRequests),
- requestURL = requests[0].url;
-
- expect(requestURL).to.have.string('.dan.test');
- });
-
- it('should set default domain', function () {
- let requests = spec.buildRequests(bidRequests),
- request = requests[0];
-
- let [domain] = request.url.split('/adserve/');
-
- expect(domain).to.equal('https://servedbyadbutler.com');
- });
-
- it('should set the keyword parameter', function () {
- let requests = spec.buildRequests(bidRequests),
- requestURL = requests[0].url;
-
- expect(requestURL).to.have.string(';kw=red;');
- });
-
- it('should set the extra parameter', () => {
- let requests = spec.buildRequests(bidRequests);
- let requestURL = requests[0].url;
-
- expect(requestURL).to.have.string(';foo=bar;');
- });
-
- it('should increment the count for the same zone', function () {
- let bidRequests = [
- {
- sizes: [[300, 250]],
- bidder: 'adbutler',
- params: {
- accountID: '107878',
- zoneID: '86133',
- }
- }, {
- sizes: [[300, 250]],
- bidder: 'adbutler',
- params: {
- accountID: '107878',
- zoneID: '86133',
- }
- },
- ],
- requests = spec.buildRequests(bidRequests),
- firstRequest = requests[0].url,
- secondRequest = requests[1].url;
-
- expect(firstRequest).to.have.string(';place=0;');
- expect(secondRequest).to.have.string(';place=1;');
- });
- });
-
- describe('bid responses', function () {
- it('should return complete bid response', function () {
- let serverResponse = {
- body: {
- status: 'SUCCESS',
- account_id: 167283,
- zone_id: 210093,
- cpm: 1.5,
- width: 300,
- height: 250,
- place: 0,
- ad_code: ' ',
- tracking_pixels: [
- 'http://tracking.pixel.com/params=info'
- ]
- }
- },
- bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
-
- expect(bids).to.be.lengthOf(1);
-
- expect(bids[0].bidderCode).to.equal('adbutler');
- expect(bids[0].cpm).to.equal(1.5);
- expect(bids[0].width).to.equal(300);
- expect(bids[0].height).to.equal(250);
- expect(bids[0].currency).to.equal('USD');
- expect(bids[0].netRevenue).to.equal(true);
- expect(bids[0].ad).to.have.length.above(1);
- expect(bids[0].ad).to.have.string('http://tracking.pixel.com/params=info');
- });
-
- it('should return empty bid response', function () {
- let serverResponse = {
- body: {
- status: 'NO_ELIGIBLE_ADS',
- zone_id: 210083,
- width: 300,
- height: 250,
- place: 0
- }
- },
- bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
-
- expect(bids).to.be.lengthOf(0);
- });
-
- it('should return empty bid response on incorrect size', function () {
- let serverResponse = {
- body: {
- status: 'SUCCESS',
- account_id: 167283,
- zone_id: 210083,
- cpm: 1.5,
- width: 728,
- height: 90,
- place: 0
- }
- },
- bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
-
- expect(bids).to.be.lengthOf(0);
- });
-
- it('should return empty bid response with CPM too low', function () {
- let serverResponse = {
- body: {
- status: 'SUCCESS',
- account_id: 167283,
- zone_id: 210093,
- cpm: 0.75,
- width: 300,
- height: 250,
- place: 0
- }
- },
- bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
-
- expect(bids).to.be.lengthOf(0);
- });
-
- it('should return empty bid response with CPM too high', function () {
- let serverResponse = {
- body: {
- status: 'SUCCESS',
- account_id: 167283,
- zone_id: 210093,
- cpm: 7,
- width: 300,
- height: 250,
- place: 0
- }
- },
- bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
-
- expect(bids).to.be.lengthOf(0);
- });
- });
- });
-});
diff --git a/test/spec/modules/adfBidAdapter_spec.js b/test/spec/modules/adfBidAdapter_spec.js
index ae92af32a1e..25ad6987153 100644
--- a/test/spec/modules/adfBidAdapter_spec.js
+++ b/test/spec/modules/adfBidAdapter_spec.js
@@ -1,12 +1,10 @@
// jshint esversion: 6, es3: false, node: true
-import {assert, expect} from 'chai';
-import {spec} from 'modules/adfBidAdapter.js';
-import { NATIVE } from 'src/mediaTypes.js';
+import { assert } from 'chai';
+import { spec } from 'modules/adfBidAdapter.js';
import { config } from 'src/config.js';
import { createEidsArray } from 'modules/userId/eids.js';
describe('Adf adapter', function () {
- let serverResponse, bidRequest, bidResponses;
let bids = [];
describe('backwards-compatibility', function () {
@@ -14,6 +12,11 @@ describe('Adf adapter', function () {
assert.equal(spec.aliases[0].code, 'adformOpenRTB');
assert.equal(spec.aliases[0].gvlid, 50);
});
+
+ it('should have adform alias defined', function () {
+ assert.equal(spec.aliases[1].code, 'adform');
+ assert.equal(spec.aliases[1].gvlid, 50);
+ });
});
describe('isBidRequestValid', function () {
diff --git a/test/spec/modules/adfinityBidAdapter_spec.js b/test/spec/modules/adfinityBidAdapter_spec.js
deleted file mode 100644
index 479a2303dd5..00000000000
--- a/test/spec/modules/adfinityBidAdapter_spec.js
+++ /dev/null
@@ -1,151 +0,0 @@
-import {expect} from 'chai';
-import {spec} from '../../../modules/adfinityBidAdapter.js';
-
-describe('AdfinityAdapter', function () {
- let bid = {
- bidId: '2dd581a2b6281d',
- bidder: 'adfinity',
- bidderRequestId: '145e1d6a7837c9',
- params: {
- placement_id: 0
- },
- placementCode: 'placementid_0',
- auctionId: '74f78609-a92d-4cf1-869f-1b244bbfb5d2',
- mediaTypes: {
- banner: {
- sizes: [[300, 250]]
- }
- },
- transactionId: '3bb2f6da-87a6-4029-aeb0-bfe951372e62',
- schain: {
- ver: '1.0',
- complete: 1,
- nodes: [
- {
- asi: 'example.com',
- sid: '0',
- hp: 1,
- rid: 'bidrequestid',
- domain: 'example.com'
- }
- ]
- }
- };
- let bidderRequest = {
- bidderCode: 'adfinity',
- auctionId: 'fffffff-ffff-ffff-ffff-ffffffffffff',
- bidderRequestId: 'ffffffffffffff',
- start: 1472239426002,
- auctionStart: 1472239426000,
- timeout: 5000,
- uspConsent: '1YN-',
- refererInfo: {
- referer: 'http://www.example.com',
- reachedTop: true,
- },
- bids: [bid]
- }
-
- describe('isBidRequestValid', function () {
- it('Should return true when placement_id can be cast to a number', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
- });
- it('Should return false when placement_id is not a number', function () {
- bid.params.placement_id = 'aaa';
- expect(spec.isBidRequestValid(bid)).to.be.false;
- });
- });
-
- describe('buildRequests', function () {
- let serverRequest = spec.buildRequests([bid], bidderRequest);
- it('Creates a ServerRequest object with method, URL and data', function () {
- expect(serverRequest).to.exist;
- expect(serverRequest.method).to.exist;
- expect(serverRequest.url).to.exist;
- expect(serverRequest.data).to.exist;
- });
- it('Returns POST method', function () {
- expect(serverRequest.method).to.equal('POST');
- });
- it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://stat.adfinity.pro/?c=o&m=multi');
- });
-
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'secure', 'host', 'page', 'placements');
- expect(data.deviceWidth).to.be.a('number');
- expect(data.deviceHeight).to.be.a('number');
- expect(data.language).to.be.a('string');
- expect(data.secure).to.be.within(0, 1);
- expect(data.host).to.be.a('string');
- expect(data.page).to.be.a('string');
- let placements = data['placements'];
- for (let i = 0; i < placements.length; i++) {
- let placement = placements[i];
- expect(placement).to.have.all.keys('placementId', 'bidId', 'traffic', 'sizes', 'schain');
- expect(placement.schain).to.be.an('object')
- expect(placement.placementId).to.be.a('number');
- expect(placement.bidId).to.be.a('string');
- expect(placement.traffic).to.be.a('string');
- expect(placement.sizes).to.be.an('array');
- }
- });
- it('Returns empty data if no valid requests are passed', function () {
- serverRequest = spec.buildRequests([]);
- let data = serverRequest.data;
- expect(data.placements).to.be.an('array').that.is.empty;
- });
- });
- describe('interpretResponse', function () {
- let resObject = {
- body: [ {
- requestId: '123',
- mediaType: 'banner',
- cpm: 0.3,
- width: 320,
- height: 50,
- ad: 'Hello ad ',
- ttl: 1000,
- creativeId: '123asd',
- netRevenue: true,
- currency: 'USD'
- } ]
- };
- let serverResponses = spec.interpretResponse(resObject);
- it('Returns an array of valid server responses if response object is valid', function () {
- expect(serverResponses).to.be.an('array').that.is.not.empty;
- for (let i = 0; i < serverResponses.length; i++) {
- let dataItem = serverResponses[i];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'mediaType');
- expect(dataItem.requestId).to.be.a('string');
- expect(dataItem.cpm).to.be.a('number');
- expect(dataItem.width).to.be.a('number');
- expect(dataItem.height).to.be.a('number');
- expect(dataItem.ad).to.be.a('string');
- expect(dataItem.ttl).to.be.a('number');
- expect(dataItem.creativeId).to.be.a('string');
- expect(dataItem.netRevenue).to.be.a('boolean');
- expect(dataItem.currency).to.be.a('string');
- expect(dataItem.mediaType).to.be.a('string');
- }
- it('Returns an empty array if invalid response is passed', function () {
- serverResponses = spec.interpretResponse('invalid_response');
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- });
- });
-
- describe('getUserSyncs', function () {
- let userSync = spec.getUserSyncs();
- it('Returns valid URL and type', function () {
- expect(userSync).to.be.an('array').with.lengthOf(1);
- expect(userSync[0].type).to.exist;
- expect(userSync[0].url).to.exist;
- expect(userSync[0].type).to.be.equal('image');
- expect(userSync[0].url).to.be.equal('https://stat.adfinity.pro/?c=o&m=cookie');
- });
- });
-});
diff --git a/test/spec/modules/adformBidAdapter_spec.js b/test/spec/modules/adformBidAdapter_spec.js
deleted file mode 100644
index 79ea76da8dd..00000000000
--- a/test/spec/modules/adformBidAdapter_spec.js
+++ /dev/null
@@ -1,550 +0,0 @@
-import {assert, expect} from 'chai';
-import {spec} from 'modules/adformBidAdapter.js';
-import { BANNER, VIDEO } from 'src/mediaTypes.js';
-import { config } from 'src/config.js';
-import { createEidsArray } from 'modules/userId/eids.js';
-
-describe('Adform adapter', function () {
- let serverResponse, bidRequest, bidResponses;
- let bids = [];
- describe('isBidRequestValid', function () {
- let bid = {
- 'bidder': 'adform',
- 'params': {
- 'mid': '19910113'
- }
- };
-
- it('should return true when required params found', function () {
- assert(spec.isBidRequestValid(bid));
- });
-
- it('should return false when required params are missing', function () {
- bid.params = {
- adxDomain: 'adx.adform.net'
- };
- assert.isFalse(spec.isBidRequestValid(bid));
- });
- });
-
- describe('buildRequests', function () {
- it('should pass multiple bids via single request', function () {
- let request = spec.buildRequests(bids);
- let parsedUrl = parseUrl(request.url);
- assert.lengthOf(parsedUrl.items, 7);
- });
-
- it('should handle global request parameters', function () {
- let parsedUrl = parseUrl(spec.buildRequests([bids[0]]).url);
- let query = parsedUrl.query;
-
- assert.equal(parsedUrl.path, 'https://newDomain/adx');
- assert.equal(query.tid, 45);
- assert.equal(query.rp, 4);
- assert.equal(query.fd, 1);
- assert.equal(query.stid, '7aefb970-2045');
- assert.equal(query.url, encodeURIComponent('some// there'));
- });
-
- it('should set correct request method', function () {
- let request = spec.buildRequests([bids[0]]);
- assert.equal(request.method, 'GET');
- });
-
- it('should pass request currency from config', function () {
- config.setConfig({ currency: { adServerCurrency: 'PLN' } });
- let request = parseUrl(spec.buildRequests(bids).url);
-
- request.items.forEach(item => {
- assert.equal(item.rcur, 'PLN');
- });
- });
-
- it('should prefer bid currency over global config', function () {
- config.setConfig({ currency: { adServerCurrency: 'PLN' } });
- bids[0].params.rcur = 'USD';
- let request = parseUrl(spec.buildRequests(bids).url);
- const currencies = request.items.map(item => item.rcur);
-
- assert.deepEqual(currencies, [ 'USD', 'PLN', 'PLN', 'PLN', 'PLN', 'PLN', 'PLN' ]);
- });
-
- it('should correctly form bid items', function () {
- let bidList = bids;
- let request = spec.buildRequests(bidList);
- let parsedUrl = parseUrl(request.url);
- assert.deepEqual(parsedUrl.items, [
- {
- mid: '1',
- transactionId: '5f33781f-9552-4ca1'
- },
- {
- mid: '2',
- someVar: 'someValue',
- pt: 'gross',
- transactionId: '5f33781f-9552-4iuy'
- },
- {
- mid: '3',
- pdom: 'home',
- transactionId: '5f33781f-9552-7ev3'
- },
- {
- mid: '3',
- pdom: 'home',
- transactionId: '5f33781f-9552-7ev3'
- },
- {
- mid: '3',
- pdom: 'home',
- transactionId: '5f33781f-9552-7ev3'
- },
- {
- mid: '5',
- pt: 'net',
- transactionId: '5f33781f-9552-7ev3',
- },
- {
- mid: '6',
- pt: 'gross',
- transactionId: '5f33781f-9552-7ev3'
- }
- ]);
- });
-
- it('should not change original validBidRequests object', function () {
- var resultBids = JSON.parse(JSON.stringify(bids[0]));
- let request = spec.buildRequests([bids[0]]);
- assert.deepEqual(resultBids, bids[0]);
- });
-
- it('should set gross to the request, if there is any gross priceType', function () {
- let request = spec.buildRequests([bids[5], bids[5]]);
- let parsedUrl = parseUrl(request.url);
-
- assert.equal(parsedUrl.query.pt, 'net');
-
- request = spec.buildRequests([bids[4], bids[3]]);
- parsedUrl = parseUrl(request.url);
-
- assert.equal(parsedUrl.query.pt, 'gross');
- });
-
- it('should pass extended ids', function () {
- bids[0].userIdAsEids = createEidsArray({
- tdid: 'TTD_ID_FROM_USER_ID_MODULE',
- pubcid: 'pubCommonId_FROM_USER_ID_MODULE'
- });
- let request = spec.buildRequests(bids);
- let eids = parseUrl(request.url).query.eids;
-
- assert.equal(eids, 'eyJhZHNlcnZlci5vcmciOnsiVFREX0lEX0ZST01fVVNFUl9JRF9NT0RVTEUiOlsxXX0sInB1YmNpZC5vcmciOnsicHViQ29tbW9uSWRfRlJPTV9VU0VSX0lEX01PRFVMRSI6WzFdfX0%3D');
- assert.deepEqual(JSON.parse(atob(decodeURIComponent(eids))), {
- 'adserver.org': {
- 'TTD_ID_FROM_USER_ID_MODULE': [1]
- },
- 'pubcid.org': {
- 'pubCommonId_FROM_USER_ID_MODULE': [1]
- }
- });
- });
-
- it('should allow to pass custom extended ids', function () {
- bids[0].params.eids = 'some_id_value';
- let request = spec.buildRequests(bids);
- let eids = parseUrl(request.url).query.eids;
-
- assert.equal(eids, 'some_id_value');
- });
-
- it('should add parameter to global parameters if it exists in all bids', function () {
- const _bids = [];
- _bids.push(bids[0]);
- _bids.push(bids[1]);
- _bids.push(bids[2]);
- _bids[0].params.mkv = 'key:value,key1:value1';
- _bids[1].params.mkv = 'key:value,key1:value1,keyR:removed';
- _bids[2].params.mkv = 'key:value,key1:value1,keyR:removed,key8:value1';
- _bids[0].params.mkw = 'targeting';
- _bids[1].params.mkw = 'targeting';
- _bids[2].params.mkw = 'targeting,targeting2';
- _bids[0].params.msw = 'search:word,search:word2';
- _bids[1].params.msw = 'search:word';
- _bids[2].params.msw = 'search:word,search:word5';
- let bidList = _bids;
- let request = spec.buildRequests(bidList);
- let parsedUrl = parseUrl(request.url);
- assert.equal(parsedUrl.query.mkv, encodeURIComponent('key:value,key1:value1'));
- assert.equal(parsedUrl.query.mkw, 'targeting');
- assert.equal(parsedUrl.query.msw, encodeURIComponent('search:word'));
- assert.ok(!parsedUrl.items[0].mkv);
- assert.ok(!parsedUrl.items[0].mkw);
- assert.equal(parsedUrl.items[0].msw, 'search:word2');
- assert.equal(parsedUrl.items[1].mkv, 'keyR:removed');
- assert.ok(!parsedUrl.items[1].mkw);
- assert.ok(!parsedUrl.items[1].msw);
- assert.equal(parsedUrl.items[2].mkv, 'keyR:removed,key8:value1');
- assert.equal(parsedUrl.items[2].mkw, 'targeting2');
- assert.equal(parsedUrl.items[2].msw, 'search:word5');
- });
-
- describe('user privacy', function () {
- it('should send GDPR Consent data to adform if gdprApplies', function () {
- let request = spec.buildRequests([bids[0]], {gdprConsent: {gdprApplies: true, consentString: 'concentDataString'}});
- let parsedUrl = parseUrl(request.url).query;
-
- assert.equal(parsedUrl.gdpr, '1');
- assert.equal(parsedUrl.gdpr_consent, 'concentDataString');
- });
-
- it('should not send GDPR Consent data to adform if gdprApplies is undefined', function () {
- let request = spec.buildRequests([bids[0]], {gdprConsent: {gdprApplies: false, consentString: 'concentDataString'}});
- let parsedUrl = parseUrl(request.url).query;
-
- assert.equal(parsedUrl.gdpr, '0');
- assert.equal(parsedUrl.gdpr_consent, 'concentDataString');
-
- request = spec.buildRequests([bids[0]], {gdprConsent: {gdprApplies: undefined, consentString: 'concentDataString'}});
- parsedUrl = parseUrl(request.url).query;
- assert.ok(!parsedUrl.gdpr);
- assert.ok(!parsedUrl.gdpr_consent);
- });
-
- it('should return GDPR Consent data with request data', function () {
- let request = spec.buildRequests([bids[0]], {gdprConsent: {gdprApplies: true, consentString: 'concentDataString'}});
-
- assert.deepEqual(request.gdpr, {
- gdpr: true,
- gdpr_consent: 'concentDataString'
- });
-
- request = spec.buildRequests([bids[0]]);
- assert.ok(!request.gdpr);
- });
-
- it('should send CCPA Consent data to adform', function () {
- const request = spec.buildRequests([bids[0]], {uspConsent: '1YA-'});
- const parsedUrl = parseUrl(request.url).query;
-
- assert.equal(parsedUrl.us_privacy, '1YA-');
- });
- });
- });
-
- describe('interpretResponse', function () {
- it('should respond with empty response when there is empty serverResponse', function () {
- let result = spec.interpretResponse({ body: {} }, {});
- assert.deepEqual(result, []);
- });
- it('should respond with empty response when response from server is not banner', function () {
- serverResponse.body[0].response = 'not banner';
- serverResponse.body = [serverResponse.body[0]];
- bidRequest.bids = [bidRequest.bids[0]];
- let result = spec.interpretResponse(serverResponse, bidRequest);
-
- assert.deepEqual(result, []);
- });
- it('should interpret server response correctly with one bid', function () {
- serverResponse.body = [serverResponse.body[0]];
- bidRequest.bids = [bidRequest.bids[0]];
- let result = spec.interpretResponse(serverResponse, bidRequest)[0];
-
- assert.equal(result.requestId, '2a0cf4e');
- assert.equal(result.cpm, 13.9);
- assert.equal(result.width, 300);
- assert.equal(result.height, 250);
- assert.equal(result.creativeId, '2a0cf4e');
- assert.equal(result.dealId, '123abc');
- assert.equal(result.currency, 'EUR');
- assert.equal(result.netRevenue, true);
- assert.equal(result.ttl, 360);
- assert.deepEqual(result.meta.advertiserDomains, [])
- assert.equal(result.ad, '');
- assert.equal(result.bidderCode, 'adform');
- assert.equal(result.transactionId, '5f33781f-9552-4ca1');
- });
-
- it('should set correct netRevenue', function () {
- serverResponse.body = [serverResponse.body[0]];
- bidRequest.bids = [bidRequest.bids[1]];
- bidRequest.netRevenue = 'gross';
- let result = spec.interpretResponse(serverResponse, bidRequest)[0];
-
- assert.equal(result.netRevenue, false);
- });
-
- it('should create bid response item for every requested item', function () {
- let result = spec.interpretResponse(serverResponse, bidRequest);
- assert.lengthOf(result, 5);
- });
-
- it('should create bid response with vast xml', function () {
- const result = spec.interpretResponse(serverResponse, bidRequest)[3];
- assert.equal(result.vastXml, '');
- });
-
- it('should create bid response with vast url', function () {
- const result = spec.interpretResponse(serverResponse, bidRequest)[4];
- assert.equal(result.vastUrl, 'vast://url');
- });
-
- it('should set mediaType on bid response', function () {
- const expected = [ BANNER, BANNER, BANNER, VIDEO, VIDEO ];
- const result = spec.interpretResponse(serverResponse, bidRequest);
- for (let i = 0; i < result.length; i++) {
- assert.equal(result[i].mediaType, expected[i]);
- }
- });
-
- it('should set default netRevenue as gross', function () {
- bidRequest.netRevenue = 'gross';
- const result = spec.interpretResponse(serverResponse, bidRequest);
- for (let i = 0; i < result.length; i++) {
- assert.equal(result[i].netRevenue, false);
- }
- });
-
- it('should set gdpr if it exist in bidRequest', function () {
- bidRequest.gdpr = {
- gdpr: true,
- gdpr_consent: 'ERW342EIOWT34234KMGds'
- };
- let result = spec.interpretResponse(serverResponse, bidRequest);
- for (let i = 0; i < result.length; i++) {
- assert.equal(result[i].gdpr, true);
- assert.equal(result[i].gdpr_consent, 'ERW342EIOWT34234KMGds');
- }
-
- bidRequest.gdpr = undefined;
- result = spec.interpretResponse(serverResponse, bidRequest);
- for (let i = 0; i < result.length; i++) {
- assert.ok(!result[i].gdpr);
- assert.ok(!result[i].gdpr_consent);
- }
- });
-
- it('should set a renderer only for an outstream context', function () {
- serverResponse.body = [serverResponse.body[3], serverResponse.body[2]];
- bidRequest.bids = [bidRequest.bids[6], bidRequest.bids[6]];
- let result = spec.interpretResponse(serverResponse, bidRequest);
- assert.ok(result[0].renderer);
- assert.equal(result[1].renderer, undefined);
- });
-
- describe('verifySizes', function () {
- it('should respond with empty response when sizes doesn\'t match', function () {
- serverResponse.body[0].response = 'banner';
- serverResponse.body[0].width = 100;
- serverResponse.body[0].height = 150;
-
- serverResponse.body = [serverResponse.body[0]];
- bidRequest.bids = [bidRequest.bids[0]];
- let result = spec.interpretResponse(serverResponse, bidRequest);
-
- assert.equal(serverResponse.body.length, 1);
- assert.equal(serverResponse.body[0].response, 'banner');
- assert.deepEqual(result, []);
- });
- it('should respond with empty response when sizes as a strings doesn\'t match', function () {
- serverResponse.body[0].response = 'banner';
- serverResponse.body[0].width = 100;
- serverResponse.body[0].height = 150;
-
- serverResponse.body = [serverResponse.body[0]];
- bidRequest.bids = [bidRequest.bids[0]];
-
- bidRequest.bids[0].sizes = [['101', '150']];
- let result = spec.interpretResponse(serverResponse, bidRequest);
-
- assert.equal(serverResponse.body.length, 1);
- assert.equal(serverResponse.body[0].response, 'banner');
- assert.deepEqual(result, []);
- });
- it('should support size dimensions as a strings', function () {
- serverResponse.body[0].response = 'banner';
- serverResponse.body[0].width = 300;
- serverResponse.body[0].height = 600;
-
- serverResponse.body = [serverResponse.body[0]];
- bidRequest.bids = [bidRequest.bids[0]];
-
- bidRequest.bids[0].sizes = [['300', '250'], ['250', '300'], ['300', '600'], ['600', '300']];
- let result = spec.interpretResponse(serverResponse, bidRequest);
-
- assert.equal(result[0].width, 300);
- assert.equal(result[0].height, 600);
- });
- });
- });
-
- beforeEach(function () {
- config.setConfig({ currency: {} });
-
- let sizes = [[250, 300], [300, 250], [300, 600], [600, 300]];
- let placementCode = ['div-01', 'div-02', 'div-03', 'div-04', 'div-05'];
- let mediaTypes = [{video: {context: 'outstream'}, banner: {sizes: sizes[3]}}];
- let params = [{ mid: 1, url: 'some// there' }, {adxDomain: null, mid: 2, someVar: 'someValue', pt: 'gross'}, { adxDomain: null, mid: 3, pdom: 'home' }, {mid: 5, pt: 'net'}, {mid: 6, pt: 'gross'}];
- bids = [
- {
- adUnitCode: placementCode[0],
- auctionId: '7aefb970-2045',
- bidId: '2a0cf4e',
- bidder: 'adform',
- bidderRequestId: '1ab8d9',
- params: params[0],
- adxDomain: 'newDomain',
- tid: 45,
- placementCode: placementCode[0],
- sizes: [[300, 250], [250, 300], [300, 600], [600, 300]],
- transactionId: '5f33781f-9552-4ca1'
- },
- {
- adUnitCode: placementCode[1],
- auctionId: '7aefb970-2045',
- bidId: '2a0cf5b',
- bidder: 'adform',
- bidderRequestId: '1ab8d9',
- params: params[1],
- placementCode: placementCode[1],
- sizes: [[300, 250], [250, 300], [300, 600], [600, 300]],
- transactionId: '5f33781f-9552-4iuy'
- },
- {
- adUnitCode: placementCode[2],
- auctionId: '7aefb970-2045',
- bidId: '2a0cf6n',
- bidder: 'adform',
- bidderRequestId: '1ab8d9',
- params: params[2],
- placementCode: placementCode[2],
- sizes: [[300, 250], [250, 300], [300, 600], [600, 300]],
- transactionId: '5f33781f-9552-7ev3'
- },
- {
- adUnitCode: placementCode[3],
- auctionId: '7aefb970-2045',
- bidId: '2a0cf6n',
- bidder: 'adform',
- bidderRequestId: '1ab8d9',
- params: params[2],
- placementCode: placementCode[2],
- sizes: [],
- transactionId: '5f33781f-9552-7ev3'
- },
- {
- adUnitCode: placementCode[4],
- auctionId: '7aefb970-2045',
- bidId: '2a0cf6n',
- bidder: 'adform',
- bidderRequestId: '1ab8d9',
- params: params[2],
- placementCode: placementCode[2],
- sizes: [],
- transactionId: '5f33781f-9552-7ev3'
- },
- {
- adUnitCode: placementCode[4],
- auctionId: '7aefb970-2045',
- bidId: '2a0cf6n',
- bidder: 'adform',
- bidderRequestId: '1ab8d9',
- params: params[3],
- placementCode: placementCode[2],
- sizes: [],
- transactionId: '5f33781f-9552-7ev3'
- },
- {
- adUnitCode: placementCode[4],
- auctionId: '7aefb970-2045',
- bidId: '2a0cf6n',
- bidder: 'adform',
- bidderRequestId: '1ab8d9',
- params: params[4],
- placementCode: placementCode[2],
- sizes: [],
- mediaTypes: mediaTypes[0],
- transactionId: '5f33781f-9552-7ev3'
- }
- ];
- serverResponse = {
- body: [
- {
- banner: '',
- deal_id: '123abc',
- height: 250,
- response: 'banner',
- width: 300,
- win_bid: 13.9,
- win_cur: 'EUR'
- },
- {
- banner: '',
- deal_id: '123abc',
- height: 300,
- response: 'banner',
- width: 250,
- win_bid: 13.9,
- win_cur: 'EUR'
- },
- {
- banner: '',
- deal_id: '123abc',
- height: 300,
- response: 'banner',
- width: 600,
- win_bid: 10,
- win_cur: 'EUR'
- },
- {
- deal_id: '123abc',
- height: 300,
- response: 'vast_content',
- width: 600,
- win_bid: 10,
- win_cur: 'EUR',
- vast_content: ''
- },
- {
- deal_id: '123abc',
- height: 300,
- response: 'vast_url',
- width: 600,
- win_bid: 10,
- win_cur: 'EUR',
- vast_url: 'vast://url'
- }
- ],
- headers: {}
- };
- bidRequest = {
- bidder: 'adform',
- bids: bids,
- method: 'GET',
- url: 'url',
- netRevenue: 'net'
- };
- });
-});
-
-function parseUrl(url) {
- const parts = url.split('/');
- const query = parts.pop().split('&');
- return {
- path: parts.join('/'),
- items: query
- .filter((i) => !~i.indexOf('='))
- .map((i) => atob(decodeURIComponent(i))
- .split('&')
- .reduce(toObject, {})),
- query: query
- .filter((i) => ~i.indexOf('='))
- .map((i) => i.replace('?', ''))
- .reduce(toObject, {})
- };
-}
-
-function toObject(cache, string) {
- const keyValue = string.split('=');
- cache[keyValue[0]] = keyValue[1];
- return cache;
-}
diff --git a/test/spec/modules/adgenerationBidAdapter_spec.js b/test/spec/modules/adgenerationBidAdapter_spec.js
index 927e7910723..7eacba2f7d4 100644
--- a/test/spec/modules/adgenerationBidAdapter_spec.js
+++ b/test/spec/modules/adgenerationBidAdapter_spec.js
@@ -92,9 +92,9 @@ describe('AdgenerationAdapter', function () {
}
};
const data = {
- banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.0.1&imark=1&tp=https%3A%2F%2Fexample.com`,
- bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.0.1&imark=1&tp=https%3A%2F%2Fexample.com`,
- native: 'posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1¤cy=JPY&pbver=' + prebid.version + '&sdkname=prebidjs&adapterver=1.0.1&tp=https%3A%2F%2Fexample.com'
+ banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.1.0&imark=1&tp=https%3A%2F%2Fexample.com`,
+ bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.1.0&imark=1&tp=https%3A%2F%2Fexample.com`,
+ native: 'posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1¤cy=JPY&pbver=' + prebid.version + '&sdkname=prebidjs&adapterver=1.1.0&tp=https%3A%2F%2Fexample.com'
};
it('sends bid request to ENDPOINT via GET', function () {
const request = spec.buildRequests(bidRequests, bidderRequest)[0];
@@ -198,165 +198,497 @@ describe('AdgenerationAdapter', function () {
noAd: {
results: [],
},
- banner: {
- ad: '↵ ↵
',
- beacon: ' ',
- cpm: 36.0008,
- displaytype: '1',
- ids: {},
- w: 320,
- h: 100,
- location_params: null,
- locationid: '58279',
- rotation: '0',
- scheduleid: '512603',
- sdktype: '0',
- creativeid: '1k2kv35vsa5r',
- dealid: 'fd5sa5fa7f',
- ttl: 1000,
- results: [
- {ad: '
'},
- ]
- },
- native: {
- ad: '↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵
↵ ',
- beacon: ' ',
- cpm: 36.0008,
- displaytype: '1',
- ids: {},
- location_params: null,
- locationid: '58279',
- native_ad: {
- assets: [
- {
- data: {
- label: 'accompanying_text',
- value: 'AD'
+ normal: {
+ banner: {
+ ad: '↵ ↵
',
+ beacon: ' ',
+ cpm: 36.0008,
+ displaytype: '1',
+ ids: {},
+ w: 320,
+ h: 100,
+ location_params: null,
+ locationid: '58279',
+ rotation: '0',
+ scheduleid: '512603',
+ sdktype: '0',
+ creativeid: '1k2kv35vsa5r',
+ dealid: 'fd5sa5fa7f',
+ ttl: 1000,
+ results: [
+ {ad: '
'},
+ ],
+ adomain: ['advertiserdomain.com']
+ },
+ native: {
+ ad: '↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵
↵ ',
+ beacon: ' ',
+ cpm: 36.0008,
+ displaytype: '1',
+ ids: {},
+ location_params: null,
+ locationid: '58279',
+ adomain: ['advertiserdomain.com'],
+ native_ad: {
+ assets: [
+ {
+ data: {
+ label: 'accompanying_text',
+ value: 'AD'
+ },
+ id: 501
},
- id: 501
- },
- {
- data: {
- label: 'optout_url',
- value: 'https://supership.jp/optout/#'
+ {
+ data: {
+ label: 'optout_url',
+ value: 'https://supership.jp/optout/#'
+ },
+ id: 502
},
- id: 502
- },
- {
- data: {
- ext: {
- black_back: 'https://i.socdm.com/sdk/img/icon_adg_optout_26x26_white.png',
+ {
+ data: {
+ ext: {
+ black_back: 'https://i.socdm.com/sdk/img/icon_adg_optout_26x26_white.png',
+ },
+ label: 'information_icon_url',
+ value: 'https://i.socdm.com/sdk/img/icon_adg_optout_26x26_gray.png',
+ id: 503
+ }
+ },
+ {
+ id: 1,
+ required: 1,
+ title: {text: 'Title'}
+ },
+ {
+ id: 2,
+ img: {
+ h: 250,
+ url: 'https://sdk-temp.s3-ap-northeast-1.amazonaws.com/adg-sample-ad/img/300x250.png',
+ w: 300
+ },
+ required: 1
+ },
+ {
+ id: 3,
+ img: {
+ h: 300,
+ url: 'https://placehold.jp/300x300.png',
+ w: 300
},
- label: 'information_icon_url',
- value: 'https://i.socdm.com/sdk/img/icon_adg_optout_26x26_gray.png',
- id: 503
+ required: 1
+ },
+ {
+ data: {value: 'Description'},
+ id: 5,
+ required: 0
+ },
+ {
+ data: {value: 'CTA'},
+ id: 6,
+ required: 0
+ },
+ {
+ data: {value: 'Sponsored'},
+ id: 4,
+ required: 0
}
+ ],
+ imptrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1.gif'],
+ link: {
+ clicktrackers: [
+ 'https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1_clicktracker_access.gif'
+ ],
+ url: 'https://supership.jp'
},
- {
- id: 1,
- required: 1,
- title: {text: 'Title'}
- },
- {
- id: 2,
- img: {
- h: 250,
- url: 'https://sdk-temp.s3-ap-northeast-1.amazonaws.com/adg-sample-ad/img/300x250.png',
- w: 300
+ },
+ results: [
+ {ad: 'Creative<\/body>'}
+ ],
+ rotation: '0',
+ scheduleid: '512603',
+ sdktype: '0',
+ creativeid: '1k2kv35vsa5r',
+ dealid: 'fd5sa5fa7f',
+ ttl: 1000
+ }
+ },
+ emptyAdomain: {
+ banner: {
+ ad: '↵ ↵
',
+ beacon: ' ',
+ cpm: 36.0008,
+ displaytype: '1',
+ ids: {},
+ w: 320,
+ h: 100,
+ location_params: null,
+ locationid: '58279',
+ rotation: '0',
+ scheduleid: '512603',
+ sdktype: '0',
+ creativeid: '1k2kv35vsa5r',
+ dealid: 'fd5sa5fa7f',
+ ttl: 1000,
+ results: [
+ {ad: '
'},
+ ],
+ adomain: []
+ },
+ native: {
+ ad: '↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵
↵ ',
+ beacon: ' ',
+ cpm: 36.0008,
+ displaytype: '1',
+ ids: {},
+ location_params: null,
+ locationid: '58279',
+ adomain: [],
+ native_ad: {
+ assets: [
+ {
+ data: {
+ label: 'accompanying_text',
+ value: 'AD'
+ },
+ id: 501
},
- required: 1
- },
- {
- id: 3,
- img: {
- h: 300,
- url: 'https://placehold.jp/300x300.png',
- w: 300
+ {
+ data: {
+ label: 'optout_url',
+ value: 'https://supership.jp/optout/#'
+ },
+ id: 502
},
- required: 1
- },
- {
- data: {value: 'Description'},
- id: 5,
- required: 0
- },
- {
- data: {value: 'CTA'},
- id: 6,
- required: 0
+ {
+ data: {
+ ext: {
+ black_back: 'https://i.socdm.com/sdk/img/icon_adg_optout_26x26_white.png',
+ },
+ label: 'information_icon_url',
+ value: 'https://i.socdm.com/sdk/img/icon_adg_optout_26x26_gray.png',
+ id: 503
+ }
+ },
+ {
+ id: 1,
+ required: 1,
+ title: {text: 'Title'}
+ },
+ {
+ id: 2,
+ img: {
+ h: 250,
+ url: 'https://sdk-temp.s3-ap-northeast-1.amazonaws.com/adg-sample-ad/img/300x250.png',
+ w: 300
+ },
+ required: 1
+ },
+ {
+ id: 3,
+ img: {
+ h: 300,
+ url: 'https://placehold.jp/300x300.png',
+ w: 300
+ },
+ required: 1
+ },
+ {
+ data: {value: 'Description'},
+ id: 5,
+ required: 0
+ },
+ {
+ data: {value: 'CTA'},
+ id: 6,
+ required: 0
+ },
+ {
+ data: {value: 'Sponsored'},
+ id: 4,
+ required: 0
+ }
+ ],
+ imptrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1.gif'],
+ link: {
+ clicktrackers: [
+ 'https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1_clicktracker_access.gif'
+ ],
+ url: 'https://supership.jp'
},
- {
- data: {value: 'Sponsored'},
- id: 4,
- required: 0
- }
+ },
+ results: [
+ {ad: 'Creative<\/body>'}
+ ],
+ rotation: '0',
+ scheduleid: '512603',
+ sdktype: '0',
+ creativeid: '1k2kv35vsa5r',
+ dealid: 'fd5sa5fa7f',
+ ttl: 1000
+ }
+ },
+ noAdomain: {
+ banner: {
+ ad: '↵ ↵
',
+ beacon: ' ',
+ cpm: 36.0008,
+ displaytype: '1',
+ ids: {},
+ w: 320,
+ h: 100,
+ location_params: null,
+ locationid: '58279',
+ rotation: '0',
+ scheduleid: '512603',
+ sdktype: '0',
+ creativeid: '1k2kv35vsa5r',
+ dealid: 'fd5sa5fa7f',
+ ttl: 1000,
+ results: [
+ {ad: '
'},
],
- imptrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1.gif'],
- link: {
- clicktrackers: [
- 'https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1_clicktracker_access.gif'
+ },
+ native: {
+ ad: '↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵ ↵
↵ ',
+ beacon: ' ',
+ cpm: 36.0008,
+ displaytype: '1',
+ ids: {},
+ location_params: null,
+ locationid: '58279',
+ native_ad: {
+ assets: [
+ {
+ data: {
+ label: 'accompanying_text',
+ value: 'AD'
+ },
+ id: 501
+ },
+ {
+ data: {
+ label: 'optout_url',
+ value: 'https://supership.jp/optout/#'
+ },
+ id: 502
+ },
+ {
+ data: {
+ ext: {
+ black_back: 'https://i.socdm.com/sdk/img/icon_adg_optout_26x26_white.png',
+ },
+ label: 'information_icon_url',
+ value: 'https://i.socdm.com/sdk/img/icon_adg_optout_26x26_gray.png',
+ id: 503
+ }
+ },
+ {
+ id: 1,
+ required: 1,
+ title: {text: 'Title'}
+ },
+ {
+ id: 2,
+ img: {
+ h: 250,
+ url: 'https://sdk-temp.s3-ap-northeast-1.amazonaws.com/adg-sample-ad/img/300x250.png',
+ w: 300
+ },
+ required: 1
+ },
+ {
+ id: 3,
+ img: {
+ h: 300,
+ url: 'https://placehold.jp/300x300.png',
+ w: 300
+ },
+ required: 1
+ },
+ {
+ data: {value: 'Description'},
+ id: 5,
+ required: 0
+ },
+ {
+ data: {value: 'CTA'},
+ id: 6,
+ required: 0
+ },
+ {
+ data: {value: 'Sponsored'},
+ id: 4,
+ required: 0
+ }
],
- url: 'https://supership.jp'
+ imptrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1.gif'],
+ link: {
+ clicktrackers: [
+ 'https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1_clicktracker_access.gif'
+ ],
+ url: 'https://supership.jp'
+ },
},
- },
- results: [
- {ad: 'Creative<\/body>'}
- ],
- rotation: '0',
- scheduleid: '512603',
- sdktype: '0',
- creativeid: '1k2kv35vsa5r',
- dealid: 'fd5sa5fa7f',
- ttl: 1000
+ results: [
+ {ad: 'Creative<\/body>'}
+ ],
+ rotation: '0',
+ scheduleid: '512603',
+ sdktype: '0',
+ creativeid: '1k2kv35vsa5r',
+ dealid: 'fd5sa5fa7f',
+ ttl: 1000
+ }
}
};
const bidResponses = {
- banner: {
- requestId: '2f6ac468a9c15e',
- cpm: 36.0008,
- width: 320,
- height: 100,
- creativeId: '1k2kv35vsa5r',
- dealId: 'fd5sa5fa7f',
- currency: 'JPY',
- netRevenue: true,
- ttl: 1000,
- ad: '↵ ↵
',
- },
- native: {
- requestId: '2f6ac468a9c15e',
- cpm: 36.0008,
- width: 1,
- height: 1,
- creativeId: '1k2kv35vsa5r',
- dealId: 'fd5sa5fa7f',
- currency: 'JPY',
- netRevenue: true,
- ttl: 1000,
- ad: '↵ ↵ ↵
↵ ',
+ normal: {
+ banner: {
+ requestId: '2f6ac468a9c15e',
+ cpm: 36.0008,
+ width: 320,
+ height: 100,
+ creativeId: '1k2kv35vsa5r',
+ dealId: 'fd5sa5fa7f',
+ currency: 'JPY',
+ netRevenue: true,
+ ttl: 1000,
+ ad: '↵ ↵
',
+ adomain: ['advertiserdomain.com']
+ },
native: {
- title: 'Title',
- image: {
- url: 'https://sdk-temp.s3-ap-northeast-1.amazonaws.com/adg-sample-ad/img/300x250.png',
- height: 250,
- width: 300
+ requestId: '2f6ac468a9c15e',
+ cpm: 36.0008,
+ width: 1,
+ height: 1,
+ creativeId: '1k2kv35vsa5r',
+ dealId: 'fd5sa5fa7f',
+ currency: 'JPY',
+ netRevenue: true,
+ ttl: 1000,
+ adomain: ['advertiserdomain.com'],
+ ad: '↵ ↵ ↵
↵ ',
+ native: {
+ title: 'Title',
+ image: {
+ url: 'https://sdk-temp.s3-ap-northeast-1.amazonaws.com/adg-sample-ad/img/300x250.png',
+ height: 250,
+ width: 300
+ },
+ icon: {
+ url: 'https://placehold.jp/300x300.png',
+ height: 300,
+ width: 300
+ },
+ sponsoredBy: 'Sponsored',
+ body: 'Description',
+ cta: 'CTA',
+ privacyLink: 'https://supership.jp/optout/#',
+ clickUrl: 'https://supership.jp',
+ clickTrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1_clicktracker_access.gif'],
+ impressionTrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1.gif']
},
- icon: {
- url: 'https://placehold.jp/300x300.png',
- height: 300,
- width: 300
+ mediaType: NATIVE
+ }
+ },
+ emptyAdomain: {
+ banner: {
+ requestId: '2f6ac468a9c15e',
+ cpm: 36.0008,
+ width: 320,
+ height: 100,
+ creativeId: '1k2kv35vsa5r',
+ dealId: 'fd5sa5fa7f',
+ currency: 'JPY',
+ netRevenue: true,
+ ttl: 1000,
+ ad: '↵ ↵
',
+ adomain: []
+ },
+ native: {
+ requestId: '2f6ac468a9c15e',
+ cpm: 36.0008,
+ width: 1,
+ height: 1,
+ creativeId: '1k2kv35vsa5r',
+ dealId: 'fd5sa5fa7f',
+ currency: 'JPY',
+ netRevenue: true,
+ ttl: 1000,
+ adomain: [],
+ ad: '↵ ↵ ↵
↵ ',
+ native: {
+ title: 'Title',
+ image: {
+ url: 'https://sdk-temp.s3-ap-northeast-1.amazonaws.com/adg-sample-ad/img/300x250.png',
+ height: 250,
+ width: 300
+ },
+ icon: {
+ url: 'https://placehold.jp/300x300.png',
+ height: 300,
+ width: 300
+ },
+ sponsoredBy: 'Sponsored',
+ body: 'Description',
+ cta: 'CTA',
+ privacyLink: 'https://supership.jp/optout/#',
+ clickUrl: 'https://supership.jp',
+ clickTrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1_clicktracker_access.gif'],
+ impressionTrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1.gif']
},
- sponsoredBy: 'Sponsored',
- body: 'Description',
- cta: 'CTA',
- privacyLink: 'https://supership.jp/optout/#',
- clickUrl: 'https://supership.jp',
- clickTrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1_clicktracker_access.gif'],
- impressionTrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1.gif']
+ mediaType: NATIVE
},
- mediaType: NATIVE
- }
+ },
+ noAdomain: {
+ banner: {
+ requestId: '2f6ac468a9c15e',
+ cpm: 36.0008,
+ width: 320,
+ height: 100,
+ creativeId: '1k2kv35vsa5r',
+ dealId: 'fd5sa5fa7f',
+ currency: 'JPY',
+ netRevenue: true,
+ ttl: 1000,
+ ad: '↵ ↵
',
+ },
+ native: {
+ requestId: '2f6ac468a9c15e',
+ cpm: 36.0008,
+ width: 1,
+ height: 1,
+ creativeId: '1k2kv35vsa5r',
+ dealId: 'fd5sa5fa7f',
+ currency: 'JPY',
+ netRevenue: true,
+ ttl: 1000,
+ ad: '↵ ↵ ↵
↵ ',
+ native: {
+ title: 'Title',
+ image: {
+ url: 'https://sdk-temp.s3-ap-northeast-1.amazonaws.com/adg-sample-ad/img/300x250.png',
+ height: 250,
+ width: 300
+ },
+ icon: {
+ url: 'https://placehold.jp/300x300.png',
+ height: 300,
+ width: 300
+ },
+ sponsoredBy: 'Sponsored',
+ body: 'Description',
+ cta: 'CTA',
+ privacyLink: 'https://supership.jp/optout/#',
+ clickUrl: 'https://supership.jp',
+ clickTrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1_clicktracker_access.gif'],
+ impressionTrackers: ['https://adg-dummy-dsp.s3-ap-northeast-1.amazonaws.com/1x1.gif']
+ },
+ mediaType: NATIVE
+ }
+ },
};
it('no bid responses', function () {
@@ -365,43 +697,133 @@ describe('AdgenerationAdapter', function () {
});
it('handles banner responses', function () {
- const result = spec.interpretResponse({body: serverResponse.banner}, bidRequests.banner)[0];
- expect(result.requestId).to.equal(bidResponses.banner.requestId);
- expect(result.width).to.equal(bidResponses.banner.width);
- expect(result.height).to.equal(bidResponses.banner.height);
- expect(result.creativeId).to.equal(bidResponses.banner.creativeId);
- expect(result.dealId).to.equal(bidResponses.banner.dealId);
- expect(result.currency).to.equal(bidResponses.banner.currency);
- expect(result.netRevenue).to.equal(bidResponses.banner.netRevenue);
- expect(result.ttl).to.equal(bidResponses.banner.ttl);
- expect(result.ad).to.equal(bidResponses.banner.ad);
+ const result = spec.interpretResponse({body: serverResponse.normal.banner}, bidRequests.banner)[0];
+ expect(result.requestId).to.equal(bidResponses.normal.banner.requestId);
+ expect(result.width).to.equal(bidResponses.normal.banner.width);
+ expect(result.height).to.equal(bidResponses.normal.banner.height);
+ expect(result.creativeId).to.equal(bidResponses.normal.banner.creativeId);
+ expect(result.dealId).to.equal(bidResponses.normal.banner.dealId);
+ expect(result.currency).to.equal(bidResponses.normal.banner.currency);
+ expect(result.netRevenue).to.equal(bidResponses.normal.banner.netRevenue);
+ expect(result.ttl).to.equal(bidResponses.normal.banner.ttl);
+ expect(result.ad).to.equal(bidResponses.normal.banner.ad);
+ expect(result.meta.advertiserDomains).deep.equal(bidResponses.normal.banner.adomain);
});
it('handles native responses', function () {
- const result = spec.interpretResponse({body: serverResponse.native}, bidRequests.native)[0];
- expect(result.requestId).to.equal(bidResponses.native.requestId);
- expect(result.width).to.equal(bidResponses.native.width);
- expect(result.height).to.equal(bidResponses.native.height);
- expect(result.creativeId).to.equal(bidResponses.native.creativeId);
- expect(result.dealId).to.equal(bidResponses.native.dealId);
- expect(result.currency).to.equal(bidResponses.native.currency);
- expect(result.netRevenue).to.equal(bidResponses.native.netRevenue);
- expect(result.ttl).to.equal(bidResponses.native.ttl);
- expect(result.native.title).to.equal(bidResponses.native.native.title);
- expect(result.native.image.url).to.equal(bidResponses.native.native.image.url);
- expect(result.native.image.height).to.equal(bidResponses.native.native.image.height);
- expect(result.native.image.width).to.equal(bidResponses.native.native.image.width);
- expect(result.native.icon.url).to.equal(bidResponses.native.native.icon.url);
- expect(result.native.icon.width).to.equal(bidResponses.native.native.icon.width);
- expect(result.native.icon.height).to.equal(bidResponses.native.native.icon.height);
- expect(result.native.sponsoredBy).to.equal(bidResponses.native.native.sponsoredBy);
- expect(result.native.body).to.equal(bidResponses.native.native.body);
- expect(result.native.cta).to.equal(bidResponses.native.native.cta);
- expect(decodeURIComponent(result.native.privacyLink)).to.equal(bidResponses.native.native.privacyLink);
- expect(result.native.clickUrl).to.equal(bidResponses.native.native.clickUrl);
- expect(result.native.impressionTrackers[0]).to.equal(bidResponses.native.native.impressionTrackers[0]);
- expect(result.native.clickTrackers[0]).to.equal(bidResponses.native.native.clickTrackers[0]);
- expect(result.mediaType).to.equal(bidResponses.native.mediaType);
+ const result = spec.interpretResponse({body: serverResponse.normal.native}, bidRequests.native)[0];
+ expect(result.requestId).to.equal(bidResponses.normal.native.requestId);
+ expect(result.width).to.equal(bidResponses.normal.native.width);
+ expect(result.height).to.equal(bidResponses.normal.native.height);
+ expect(result.creativeId).to.equal(bidResponses.normal.native.creativeId);
+ expect(result.dealId).to.equal(bidResponses.normal.native.dealId);
+ expect(result.currency).to.equal(bidResponses.normal.native.currency);
+ expect(result.netRevenue).to.equal(bidResponses.normal.native.netRevenue);
+ expect(result.ttl).to.equal(bidResponses.normal.native.ttl);
+ expect(result.native.title).to.equal(bidResponses.normal.native.native.title);
+ expect(result.native.image.url).to.equal(bidResponses.normal.native.native.image.url);
+ expect(result.native.image.height).to.equal(bidResponses.normal.native.native.image.height);
+ expect(result.native.image.width).to.equal(bidResponses.normal.native.native.image.width);
+ expect(result.native.icon.url).to.equal(bidResponses.normal.native.native.icon.url);
+ expect(result.native.icon.width).to.equal(bidResponses.normal.native.native.icon.width);
+ expect(result.native.icon.height).to.equal(bidResponses.normal.native.native.icon.height);
+ expect(result.native.sponsoredBy).to.equal(bidResponses.normal.native.native.sponsoredBy);
+ expect(result.native.body).to.equal(bidResponses.normal.native.native.body);
+ expect(result.native.cta).to.equal(bidResponses.normal.native.native.cta);
+ expect(decodeURIComponent(result.native.privacyLink)).to.equal(bidResponses.normal.native.native.privacyLink);
+ expect(result.native.clickUrl).to.equal(bidResponses.normal.native.native.clickUrl);
+ expect(result.native.impressionTrackers[0]).to.equal(bidResponses.normal.native.native.impressionTrackers[0]);
+ expect(result.native.clickTrackers[0]).to.equal(bidResponses.normal.native.native.clickTrackers[0]);
+ expect(result.mediaType).to.equal(bidResponses.normal.native.mediaType);
+ expect(result.meta.advertiserDomains).deep.equal(bidResponses.normal.native.adomain);
+ });
+
+ it('handles banner responses for empty adomain', function () {
+ const result = spec.interpretResponse({body: serverResponse.emptyAdomain.banner}, bidRequests.banner)[0];
+ expect(result.requestId).to.equal(bidResponses.emptyAdomain.banner.requestId);
+ expect(result.width).to.equal(bidResponses.emptyAdomain.banner.width);
+ expect(result.height).to.equal(bidResponses.emptyAdomain.banner.height);
+ expect(result.creativeId).to.equal(bidResponses.emptyAdomain.banner.creativeId);
+ expect(result.dealId).to.equal(bidResponses.emptyAdomain.banner.dealId);
+ expect(result.currency).to.equal(bidResponses.emptyAdomain.banner.currency);
+ expect(result.netRevenue).to.equal(bidResponses.emptyAdomain.banner.netRevenue);
+ expect(result.ttl).to.equal(bidResponses.emptyAdomain.banner.ttl);
+ expect(result.ad).to.equal(bidResponses.emptyAdomain.banner.ad);
+ expect(result).to.not.have.any.keys('meta');
+ expect(result).to.not.have.any.keys('advertiserDomains');
+ });
+
+ it('handles native responses for empty adomain', function () {
+ const result = spec.interpretResponse({body: serverResponse.emptyAdomain.native}, bidRequests.native)[0];
+ expect(result.requestId).to.equal(bidResponses.emptyAdomain.native.requestId);
+ expect(result.width).to.equal(bidResponses.emptyAdomain.native.width);
+ expect(result.height).to.equal(bidResponses.emptyAdomain.native.height);
+ expect(result.creativeId).to.equal(bidResponses.emptyAdomain.native.creativeId);
+ expect(result.dealId).to.equal(bidResponses.emptyAdomain.native.dealId);
+ expect(result.currency).to.equal(bidResponses.emptyAdomain.native.currency);
+ expect(result.netRevenue).to.equal(bidResponses.emptyAdomain.native.netRevenue);
+ expect(result.ttl).to.equal(bidResponses.emptyAdomain.native.ttl);
+ expect(result.native.title).to.equal(bidResponses.emptyAdomain.native.native.title);
+ expect(result.native.image.url).to.equal(bidResponses.emptyAdomain.native.native.image.url);
+ expect(result.native.image.height).to.equal(bidResponses.emptyAdomain.native.native.image.height);
+ expect(result.native.image.width).to.equal(bidResponses.emptyAdomain.native.native.image.width);
+ expect(result.native.icon.url).to.equal(bidResponses.emptyAdomain.native.native.icon.url);
+ expect(result.native.icon.width).to.equal(bidResponses.emptyAdomain.native.native.icon.width);
+ expect(result.native.icon.height).to.equal(bidResponses.emptyAdomain.native.native.icon.height);
+ expect(result.native.sponsoredBy).to.equal(bidResponses.emptyAdomain.native.native.sponsoredBy);
+ expect(result.native.body).to.equal(bidResponses.emptyAdomain.native.native.body);
+ expect(result.native.cta).to.equal(bidResponses.emptyAdomain.native.native.cta);
+ expect(decodeURIComponent(result.native.privacyLink)).to.equal(bidResponses.emptyAdomain.native.native.privacyLink);
+ expect(result.native.clickUrl).to.equal(bidResponses.emptyAdomain.native.native.clickUrl);
+ expect(result.native.impressionTrackers[0]).to.equal(bidResponses.emptyAdomain.native.native.impressionTrackers[0]);
+ expect(result.native.clickTrackers[0]).to.equal(bidResponses.emptyAdomain.native.native.clickTrackers[0]);
+ expect(result.mediaType).to.equal(bidResponses.emptyAdomain.native.mediaType);
+ expect(result).to.not.have.any.keys('meta');
+ expect(result).to.not.have.any.keys('advertiserDomains');
+ });
+
+ it('handles banner responses for no adomain', function () {
+ const result = spec.interpretResponse({body: serverResponse.noAdomain.banner}, bidRequests.banner)[0];
+ expect(result.requestId).to.equal(bidResponses.noAdomain.banner.requestId);
+ expect(result.width).to.equal(bidResponses.noAdomain.banner.width);
+ expect(result.height).to.equal(bidResponses.noAdomain.banner.height);
+ expect(result.creativeId).to.equal(bidResponses.noAdomain.banner.creativeId);
+ expect(result.dealId).to.equal(bidResponses.noAdomain.banner.dealId);
+ expect(result.currency).to.equal(bidResponses.noAdomain.banner.currency);
+ expect(result.netRevenue).to.equal(bidResponses.noAdomain.banner.netRevenue);
+ expect(result.ttl).to.equal(bidResponses.noAdomain.banner.ttl);
+ expect(result.ad).to.equal(bidResponses.noAdomain.banner.ad);
+ expect(result).to.not.have.any.keys('meta');
+ expect(result).to.not.have.any.keys('advertiserDomains');
+ });
+
+ it('handles native responses for no adomain', function () {
+ const result = spec.interpretResponse({body: serverResponse.noAdomain.native}, bidRequests.native)[0];
+ expect(result.requestId).to.equal(bidResponses.noAdomain.native.requestId);
+ expect(result.width).to.equal(bidResponses.noAdomain.native.width);
+ expect(result.height).to.equal(bidResponses.noAdomain.native.height);
+ expect(result.creativeId).to.equal(bidResponses.noAdomain.native.creativeId);
+ expect(result.dealId).to.equal(bidResponses.noAdomain.native.dealId);
+ expect(result.currency).to.equal(bidResponses.noAdomain.native.currency);
+ expect(result.netRevenue).to.equal(bidResponses.noAdomain.native.netRevenue);
+ expect(result.ttl).to.equal(bidResponses.noAdomain.native.ttl);
+ expect(result.native.title).to.equal(bidResponses.noAdomain.native.native.title);
+ expect(result.native.image.url).to.equal(bidResponses.noAdomain.native.native.image.url);
+ expect(result.native.image.height).to.equal(bidResponses.noAdomain.native.native.image.height);
+ expect(result.native.image.width).to.equal(bidResponses.noAdomain.native.native.image.width);
+ expect(result.native.icon.url).to.equal(bidResponses.noAdomain.native.native.icon.url);
+ expect(result.native.icon.width).to.equal(bidResponses.noAdomain.native.native.icon.width);
+ expect(result.native.icon.height).to.equal(bidResponses.noAdomain.native.native.icon.height);
+ expect(result.native.sponsoredBy).to.equal(bidResponses.noAdomain.native.native.sponsoredBy);
+ expect(result.native.body).to.equal(bidResponses.noAdomain.native.native.body);
+ expect(result.native.cta).to.equal(bidResponses.noAdomain.native.native.cta);
+ expect(decodeURIComponent(result.native.privacyLink)).to.equal(bidResponses.noAdomain.native.native.privacyLink);
+ expect(result.native.clickUrl).to.equal(bidResponses.noAdomain.native.native.clickUrl);
+ expect(result.native.impressionTrackers[0]).to.equal(bidResponses.noAdomain.native.native.impressionTrackers[0]);
+ expect(result.native.clickTrackers[0]).to.equal(bidResponses.noAdomain.native.native.clickTrackers[0]);
+ expect(result.mediaType).to.equal(bidResponses.noAdomain.native.mediaType);
+ expect(result).to.not.have.any.keys('meta');
+ expect(result).to.not.have.any.keys('advertiserDomains');
});
});
});
diff --git a/test/spec/modules/adglareBidAdapter_spec.js b/test/spec/modules/adglareBidAdapter_spec.js
deleted file mode 100644
index d0dbe891f9d..00000000000
--- a/test/spec/modules/adglareBidAdapter_spec.js
+++ /dev/null
@@ -1,138 +0,0 @@
-import {expect} from 'chai';
-import {spec} from 'modules/adglareBidAdapter.js';
-
-describe('AdGlare Adapter Tests', function () {
- let bidRequests;
-
- beforeEach(function () {
- bidRequests = [
- {
- bidder: 'adglare',
- params: {
- domain: 'try.engine.adglare.net',
- zID: '475579334',
- type: 'banner'
- },
- mediaTypes: {
- banner: {
- sizes: [[300, 250], [300, 600]],
- },
- },
- bidId: '23acc48ad47af5',
- auctionId: '0fb4905b-9456-4152-86be-c6f6d259ba99',
- bidderRequestId: '1c56ad30b9b8ca8',
- transactionId: '92489f71-1bf2-49a0-adf9-000cea934729'
- }
- ];
- });
-
- describe('implementation', function () {
- describe('for requests', function () {
- it('should accept valid bid', function () {
- let validBid = {
- bidder: 'adglare',
- params: {
- domain: 'try.engine.adglare.net',
- zID: '475579334',
- type: 'banner'
- }
- },
- isValid = spec.isBidRequestValid(validBid);
-
- expect(isValid).to.equal(true);
- });
-
- it('should reject invalid bid', function () {
- let invalidBid = {
- bidder: 'adglare',
- params: {
- domain: 'somedomain.com',
- zID: 'not an integer',
- type: 'unsupported'
- }
- },
- isValid = spec.isBidRequestValid(invalidBid);
-
- expect(isValid).to.equal(false);
- });
-
- it('should build a valid endpoint URL', function () {
- let bidRequests = [
- {
- bidder: 'adglare',
- params: {
- domain: 'try.engine.adglare.net',
- zID: '475579334',
- type: 'banner'
- },
- mediaTypes: {
- banner: {
- sizes: [[300, 250], [300, 600]],
- },
- },
- bidId: '23acc48ad47af5',
- auctionId: '0fb4905b-9456-4152-86be-c6f6d259ba99',
- bidderRequestId: '1c56ad30b9b8ca8',
- transactionId: '92489f71-1bf2-49a0-adf9-000cea934729'
- }
- ],
- bidderRequest = {
- bidderCode: 'adglare',
- auctionID: '0fb4905b-9456-4152-86be-c6f6d259ba99',
- bidderRequestId: '1c56ad30b9b8ca8',
- auctionStart: 1581497568252,
- timeout: 5000,
- refererInfo: {
- referer: 'https://www.somedomain.com',
- reachedTop: true,
- numFrames: 0
- },
- start: 1581497568254
- },
- requests = spec.buildRequests(bidRequests, bidderRequest),
- requestURL = requests[0].url;
-
- expect(requestURL).to.have.string('https://try.engine.adglare.net/?475579334');
- });
- });
-
- describe('bid responses', function () {
- it('should return complete bid response', function () {
- let serverResponse = {
- body: {
- status: 'OK',
- zID: 475579334,
- cID: 501658124,
- crID: 442123173,
- cpm: 1.5,
- ttl: 3600,
- currency: 'USD',
- width: 300,
- height: 250,
- adhtml: 'I am an ad.'
- }
- },
- bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
-
- expect(bids).to.be.lengthOf(1);
- expect(bids[0].bidderCode).to.equal('adglare');
- expect(bids[0].cpm).to.equal(1.5);
- expect(bids[0].width).to.equal(300);
- expect(bids[0].height).to.equal(250);
- expect(bids[0].currency).to.equal('USD');
- expect(bids[0].netRevenue).to.equal(true);
- });
-
- it('should return empty bid response', function () {
- let serverResponse = {
- body: {
- status: 'NOADS'
- }
- },
- bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
-
- expect(bids).to.be.lengthOf(0);
- });
- });
- });
-});
diff --git a/test/spec/modules/adhashBidAdapter_spec.js b/test/spec/modules/adhashBidAdapter_spec.js
deleted file mode 100644
index ab4df84c093..00000000000
--- a/test/spec/modules/adhashBidAdapter_spec.js
+++ /dev/null
@@ -1,155 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/adhashBidAdapter.js';
-
-describe('adhashBidAdapter', function () {
- describe('isBidRequestValid', function () {
- const validBid = {
- bidder: 'adhash',
- params: {
- publisherId: '0xc3b09b27e9c6ef73957901aa729b9e69e5bbfbfb',
- platformURL: 'https://adhash.org/p/struma/'
- },
- mediaTypes: {
- banner: {
- sizes: [[300, 250]]
- }
- },
- adUnitCode: 'adunit-code',
- sizes: [[300, 250]],
- bidId: '12345678901234',
- bidderRequestId: '98765432109876',
- auctionId: '01234567891234',
- };
-
- it('should return true when all mandatory parameters are there', function () {
- expect(spec.isBidRequestValid(validBid)).to.equal(true);
- });
-
- it('should return false when there are no params', function () {
- const bid = { ...validBid };
- delete bid.params;
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
-
- it('should return false when unsupported media type is requested', function () {
- const bid = { ...validBid };
- bid.mediaTypes = { native: { sizes: [[300, 250]] } };
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
-
- it('should return false when publisherId is not a string', function () {
- const bid = { ...validBid };
- bid.params.publisherId = 123;
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
-
- it('should return false when publisherId is not valid', function () {
- const bid = { ...validBid };
- bid.params.publisherId = 'short string';
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
-
- it('should return false when publisherId is not a string', function () {
- const bid = { ...validBid };
- bid.params.platformURL = 123;
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
-
- it('should return false when publisherId is not valid', function () {
- const bid = { ...validBid };
- bid.params.platformURL = 'https://';
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- const bidRequest = {
- params: {
- publisherId: '0xc3b09b27e9c6ef73957901aa729b9e69e5bbfbfb'
- },
- sizes: [[300, 250]],
- adUnitCode: 'adUnitCode'
- };
- it('should build the request correctly', function () {
- const result = spec.buildRequests(
- [ bidRequest ],
- { gdprConsent: true, refererInfo: { referer: 'http://example.com/' } }
- );
- expect(result.length).to.equal(1);
- expect(result[0].method).to.equal('POST');
- expect(result[0].url).to.equal('https://bidder.adhash.org/rtb?version=1.0&prebid=true');
- expect(result[0].bidRequest).to.equal(bidRequest);
- expect(result[0].data).to.have.property('timezone');
- expect(result[0].data).to.have.property('location');
- expect(result[0].data).to.have.property('publisherId');
- expect(result[0].data).to.have.property('size');
- expect(result[0].data).to.have.property('navigator');
- expect(result[0].data).to.have.property('creatives');
- expect(result[0].data).to.have.property('blockedCreatives');
- expect(result[0].data).to.have.property('currentTimestamp');
- expect(result[0].data).to.have.property('recentAds');
- });
- it('should build the request correctly without referer', function () {
- const result = spec.buildRequests([ bidRequest ], { gdprConsent: true });
- expect(result.length).to.equal(1);
- expect(result[0].method).to.equal('POST');
- expect(result[0].url).to.equal('https://bidder.adhash.org/rtb?version=1.0&prebid=true');
- expect(result[0].bidRequest).to.equal(bidRequest);
- expect(result[0].data).to.have.property('timezone');
- expect(result[0].data).to.have.property('location');
- expect(result[0].data).to.have.property('publisherId');
- expect(result[0].data).to.have.property('size');
- expect(result[0].data).to.have.property('navigator');
- expect(result[0].data).to.have.property('creatives');
- expect(result[0].data).to.have.property('blockedCreatives');
- expect(result[0].data).to.have.property('currentTimestamp');
- expect(result[0].data).to.have.property('recentAds');
- });
- });
-
- describe('interpretResponse', function () {
- const request = {
- data: { some: 'data' },
- bidRequest: {
- bidId: '12345678901234',
- adUnitCode: 'adunit-code',
- sizes: [[300, 250]],
- params: {
- platformURL: 'https://adhash.org/p/struma/'
- }
- }
- };
-
- it('should interpret the response correctly', function () {
- const serverResponse = {
- body: {
- creatives: [{
- costEUR: 1.234
- }]
- }
- };
- const result = spec.interpretResponse(serverResponse, request);
- expect(result.length).to.equal(1);
- expect(result[0].requestId).to.equal('12345678901234');
- expect(result[0].cpm).to.equal(1.234);
- expect(result[0].width).to.equal(300);
- expect(result[0].height).to.equal(250);
- expect(result[0].creativeId).to.equal('adunit-code');
- expect(result[0].netRevenue).to.equal(true);
- expect(result[0].currency).to.equal('EUR');
- expect(result[0].ttl).to.equal(60);
- });
-
- it('should return empty array when there are no creatives returned', function () {
- expect(spec.interpretResponse({body: {creatives: []}}, request).length).to.equal(0);
- });
-
- it('should return empty array when there is no creatives key in the response', function () {
- expect(spec.interpretResponse({body: {}}, request).length).to.equal(0);
- });
-
- it('should return empty array when something is not right', function () {
- expect(spec.interpretResponse(null, request).length).to.equal(0);
- });
- });
-});
diff --git a/test/spec/modules/adheseBidAdapter_spec.js b/test/spec/modules/adheseBidAdapter_spec.js
index 526102c51fe..78ca25d6be2 100644
--- a/test/spec/modules/adheseBidAdapter_spec.js
+++ b/test/spec/modules/adheseBidAdapter_spec.js
@@ -186,7 +186,10 @@ describe('AdheseAdapter', function () {
body: '
',
tracker: 'https://hosts-demo.adhese.com/rtb_gateway/handlers/client/track/?id=a2f39296-6dd0-4b3c-be85-7baa22e7ff4a',
impressionCounter: 'https://hosts-demo.adhese.com/rtb_gateway/handlers/client/track/?id=a2f39296-6dd0-4b3c-be85-7baa22e7ff4a',
- extension: {'prebid': {'cpm': {'amount': '1.000000', 'currency': 'USD'}}, mediaType: 'banner'}
+ extension: {'prebid': {'cpm': {'amount': '1.000000', 'currency': 'USD'}}, mediaType: 'banner'},
+ adomain: [
+ 'www.example.com'
+ ]
}
]
};
@@ -217,7 +220,12 @@ describe('AdheseAdapter', function () {
slotId: '10',
slotName: '_main_page_-leaderboard'
}
- }
+ },
+ meta: {
+ advertiserDomains: [
+ 'www.example.com'
+ ]
+ },
}];
expect(spec.interpretResponse(sspBannerResponse, bidRequest)).to.deep.equal(expectedResponse);
});
@@ -254,7 +262,10 @@ describe('AdheseAdapter', function () {
origin: 'RUBICON',
originInstance: '',
originData: {}
- }
+ },
+ meta: {
+ advertiserDomains: []
+ },
}];
expect(spec.interpretResponse(sspVideoResponse, bidRequest)).to.deep.equal(expectedResponse);
});
@@ -291,7 +302,10 @@ describe('AdheseAdapter', function () {
origin: 'RUBICON',
originInstance: '',
originData: {}
- }
+ },
+ meta: {
+ advertiserDomains: []
+ },
}];
expect(spec.interpretResponse(sspCachedVideoResponse, bidRequest)).to.deep.equal(expectedResponse);
});
@@ -369,6 +383,9 @@ describe('AdheseAdapter', function () {
mediaType: 'banner',
netRevenue: NET_REVENUE,
ttl: TTL,
+ meta: {
+ advertiserDomains: []
+ },
}];
expect(spec.interpretResponse(adheseBannerResponse, bidRequest)).to.deep.equal(expectedResponse);
});
@@ -433,6 +450,9 @@ describe('AdheseAdapter', function () {
mediaType: 'video',
netRevenue: NET_REVENUE,
ttl: TTL,
+ meta: {
+ advertiserDomains: []
+ },
}];
expect(spec.interpretResponse(adheseVideoResponse, bidRequest)).to.deep.equal(expectedResponse);
});
@@ -497,6 +517,9 @@ describe('AdheseAdapter', function () {
mediaType: 'video',
netRevenue: NET_REVENUE,
ttl: TTL,
+ meta: {
+ advertiserDomains: []
+ },
}];
expect(spec.interpretResponse(adheseVideoResponse, bidRequest)).to.deep.equal(expectedResponse);
});
diff --git a/test/spec/modules/adkernelBidAdapter_spec.js b/test/spec/modules/adkernelBidAdapter_spec.js
index b9d647238bf..ab1c5501bd9 100644
--- a/test/spec/modules/adkernelBidAdapter_spec.js
+++ b/test/spec/modules/adkernelBidAdapter_spec.js
@@ -28,7 +28,15 @@ describe('Adkernel adapter', function () {
banner: {
sizes: [[728, 90]]
}
- }
+ },
+ userIdAsEids: [
+ {
+ source: 'crwdcntrl.net',
+ uids: [
+ {atype: 1, id: '97d09fbba28542b7acbb6317c9534945a702b74c5993c352f332cfe83f40cdd9'}
+ ]
+ }
+ ]
}, bid3_host2 = {
bidder: 'adkernel',
params: {zoneId: 1, host: 'rtb-private.adkernel.com'},
@@ -251,6 +259,7 @@ describe('Adkernel adapter', function () {
function buildRequest(bidRequests, bidderRequest = DEFAULT_BIDDER_REQUEST, dnt = true) {
let dntmock = sandbox.stub(utils, 'getDNT').callsFake(() => dnt);
+ bidderRequest.bids = bidRequests;
let pbRequests = spec.buildRequests(bidRequests, bidderRequest);
dntmock.restore();
let rtbRequests = pbRequests.map(r => JSON.parse(r.data));
@@ -381,6 +390,17 @@ describe('Adkernel adapter', function () {
let [_, bidRequests] = buildRequest([bid]);
expect(bidRequests[0].imp[0]).to.have.property('bidfloor', 0.145);
});
+
+ it('should forward user ids if available', function() {
+ let bid = Object.assign({}, bid2_zone2);
+ let [_, bidRequests] = buildRequest([bid]);
+ expect(bidRequests[0]).to.have.property('user');
+ expect(bidRequests[0].user).to.have.property('ext');
+ expect(bidRequests[0].user.ext).to.have.property('eids');
+ expect(bidRequests[0].user.ext.eids).to.be.an('array').that.is.not.empty;
+ expect(bidRequests[0].user.ext.eids[0]).to.have.property('source');
+ expect(bidRequests[0].user.ext.eids[0]).to.have.property('uids');
+ });
});
describe('video request building', function () {
diff --git a/test/spec/modules/adliveBidAdapter_spec.js b/test/spec/modules/adliveBidAdapter_spec.js
deleted file mode 100644
index ddf8f82f20f..00000000000
--- a/test/spec/modules/adliveBidAdapter_spec.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/adliveBidAdapter.js';
-
-describe('adliveBidAdapterTests', function() {
- let bidRequestData = {
- bids: [
- {
- bidId: 'transaction_1234',
- bidder: 'adlive',
- params: {
- hashes: ['1e100887dd614b0909bf6c49ba7f69fdd1360437']
- },
- sizes: [[300, 250]]
- }
- ]
- };
- let request = [];
-
- it('validate_pub_params', function() {
- expect(
- spec.isBidRequestValid({
- bidder: 'adlive',
- params: {
- hashes: ['1e100887dd614b0909bf6c49ba7f69fdd1360437']
- }
- })
- ).to.equal(true);
- });
-
- it('validate_generated_params', function() {
- request = spec.buildRequests(bidRequestData.bids);
- let req_data = JSON.parse(request[0].data);
-
- expect(req_data.transaction_id).to.equal('transaction_1234');
- });
-
- it('validate_response_params', function() {
- let serverResponse = {
- body: [
- {
- hash: '1e100887dd614b0909bf6c49ba7f69fdd1360437',
- content: 'Ad html',
- price: 1.12,
- size: [300, 250],
- is_passback: 0
- }
- ]
- };
-
- let bids = spec.interpretResponse(serverResponse, bidRequestData.bids[0]);
- expect(bids).to.have.lengthOf(1);
-
- let bid = bids[0];
-
- expect(bid.creativeId).to.equal('1e100887dd614b0909bf6c49ba7f69fdd1360437');
- expect(bid.ad).to.equal('Ad html');
- expect(bid.cpm).to.equal(1.12);
- expect(bid.width).to.equal(300);
- expect(bid.height).to.equal(250);
- expect(bid.currency).to.equal('USD');
- });
-
- it('validate_response_params_with passback', function() {
- let serverResponse = {
- body: [
- {
- hash: '1e100887dd614b0909bf6c49ba7f69fdd1360437',
- content: 'Ad html passback',
- size: [300, 250],
- is_passback: 1
- }
- ]
- };
- let bids = spec.interpretResponse(serverResponse, bidRequestData.bids[0]);
-
- expect(bids).to.have.lengthOf(0);
- });
-});
diff --git a/test/spec/modules/admanBidAdapter_spec.js b/test/spec/modules/admanBidAdapter_spec.js
deleted file mode 100644
index f3212dec2f5..00000000000
--- a/test/spec/modules/admanBidAdapter_spec.js
+++ /dev/null
@@ -1,231 +0,0 @@
-import {expect} from 'chai';
-import {spec} from '../../../modules/admanBidAdapter.js';
-
-describe('AdmanMediaBidAdapter', function () {
- let bid = {
- bidId: '23fhj33i987f',
- bidder: 'adman',
- params: {
- placementId: 0,
- traffic: 'banner'
- }
- };
-
- describe('isBidRequestValid', function () {
- it('Should return true if there are bidId, params and placementId parameters present', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
- });
- it('Should return false if at least one of parameters is not present', function () {
- delete bid.params.placementId;
- expect(spec.isBidRequestValid(bid)).to.be.false;
- });
- });
-
- describe('buildRequests', function () {
- let serverRequest = spec.buildRequests([bid]);
- it('Creates a ServerRequest object with method, URL and data', function () {
- expect(serverRequest).to.exist;
- expect(serverRequest.method).to.exist;
- expect(serverRequest.url).to.exist;
- expect(serverRequest.data).to.exist;
- });
- it('Returns POST method', function () {
- expect(serverRequest.method).to.equal('POST');
- });
- it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://pub.admanmedia.com/?c=o&m=multi');
- });
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'secure', 'host', 'page', 'placements');
- expect(data.deviceWidth).to.be.a('number');
- expect(data.deviceHeight).to.be.a('number');
- expect(data.language).to.be.a('string');
- expect(data.secure).to.be.within(0, 1);
- expect(data.host).to.be.a('string');
- expect(data.page).to.be.a('string');
- let placement = data['placements'][0];
- expect(placement).to.have.keys('placementId', 'bidId', 'traffic', 'sizes');
- expect(placement.placementId).to.equal(0);
- expect(placement.bidId).to.equal('23fhj33i987f');
- expect(placement.traffic).to.equal('banner');
- });
- it('Returns empty data if no valid requests are passed', function () {
- serverRequest = spec.buildRequests([]);
- let data = serverRequest.data;
- expect(data.placements).to.be.an('array').that.is.empty;
- });
- });
- describe('interpretResponse', function () {
- it('Should interpret banner response', function () {
- const banner = {
- body: [{
- mediaType: 'banner',
- width: 300,
- height: 250,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let bannerResponses = spec.interpretResponse(banner);
- expect(bannerResponses).to.be.an('array').that.is.not.empty;
- let dataItem = bannerResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.width).to.equal(300);
- expect(dataItem.height).to.equal(250);
- expect(dataItem.ad).to.equal('Test');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret video response', function () {
- const video = {
- body: [{
- vastUrl: 'test.com',
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let videoResponses = spec.interpretResponse(video);
- expect(videoResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = videoResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.5);
- expect(dataItem.vastUrl).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret native response', function () {
- const native = {
- body: [{
- mediaType: 'native',
- native: {
- clickUrl: 'test.com',
- title: 'Test',
- image: 'test.com',
- impressionTrackers: ['test.com'],
- },
- ttl: 120,
- cpm: 0.4,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let nativeResponses = spec.interpretResponse(native);
- expect(nativeResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = nativeResponses[0];
- expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native');
- expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.native.clickUrl).to.equal('test.com');
- expect(dataItem.native.title).to.equal('Test');
- expect(dataItem.native.image).to.equal('test.com');
- expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
- expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should return an empty array if invalid banner response is passed', function () {
- const invBanner = {
- body: [{
- width: 300,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
-
- let serverResponses = spec.interpretResponse(invBanner);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid video response is passed', function () {
- const invVideo = {
- body: [{
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invVideo);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid native response is passed', function () {
- const invNative = {
- body: [{
- mediaType: 'native',
- clickUrl: 'test.com',
- title: 'Test',
- impressionTrackers: ['test.com'],
- ttl: 120,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let serverResponses = spec.interpretResponse(invNative);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid response is passed', function () {
- const invalid = {
- body: [{
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invalid);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- });
- describe('getUserSyncs', function () {
- let userSync = spec.getUserSyncs();
- it('Returns valid URL and type', function () {
- expect(userSync).to.be.an('array').with.lengthOf(1);
- expect(userSync[0].type).to.exist;
- expect(userSync[0].url).to.exist;
- expect(userSync[0].type).to.be.equal('image');
- expect(userSync[0].url).to.be.equal('https://pub.admanmedia.com/?c=o&m=sync');
- });
- });
-});
diff --git a/test/spec/modules/admediaBidAdapter_spec.js b/test/spec/modules/admediaBidAdapter_spec.js
deleted file mode 100644
index 5dc7b9a02a8..00000000000
--- a/test/spec/modules/admediaBidAdapter_spec.js
+++ /dev/null
@@ -1,138 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/admediaBidAdapter.js';
-
-describe('admediaAdapterTests', function () {
- describe('bidRequestValidity', function () {
- it('bidRequest with aid', function () {
- expect(spec.isBidRequestValid({
- bidder: 'admedia',
- params: {
- aid: 86858,
- }
- })).to.equal(true);
- });
-
- it('bidRequest without aid', function () {
- expect(spec.isBidRequestValid({
- bidder: 'a4g',
- params: {
- key: 86858
- }
- })).to.equal(false);
- });
- });
-
- describe('bidRequest', function () {
- const validBidRequests = [{
- 'adUnitCode': 'div-gpt-ad-1460505748561-0',
- 'auctionId': 'e3010a3c-5b95-4475-9ba2-1b004c737c30',
- 'bidId': '2758de47c84ab58',
- 'bidRequestsCount': 1,
- 'bidder': 'admedia',
- 'bidderRequestId': '1033407c6af0c7',
- 'params': {
- 'aid': 86858,
- },
- 'sizes': [[300, 250], [300, 600]],
- 'transactionId': '5851b2cf-ee2d-4022-abd2-d581ef01604e'
- }, {
- 'adUnitCode': 'div-gpt-ad-1460505748561-1',
- 'auctionId': 'e3010a3c-5b95-4475-9ba2-1b004c737c30',
- 'bidId': '3d2aaa400371fa',
- 'bidRequestsCount': 1,
- 'bidder': 'admedia',
- 'bidderRequestId': '1033407c6af0c7',
- 'params': {
- 'aid': 84977,
- },
- 'sizes': [[728, 90]],
- 'transactionId': 'f8b5247e-7715-4e60-9d51-33153e78c190'
- }];
-
- const bidderRequest = {
- 'auctionId': 'e3010a3c-5b95-4475-9ba2-1b004c737c30',
- 'bidderCode': 'admedia',
- 'bidderRequestId': '1033407c6af0c7',
- 'refererInfo': {
- 'numIframes': 0,
- 'reachedTop': true,
- 'referer': 'https://test.com/index.html?pbjs_debug=true'
- }
-
- };
-
- const request = spec.buildRequests(validBidRequests, bidderRequest);
-
- it('bidRequest method', function () {
- expect(request.method).to.equal('POST');
- });
-
- it('bidRequest url', function () {
- expect(request.url).to.equal('https://prebid.admedia.com/bidder/');
- });
-
- it('bidRequest data', function () {
- const data = JSON.parse(request.data);
- expect(decodeURIComponent(data.referer)).to.be.eql(bidderRequest.refererInfo.referer);
- expect(data.tags).to.be.an('array');
- expect(data.tags[0].aid).to.be.eql(validBidRequests[0].params.aid);
- expect(data.tags[0].id).to.be.eql(validBidRequests[0].bidId);
- expect(data.tags[0].sizes).to.be.eql(validBidRequests[0].sizes);
- expect(data.tags[1].aid).to.be.eql(validBidRequests[1].params.aid);
- expect(data.tags[1].id).to.be.eql(validBidRequests[1].bidId);
- expect(data.tags[1].sizes).to.be.eql(validBidRequests[1].sizes);
- });
- });
-
- describe('interpretResponse', function () {
- const serverResponse = {
- body: {
- tags: [
- {
- ad: ' ',
- cpm: 0.9,
- height: 250,
- id: '5582180864bc41',
- width: 300,
- },
- {
- error: 'Error message',
- id: '6dc6ee4e157749'
- },
- {
- ad: '',
- cpm: 0,
- height: 728,
- id: '5762180864bc41',
- width: 90,
- }
- ]
- },
- headers: {}
- };
-
- const bidRequest = {};
-
- const result = spec.interpretResponse(serverResponse, bidRequest);
-
- it('Should return an empty array if empty or no tags in response', function () {
- expect(spec.interpretResponse({body: ''}, {}).length).to.equal(0);
- });
-
- it('Should have only one bid', function () {
- expect(result.length).to.equal(1);
- });
-
- it('Should have required keys', function () {
- expect(result[0].requestId).to.be.eql(serverResponse.body.tags[0].id);
- expect(result[0].cpm).to.be.eql(serverResponse.body.tags[0].cpm);
- expect(result[0].width).to.be.eql(serverResponse.body.tags[0].width);
- expect(result[0].height).to.be.eql(serverResponse.body.tags[0].height);
- expect(result[0].creativeId).to.be.eql(serverResponse.body.tags[0].id);
- expect(result[0].dealId).to.be.eql(serverResponse.body.tags[0].id);
- expect(result[0].netRevenue).to.be.eql(true);
- expect(result[0].ttl).to.be.eql(120);
- expect(result[0].ad).to.be.eql(serverResponse.body.tags[0].ad);
- })
- });
-});
diff --git a/test/spec/modules/admixerBidAdapter_spec.js b/test/spec/modules/admixerBidAdapter_spec.js
index 030e98d23f9..27dc895e3a4 100644
--- a/test/spec/modules/admixerBidAdapter_spec.js
+++ b/test/spec/modules/admixerBidAdapter_spec.js
@@ -4,7 +4,7 @@ import {newBidder} from 'src/adapters/bidderFactory.js';
import {config} from '../../../src/config.js';
const BIDDER_CODE = 'admixer';
-const ENDPOINT_URL = 'https://inv-nets.admixer.net/prebid.1.1.aspx';
+const ENDPOINT_URL = 'https://inv-nets.admixer.net/prebid.1.2.aspx';
const ENDPOINT_URL_CUSTOM = 'https://custom.admixer.net/prebid.aspx';
const ZONE_ID = '2eb6bd58-865c-47ce-af7f-a918108c3fd2';
@@ -101,7 +101,7 @@ describe('AdmixerAdapter', function () {
'creativeId': 'ccca3e5e-0c54-4761-9667-771322fbdffc',
'ttl': 360,
'netRevenue': false,
- 'bidId': '5e4e763b6bc60b',
+ 'requestId': '5e4e763b6bc60b',
'dealId': 'asd123',
'meta': {'advertiserId': 123, 'networkId': 123, 'advertiserDomains': ['test.com']}
}]
@@ -112,13 +112,12 @@ describe('AdmixerAdapter', function () {
const ads = response.body.ads;
let expectedResponse = [
{
- 'requestId': ads[0].bidId,
+ 'requestId': ads[0].requestId,
'cpm': ads[0].cpm,
'creativeId': ads[0].creativeId,
'width': ads[0].width,
'height': ads[0].height,
'ad': ads[0].ad,
- 'vastUrl': undefined,
'currency': ads[0].currency,
'netRevenue': ads[0].netRevenue,
'ttl': ads[0].ttl,
diff --git a/test/spec/modules/adnuntiusBidAdapter_spec.js b/test/spec/modules/adnuntiusBidAdapter_spec.js
index 62073fc6aaa..e2682b8d0d5 100644
--- a/test/spec/modules/adnuntiusBidAdapter_spec.js
+++ b/test/spec/modules/adnuntiusBidAdapter_spec.js
@@ -2,10 +2,25 @@
import { expect } from 'chai'; // may prefer 'assert' in place of 'expect'
import { spec } from 'modules/adnuntiusBidAdapter.js';
import { newBidder } from 'src/adapters/bidderFactory.js';
+import { config } from 'src/config.js';
+import * as utils from 'src/utils.js';
+import { getStorageManager } from 'src/storageManager.js';
describe('adnuntiusBidAdapter', function () {
+ const URL = 'https://ads.adnuntius.delivery/i?tzo=';
+ const GVLID = 855;
+ const usi = utils.generateUUID()
+ const meta = [{ key: 'usi', value: usi }]
+ const storage = getStorageManager(GVLID, 'adnuntius')
+ storage.setDataInLocalStorage('adn.metaData', JSON.stringify(meta))
+
+ afterEach(function () {
+ config.resetConfig();
+ });
const tzo = new Date().getTimezoneOffset();
- const ENDPOINT_URL = `https://delivery.adnuntius.com/i?tzo=${tzo}&format=json`;
+ const ENDPOINT_URL = `${URL}${tzo}&format=json&userId=${usi}`;
+ const ENDPOINT_URL_SEGMENTS = `${URL}${tzo}&format=json&segments=segment1,segment2,segment3&userId=${usi}`;
+ const ENDPOINT_URL_CONSENT = `${URL}${tzo}&format=json&consentString=consentString&userId=${usi}`;
const adapter = newBidder(spec);
const bidRequests = [
@@ -114,7 +129,75 @@ describe('adnuntiusBidAdapter', function () {
expect(request[0]).to.have.property('url');
expect(request[0].url).to.equal(ENDPOINT_URL);
expect(request[0]).to.have.property('data');
- expect(request[0].data).to.equal('{\"adUnits\":[{\"auId\":\"8b6bc\",\"targetId\":\"123\"}]}');
+ expect(request[0].data).to.equal('{\"adUnits\":[{\"auId\":\"8b6bc\",\"targetId\":\"123\"}],\"metaData\":{\"usi\":\"' + usi + '\"}}');
+ });
+
+ it('should pass segments if available in config', function () {
+ config.setBidderConfig({
+ bidders: ['adnuntius', 'other'],
+ config: {
+ ortb2: {
+ user: {
+ data: [{
+ name: 'adnuntius',
+ segment: [{ id: 'segment1' }, { id: 'segment2' }]
+ },
+ {
+ name: 'other',
+ segment: ['segment3']
+ }],
+ }
+ }
+ }
+ });
+
+ const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests));
+ expect(request.length).to.equal(1);
+ expect(request[0]).to.have.property('url')
+ expect(request[0].url).to.equal(ENDPOINT_URL_SEGMENTS);
+ });
+
+ it('should skip segments in config if not either id or array of strings', function () {
+ config.setBidderConfig({
+ bidders: ['adnuntius', 'other'],
+ config: {
+ ortb2: {
+ user: {
+ data: [{
+ name: 'adnuntius',
+ segment: [{ id: 'segment1' }, { id: 'segment2' }, { id: 'segment3' }]
+ },
+ {
+ name: 'other',
+ segment: [{
+ notright: 'segment4'
+ }]
+ }],
+ }
+ }
+ }
+ });
+
+ const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests));
+ expect(request.length).to.equal(1);
+ expect(request[0]).to.have.property('url')
+ expect(request[0].url).to.equal(ENDPOINT_URL_SEGMENTS);
+ });
+ });
+
+ describe('user privacy', function () {
+ it('should send GDPR Consent data if gdprApplies', function () {
+ let request = spec.buildRequests(bidRequests, { gdprConsent: { gdprApplies: true, consentString: 'consentString' } });
+ expect(request.length).to.equal(1);
+ expect(request[0]).to.have.property('url')
+ expect(request[0].url).to.equal(ENDPOINT_URL_CONSENT);
+ });
+
+ it('should not send GDPR Consent data if gdprApplies equals undefined', function () {
+ let request = spec.buildRequests(bidRequests, { gdprConsent: { gdprApplies: undefined, consentString: 'consentString' } });
+ expect(request.length).to.equal(1);
+ expect(request[0]).to.have.property('url')
+ expect(request[0].url).to.equal(ENDPOINT_URL);
});
});
diff --git a/test/spec/modules/adotBidAdapter_spec.js b/test/spec/modules/adotBidAdapter_spec.js
index d580cd763a4..40605b17b20 100644
--- a/test/spec/modules/adotBidAdapter_spec.js
+++ b/test/spec/modules/adotBidAdapter_spec.js
@@ -25,19 +25,16 @@ describe('Adot Adapter', function () {
bidder: 'adot',
bidderRequestId: 'bid_request_id',
bidId: 'bid_id',
- params: {
+ params: {},
+ mediaTypes: {
video: {
+ context: 'outstream',
+ playerSize: [[300, 250]],
mimes: ['video/mp4'],
minDuration: 5,
maxDuration: 30,
protocols: [2, 3]
}
- },
- mediaTypes: {
- video: {
- context: 'outstream',
- playerSize: [[300, 250]]
- }
}
},
@@ -48,17 +45,17 @@ describe('Adot Adapter', function () {
bidId: 'bid_id',
params: {
video: {
- instreamContext: 'pre-roll',
- mimes: ['video/mp4'],
- minDuration: 5,
- maxDuration: 30,
- protocols: [2, 3]
+ instreamContext: 'pre-roll'
}
},
mediaTypes: {
video: {
context: 'instream',
- playerSize: [[300, 250]]
+ playerSize: [[300, 250]],
+ mimes: ['video/mp4'],
+ minDuration: 5,
+ maxDuration: 30,
+ protocols: [2, 3]
}
}
},
@@ -557,6 +554,7 @@ describe('Adot Adapter', function () {
price: 1.5,
h: 350,
w: 300,
+ adomain: ['adot'],
ext: {
adot: {
media_type: 'banner'
@@ -568,6 +566,7 @@ describe('Adot Adapter', function () {
crid: 'creative_id_2',
adm: 'creative_data_2_${AUCTION_PRICE}',
nurl: 'win_notice_url_2_${AUCTION_PRICE}',
+ adomain: ['adot'],
price: 2.5,
h: 400,
w: 350,
@@ -913,14 +912,14 @@ describe('Adot Adapter', function () {
it('should return true when given an ad unit without minimum duration parameter', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.minDuration = undefined;
+ adUnit.mediaTypes.video.minDuration = undefined;
expect(spec.isBidRequestValid(adUnit)).to.equal(true);
});
it('should return true when given an ad unit without maximum duration parameter', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.maxDuration = undefined;
+ adUnit.mediaTypes.video.maxDuration = undefined;
expect(spec.isBidRequestValid(adUnit)).to.equal(true);
});
@@ -941,84 +940,84 @@ describe('Adot Adapter', function () {
it('should return false when given an ad unit without video parameters', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video = undefined;
+ adUnit.mediaTypes.video = undefined;
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
it('should return false when given an ad unit with invalid video parameters', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video = 'bad_bidder_parameters';
+ adUnit.mediaTypes.video = 'bad_bidder_parameters';
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
it('should return false when given an ad unit without mime types parameter', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.mimes = undefined;
+ adUnit.mediaTypes.video.mimes = undefined;
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
it('should return false when given an ad unit with an invalid mime types parameter', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.mimes = 'bad_mime_types';
+ adUnit.mediaTypes.video.mimes = 'bad_mime_types';
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
it('should return false when given an ad unit with an empty mime types parameter', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.mimes = [];
+ adUnit.mediaTypes.video.mimes = [];
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
it('should return false when given an ad unit with an invalid mime types parameter value', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.mimes = [200];
+ adUnit.mediaTypes.video.mimes = [200];
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
it('should return false when given an ad unit with an invalid minimum duration parameter', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.minDuration = 'bad_min_duration';
+ adUnit.mediaTypes.video.minDuration = 'bad_min_duration';
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
it('should return false when given an ad unit with an invalid maximum duration parameter', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.maxDuration = 'bad_max_duration';
+ adUnit.mediaTypes.video.maxDuration = 'bad_max_duration';
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
it('should return false when given an ad unit without protocols parameter', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.protocols = undefined;
+ adUnit.mediaTypes.video.protocols = undefined;
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
it('should return false when given an ad unit with an invalid protocols parameter', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.protocols = 'bad_protocols';
+ adUnit.mediaTypes.video.protocols = 'bad_protocols';
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
it('should return false when given an ad unit with an empty protocols parameter', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.protocols = [];
+ adUnit.mediaTypes.video.protocols = [];
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
it('should return false when given an ad unit with an invalid protocols parameter value', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.protocols = ['bad_protocols_value'];
+ adUnit.mediaTypes.video.protocols = ['bad_protocols_value'];
expect(spec.isBidRequestValid(adUnit)).to.equal(false);
});
@@ -1452,13 +1451,13 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.equal(null);
expect(serverRequests[0].data.imp[0].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[0].data.imp[0].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][1]);
- expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.minDuration);
- expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.maxDuration);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.minDuration);
+ expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.protocols);
});
it('should return a server request with one impression when given a valid pre-roll instream ad unit', function () {
@@ -1476,13 +1475,13 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.exist.and.to.be.a('number').and.to.equal(0);
expect(serverRequests[0].data.imp[0].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[0].data.imp[0].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][1]);
- expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.minDuration);
- expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.maxDuration);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.minDuration);
+ expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.protocols);
});
it('should return a server request with one impression when given a valid mid-roll instream ad unit', function () {
@@ -1500,13 +1499,13 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.exist.and.to.be.a('number').and.to.equal(-1);
expect(serverRequests[0].data.imp[0].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[0].data.imp[0].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][1]);
- expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.minDuration);
- expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.maxDuration);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.minDuration);
+ expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.protocols);
});
it('should return a server request with one impression when given a valid post-roll instream ad unit', function () {
@@ -1524,13 +1523,13 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.exist.and.to.be.a('number').and.to.equal(-2);
expect(serverRequests[0].data.imp[0].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[0].data.imp[0].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][1]);
- expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.minDuration);
- expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.maxDuration);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.minDuration);
+ expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.protocols);
});
it('should return a server request with one impression when given a valid ad unit without player size', function () {
@@ -1548,13 +1547,13 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.equal(null);
expect(serverRequests[0].data.imp[0].video.w).to.equal(null);
expect(serverRequests[0].data.imp[0].video.h).to.equal(null);
- expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.minDuration);
- expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.maxDuration);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.minDuration);
+ expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.protocols);
});
it('should return a server request with one impression when given a valid ad unit with an empty player size', function () {
@@ -1572,13 +1571,13 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.equal(null);
expect(serverRequests[0].data.imp[0].video.w).to.equal(null);
expect(serverRequests[0].data.imp[0].video.h).to.equal(null);
- expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.minDuration);
- expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.maxDuration);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.minDuration);
+ expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.protocols);
});
it('should return a server request with one impression when given a valid ad unit with multiple player sizes', function () {
@@ -1596,18 +1595,18 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.equal(null);
expect(serverRequests[0].data.imp[0].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[0].data.imp[0].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][1]);
- expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.minDuration);
- expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.maxDuration);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.minDuration);
+ expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.protocols);
});
it('should return a server request with one impression when given a valid ad unit without minimum duration', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.minDuration = undefined;
+ adUnit.mediaTypes.video.minDuration = undefined;
const adUnits = [adUnit];
@@ -1620,18 +1619,18 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.equal(null);
expect(serverRequests[0].data.imp[0].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[0].data.imp[0].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][1]);
expect(serverRequests[0].data.imp[0].video.minduration).to.equal(null);
- expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.maxDuration);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.protocols);
});
it('should return a server request with one impression when given a valid ad unit without maximum duration', function () {
const adUnit = utils.deepClone(examples.adUnit_video_outstream);
- adUnit.params.video.maxDuration = undefined;
+ adUnit.mediaTypes.video.maxDuration = undefined;
const adUnits = [adUnit];
@@ -1644,13 +1643,13 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.equal(null);
expect(serverRequests[0].data.imp[0].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[0].data.imp[0].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][1]);
- expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.minDuration);
+ expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.minDuration);
expect(serverRequests[0].data.imp[0].video.maxduration).to.equal(null);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.protocols);
});
it('should return a server request with two impressions when given two valid ad units with different impression identifiers', function () {
@@ -1671,31 +1670,31 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.equal(null);
expect(serverRequests[0].data.imp[0].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[0].data.imp[0].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][1]);
- expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.minDuration);
- expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.maxDuration);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.minDuration);
+ expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.protocols);
expect(serverRequests[0].data.imp[1]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[1].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[1].bidId}_0`);
expect(serverRequests[0].data.imp[1].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[1].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[1].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[1].video.startdelay).to.equal(null);
expect(serverRequests[0].data.imp[1].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[0].data.imp[1].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.playerSize[0][1]);
- expect(serverRequests[0].data.imp[1].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].params.video.minDuration);
- expect(serverRequests[0].data.imp[1].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].params.video.maxDuration);
- expect(serverRequests[0].data.imp[1].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[1].params.video.protocols);
+ expect(serverRequests[0].data.imp[1].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.minDuration);
+ expect(serverRequests[0].data.imp[1].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[1].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[1].mediaTypes.video.protocols);
});
it('should return a server request with one overridden impression when given two valid ad units with identical identifiers', function () {
const adUnit_1 = utils.deepClone(examples.adUnit_video_outstream);
- adUnit_1.params.video.minDuration = 10;
+ adUnit_1.mediaTypes.video.minDuration = 10;
const adUnit_2 = utils.deepClone(examples.adUnit_video_outstream);
- adUnit_2.params.video.minDuration = 15;
+ adUnit_2.mediaTypes.video.minDuration = 15;
const adUnits = [adUnit_1, adUnit_2];
@@ -1708,13 +1707,13 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[1].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.equal(null);
expect(serverRequests[0].data.imp[0].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[0].data.imp[0].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.playerSize[0][1]);
- expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].params.video.minDuration);
- expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].params.video.maxDuration);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[1].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.minDuration);
+ expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[1].mediaTypes.video.protocols);
});
it('should return two server requests with one impression when given two valid ad units with different bid request identifiers', function () {
@@ -1735,25 +1734,25 @@ describe('Adot Adapter', function () {
expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0`);
expect(serverRequests[0].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[0].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[0].data.imp[0].video.startdelay).to.equal(null);
expect(serverRequests[0].data.imp[0].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[0].data.imp[0].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.playerSize[0][1]);
- expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.minDuration);
- expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.video.maxDuration);
- expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.protocols);
+ expect(serverRequests[0].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.minDuration);
+ expect(serverRequests[0].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.video.maxDuration);
+ expect(serverRequests[0].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.protocols);
expect(serverRequests[1].data).to.exist.and.to.be.an('object');
expect(serverRequests[1].data.imp).to.exist.and.to.be.an('array').and.to.have.lengthOf(1);
expect(serverRequests[1].data.imp[0]).to.exist.and.to.be.an('object');
expect(serverRequests[1].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[1].bidId}_0`);
expect(serverRequests[1].data.imp[0].video).to.exist.and.to.be.an('object');
- expect(serverRequests[1].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].params.video.mimes);
+ expect(serverRequests[1].data.imp[0].video.mimes).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[0].mediaTypes.video.mimes);
expect(serverRequests[1].data.imp[0].video.startdelay).to.equal(null);
expect(serverRequests[1].data.imp[0].video.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.playerSize[0][0]);
expect(serverRequests[1].data.imp[0].video.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.playerSize[0][1]);
- expect(serverRequests[1].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].params.video.minDuration);
- expect(serverRequests[1].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].params.video.maxDuration);
- expect(serverRequests[1].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[1].params.video.protocols);
+ expect(serverRequests[1].data.imp[0].video.minduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.minDuration);
+ expect(serverRequests[1].data.imp[0].video.maxduration).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.video.maxDuration);
+ expect(serverRequests[1].data.imp[0].video.protocols).to.exist.and.to.be.an('array').and.to.deep.equal(adUnits[1].mediaTypes.video.protocols);
});
});
@@ -2121,6 +2120,48 @@ describe('Adot Adapter', function () {
expect(ads[1].renderer).to.equal(null);
});
+ it('should return two ads when given a valid server response with two bids that contains adomain', function () {
+ const serverRequest = examples.serverRequest_banner_twoImps;
+
+ const serverResponse = examples.serverResponse_banner_twoBids;
+
+ const ads = spec.interpretResponse(serverResponse, serverRequest);
+
+ const admWithAuctionPriceReplaced = utils.replaceAuctionPrice(serverResponse.body.seatbid[0].bid[0].adm, serverResponse.body.seatbid[0].bid[0].price);
+ const adm2WithAuctionPriceReplaced = utils.replaceAuctionPrice(serverResponse.body.seatbid[0].bid[1].adm, serverResponse.body.seatbid[0].bid[1].price);
+
+ expect(ads).to.be.an('array').and.to.have.length(2);
+
+ expect(ads[0].requestId).to.exist.and.to.be.a('string').and.to.equal(serverRequest._adot_internal.impressions[0].bidId);
+ expect(ads[0].ad).to.exist.and.to.be.a('string').and.to.have.string(admWithAuctionPriceReplaced);
+ expect(ads[0].adUrl).to.equal(null);
+ expect(ads[0].vastXml).to.equal(null);
+ expect(ads[0].vastUrl).to.equal(null);
+ expect(ads[0].meta.advertiserDomains[0]).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.seatbid[0].bid[0].adomain[0])
+ expect(ads[0].creativeId).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.seatbid[0].bid[0].crid);
+ expect(ads[0].cpm).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[0].price);
+ expect(ads[0].currency).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.cur);
+ expect(ads[0].netRevenue).to.exist.and.to.be.a('boolean').and.to.equal(true);
+ expect(ads[0].ttl).to.exist.and.to.be.a('number').and.to.equal(10);
+ expect(ads[0].height).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[0].h);
+ expect(ads[0].width).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[0].w);
+ expect(ads[0].mediaType).to.exist.and.to.be.a('string').and.to.equal('banner');
+ expect(ads[0].renderer).to.equal(null);
+ expect(ads[1].requestId).to.exist.and.to.be.a('string').and.to.equal(serverRequest._adot_internal.impressions[1].bidId);
+ expect(ads[1].meta.advertiserDomains[0]).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.seatbid[0].bid[1].adomain[0])
+ expect(ads[1].ad).to.exist.and.to.be.a('string').and.to.have.string(adm2WithAuctionPriceReplaced);
+ expect(ads[1].adUrl).to.equal(null);
+ expect(ads[1].creativeId).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.seatbid[0].bid[1].crid);
+ expect(ads[1].cpm).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[1].price);
+ expect(ads[1].currency).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.cur);
+ expect(ads[1].netRevenue).to.exist.and.to.be.a('boolean').and.to.equal(true);
+ expect(ads[1].ttl).to.exist.and.to.be.a('number').and.to.equal(10);
+ expect(ads[1].height).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[1].h);
+ expect(ads[1].width).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[1].w);
+ expect(ads[1].mediaType).to.exist.and.to.be.a('string').and.to.equal('banner');
+ expect(ads[1].renderer).to.equal(null);
+ });
+
it('should return no ad when not given a server response', function () {
const ads = spec.interpretResponse(null);
@@ -3084,20 +3125,6 @@ describe('Adot Adapter', function () {
expect(ads).to.be.an('array').and.to.have.length(1);
expect(ads[0].renderer).to.be.an('object');
});
-
- it('should append a command to the ad rendering queue when executing the renderer', function (done) {
- const serverRequest = examples.serverRequest_video_outstream;
- const serverResponse = examples.serverResponse_video_outstream;
-
- const [ad] = spec.interpretResponse(serverResponse, serverRequest);
-
- this.spyAdRenderingQueue(ad);
-
- executeAdRenderer(ad, () => {
- expect(ad.renderer.push.calledOnce).to.equal(true);
- expect(ad.renderer.push.firstCall.args[0]).to.exist.and.to.be.a('function');
- }, done);
- });
});
});
diff --git a/test/spec/modules/adpartnerBidAdapter_spec.js b/test/spec/modules/adpartnerBidAdapter_spec.js
deleted file mode 100644
index d30ef7ebf71..00000000000
--- a/test/spec/modules/adpartnerBidAdapter_spec.js
+++ /dev/null
@@ -1,234 +0,0 @@
-import {expect} from 'chai';
-import {spec, ENDPOINT_PROTOCOL, ENDPOINT_DOMAIN, ENDPOINT_PATH} from 'modules/adpartnerBidAdapter.js';
-import {newBidder} from 'src/adapters/bidderFactory.js';
-
-const BIDDER_CODE = 'adpartner';
-
-describe('AdpartnerAdapter', function () {
- const adapter = newBidder(spec);
-
- describe('inherited functions', function () {
- it('exists and is a function', function () {
- expect(adapter.callBids).to.be.exist.and.to.be.a('function');
- });
- });
-
- describe('isBidRequestValid', function () {
- it('should return true when required params found', function () {
- let validRequest = {
- 'params': {
- 'unitId': 123
- }
- };
- expect(spec.isBidRequestValid(validRequest)).to.equal(true);
- });
-
- it('should return true when required params is srting', function () {
- let validRequest = {
- 'params': {
- 'unitId': '456'
- }
- };
- expect(spec.isBidRequestValid(validRequest)).to.equal(true);
- });
-
- it('should return false when required params are not passed', function () {
- let validRequest = {
- 'params': {
- 'unknownId': 123
- }
- };
- expect(spec.isBidRequestValid(validRequest)).to.equal(false);
- });
-
- it('should return false when required params is 0', function () {
- let validRequest = {
- 'params': {
- 'unitId': 0
- }
- };
- expect(spec.isBidRequestValid(validRequest)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- let validEndpoint = ENDPOINT_PROTOCOL + '://' + ENDPOINT_DOMAIN + ENDPOINT_PATH + '?tag=123,456&sizes=300x250|300x600,728x90&referer=https%3A%2F%2Ftest.domain';
-
- let validRequest = [
- {
- 'bidder': BIDDER_CODE,
- 'params': {
- 'unitId': 123
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '30b31c1838de1e'
- },
- {
- 'bidder': BIDDER_CODE,
- 'params': {
- 'unitId': '456'
- },
- 'adUnitCode': 'adunit-code-2',
- 'sizes': [[728, 90]],
- 'bidId': '22aidtbx5eabd9'
- }
- ];
-
- let bidderRequest = {
- refererInfo: {
- referer: 'https://test.domain'
- }
- };
-
- it('bidRequest HTTP method', function () {
- const request = spec.buildRequests(validRequest, bidderRequest);
- expect(request.method).to.equal('POST');
- });
-
- it('bidRequest url', function () {
- const request = spec.buildRequests(validRequest, bidderRequest);
- expect(request.url).to.equal(validEndpoint);
- });
-
- it('bidRequest data', function () {
- const request = spec.buildRequests(validRequest, bidderRequest);
- const payload = JSON.parse(request.data);
- expect(payload[0].unitId).to.equal(123);
- expect(payload[0].sizes).to.deep.equal([[300, 250], [300, 600]]);
- expect(payload[0].bidId).to.equal('30b31c1838de1e');
- expect(payload[1].unitId).to.equal(456);
- expect(payload[1].sizes).to.deep.equal([[728, 90]]);
- expect(payload[1].bidId).to.equal('22aidtbx5eabd9');
- });
- });
-
- describe('joinSizesToString', function () {
- it('success convert sizes list to string', function () {
- const sizesStr = spec.joinSizesToString([[300, 250], [300, 600]]);
- expect(sizesStr).to.equal('300x250|300x600');
- });
- });
-
- describe('interpretResponse', function () {
- const bidRequest = {
- 'method': 'POST',
- 'url': ENDPOINT_PROTOCOL + '://' + ENDPOINT_DOMAIN + ENDPOINT_PATH + '?tag=123,456&code=adunit-code-1,adunit-code-2&bid=30b31c1838de1e,22aidtbx5eabd9&sizes=300x250|300x600,728x90&referer=https%3A%2F%2Ftest.domain',
- 'data': '[{"unitId": 13144370,"adUnitCode": "div-gpt-ad-1460505748561-0","sizes": [[300, 250], [300, 600]],"bidId": "2bdcb0b203c17d","referer": "https://test.domain/index.html"},{"unitId": 13144370,"adUnitCode":"div-gpt-ad-1460505748561-1","sizes": [[768, 90]],"bidId": "3dc6b8084f91a8","referer": "https://test.domain/index.html"}]'
- };
-
- const bidResponse = {
- body: {
- 'div-gpt-ad-1460505748561-0':
- {
- 'ad': 'ad
',
- 'width': 300,
- 'height': 250,
- 'creativeId': '8:123456',
- 'syncs': [
- {'type': 'image', 'url': 'https://test.domain/tracker_1.gif'},
- {'type': 'image', 'url': 'https://test.domain/tracker_2.gif'},
- {'type': 'image', 'url': 'https://test.domain/tracker_3.gif'}
- ],
- 'winNotification': [
- {
- 'method': 'POST',
- 'path': '/hb/bid_won?test=1',
- 'data': {
- 'ad': [
- {'dsp': 8, 'id': 800008, 'cost': 1.0e-5, 'nurl': 'https://test.domain/'}
- ],
- 'unit_id': 1234,
- 'site_id': 123
- }
- }
- ],
- 'cpm': 0.01,
- 'currency': 'USD',
- 'netRevenue': true
- }
- },
- headers: {}
- };
-
- it('result is correct', function () {
- const result = spec.interpretResponse(bidResponse, bidRequest);
- expect(result[0].requestId).to.equal('2bdcb0b203c17d');
- expect(result[0].cpm).to.equal(0.01);
- expect(result[0].width).to.equal(300);
- expect(result[0].height).to.equal(250);
- expect(result[0].creativeId).to.equal('8:123456');
- expect(result[0].currency).to.equal('USD');
- expect(result[0].ttl).to.equal(60);
- expect(result[0].winNotification[0]).to.deep.equal({'method': 'POST', 'path': '/hb/bid_won?test=1', 'data': {'ad': [{'dsp': 8, 'id': 800008, 'cost': 1.0e-5, 'nurl': 'https://test.domain/'}], 'unit_id': 1234, 'site_id': 123}});
- });
- });
-
- describe('adResponse', function () {
- const bid = {
- 'unitId': 13144370,
- 'adUnitCode': 'div-gpt-ad-1460505748561-0',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '2bdcb0b203c17d',
- 'referer': 'https://test.domain/index.html'
- };
- const ad = {
- 'ad': 'ad
',
- 'width': 300,
- 'height': 250,
- 'creativeId': '8:123456',
- 'syncs': [],
- 'winNotification': [],
- 'cpm': 0.01,
- 'currency': 'USD',
- 'netRevenue': true
- };
-
- it('fill ad for response', function () {
- const result = spec.adResponse(bid, ad);
- expect(result.requestId).to.equal('2bdcb0b203c17d');
- expect(result.cpm).to.equal(0.01);
- expect(result.width).to.equal(300);
- expect(result.height).to.equal(250);
- expect(result.creativeId).to.equal('8:123456');
- expect(result.currency).to.equal('USD');
- expect(result.ttl).to.equal(60);
- });
- });
-
- describe('onBidWon', function () {
- const bid = {
- winNotification: [
- {
- 'method': 'POST',
- 'path': '/hb/bid_won?test=1',
- 'data': {
- 'ad': [
- {'dsp': 8, 'id': 800008, 'cost': 0.01, 'nurl': 'http://test.domain/'}
- ],
- 'unit_id': 1234,
- 'site_id': 123
- }
- }
- ]
- };
-
- let ajaxStub;
-
- beforeEach(() => {
- ajaxStub = sinon.stub(spec, 'postRequest')
- })
-
- afterEach(() => {
- ajaxStub.restore()
- })
-
- it('calls adpartner\'s callback endpoint', () => {
- const result = spec.onBidWon(bid);
- expect(result).to.equal(true);
- expect(ajaxStub.calledOnce).to.equal(true);
- expect(ajaxStub.firstCall.args[0]).to.equal(ENDPOINT_PROTOCOL + '://' + ENDPOINT_DOMAIN + '/hb/bid_won?test=1');
- expect(ajaxStub.firstCall.args[1]).to.deep.equal(JSON.stringify(bid.winNotification[0].data));
- });
- });
-});
diff --git a/test/spec/modules/adprimeBidAdapter_spec.js b/test/spec/modules/adprimeBidAdapter_spec.js
deleted file mode 100644
index 8627941dc80..00000000000
--- a/test/spec/modules/adprimeBidAdapter_spec.js
+++ /dev/null
@@ -1,297 +0,0 @@
-import {expect} from 'chai';
-import {spec} from '../../../modules/adprimeBidAdapter.js';
-import { BANNER, VIDEO } from '../../../src/mediaTypes.js';
-
-describe('AdprimebBidAdapter', function () {
- const bid = {
- bidId: '23fhj33i987f',
- bidder: 'adprime',
- params: {
- placementId: 0,
- traffic: BANNER
- }
- };
-
- const bidderRequest = {
- refererInfo: {
- referer: 'test.com'
- }
- };
-
- describe('isBidRequestValid', function () {
- it('Should return true if there are bidId, params and placementId parameters present', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
- });
- it('Should return false if at least one of parameters is not present', function () {
- delete bid.params.placementId;
- expect(spec.isBidRequestValid(bid)).to.be.false;
- });
- });
-
- describe('buildRequests', function () {
- let serverRequest = spec.buildRequests([bid], bidderRequest);
- it('Creates a ServerRequest object with method, URL and data', function () {
- expect(serverRequest).to.exist;
- expect(serverRequest.method).to.exist;
- expect(serverRequest.url).to.exist;
- expect(serverRequest.data).to.exist;
- });
- it('Returns POST method', function () {
- expect(serverRequest.method).to.equal('POST');
- });
- it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://delta.adprime.com/?c=o&m=multi');
- });
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'secure', 'host', 'page', 'placements');
- expect(data.deviceWidth).to.be.a('number');
- expect(data.deviceHeight).to.be.a('number');
- expect(data.language).to.be.a('string');
- expect(data.secure).to.be.within(0, 1);
- expect(data.host).to.be.a('string');
- expect(data.page).to.be.a('string');
- expect(data.gdpr).to.not.exist;
- expect(data.ccpa).to.not.exist;
- let placement = data['placements'][0];
- expect(placement).to.have.keys('placementId', 'bidId', 'identeties', 'traffic', 'sizes', 'hPlayer', 'wPlayer', 'schain', 'keywords');
- expect(placement.placementId).to.equal(0);
- expect(placement.bidId).to.equal('23fhj33i987f');
- expect(placement.traffic).to.equal(BANNER);
- expect(placement.schain).to.be.an('object');
- });
-
- it('Returns valid data for mediatype video', function () {
- const playerSize = [300, 300];
- bid.mediaTypes = {};
- bid.params.traffic = VIDEO;
- bid.mediaTypes[VIDEO] = {
- playerSize
- };
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- let placement = data['placements'][0];
- expect(placement).to.be.an('object');
- expect(placement.traffic).to.equal(VIDEO);
- expect(placement.wPlayer).to.equal(playerSize[0]);
- expect(placement.hPlayer).to.equal(playerSize[1]);
- });
-
- it('Returns data with gdprConsent and without uspConsent', function () {
- bidderRequest.gdprConsent = 'test';
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data.gdpr).to.exist;
- expect(data.gdpr).to.be.a('string');
- expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
- expect(data.ccpa).to.not.exist;
- delete bidderRequest.gdprConsent;
- });
-
- it('Returns data with uspConsent and without gdprConsent', function () {
- bidderRequest.uspConsent = 'test';
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data.ccpa).to.exist;
- expect(data.ccpa).to.be.a('string');
- expect(data.ccpa).to.equal(bidderRequest.uspConsent);
- expect(data.gdpr).to.not.exist;
- });
-
- it('Returns empty data if no valid requests are passed', function () {
- serverRequest = spec.buildRequests([]);
- let data = serverRequest.data;
- expect(data.placements).to.be.an('array').that.is.empty;
- });
- });
- describe('buildRequests with user ids', function () {
- bid.userId = {}
- bid.userId.idl_env = 'idl_env123';
- let serverRequest = spec.buildRequests([bid], bidderRequest);
- it('Return bids with user identeties', function () {
- let data = serverRequest.data;
- let placements = data['placements'];
- expect(data).to.be.an('object');
- for (let i = 0; i < placements.length; i++) {
- let placement = placements[i];
- expect(placement).to.have.property('identeties')
- expect(placement.identeties).to.be.an('object')
- expect(placement.identeties).to.have.property('identityLink')
- expect(placement.identeties.identityLink).to.be.equal('idl_env123')
- }
- });
- });
- describe('interpretResponse', function () {
- it('Should interpret banner response', function () {
- const banner = {
- body: [{
- mediaType: 'banner',
- width: 300,
- height: 250,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let bannerResponses = spec.interpretResponse(banner);
- expect(bannerResponses).to.be.an('array').that.is.not.empty;
- let dataItem = bannerResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.width).to.equal(300);
- expect(dataItem.height).to.equal(250);
- expect(dataItem.ad).to.equal('Test');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret video response', function () {
- const video = {
- body: [{
- vastUrl: 'test.com',
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let videoResponses = spec.interpretResponse(video);
- expect(videoResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = videoResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.5);
- expect(dataItem.vastUrl).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret native response', function () {
- const native = {
- body: [{
- mediaType: 'native',
- native: {
- clickUrl: 'test.com',
- title: 'Test',
- image: 'test.com',
- impressionTrackers: ['test.com'],
- },
- ttl: 120,
- cpm: 0.4,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let nativeResponses = spec.interpretResponse(native);
- expect(nativeResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = nativeResponses[0];
- expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native');
- expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.native.clickUrl).to.equal('test.com');
- expect(dataItem.native.title).to.equal('Test');
- expect(dataItem.native.image).to.equal('test.com');
- expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
- expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should return an empty array if invalid banner response is passed', function () {
- const invBanner = {
- body: [{
- width: 300,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
-
- let serverResponses = spec.interpretResponse(invBanner);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid video response is passed', function () {
- const invVideo = {
- body: [{
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invVideo);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid native response is passed', function () {
- const invNative = {
- body: [{
- mediaType: 'native',
- clickUrl: 'test.com',
- title: 'Test',
- impressionTrackers: ['test.com'],
- ttl: 120,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let serverResponses = spec.interpretResponse(invNative);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid response is passed', function () {
- const invalid = {
- body: [{
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invalid);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- });
- describe('getUserSyncs', function () {
- let userSync = spec.getUserSyncs();
- it('Returns valid URL and type', function () {
- expect(userSync).to.be.an('array').with.lengthOf(1);
- expect(userSync[0].type).to.exist;
- expect(userSync[0].url).to.exist;
- expect(userSync[0].type).to.be.equal('image');
- expect(userSync[0].url).to.be.equal('https://delta.adprime.com/?c=rtb&m=sync');
- });
- });
-});
diff --git a/test/spec/modules/adrelevantisBidAdapter_spec.js b/test/spec/modules/adrelevantisBidAdapter_spec.js
index 596f3bade5d..b87f9d6b86c 100644
--- a/test/spec/modules/adrelevantisBidAdapter_spec.js
+++ b/test/spec/modules/adrelevantisBidAdapter_spec.js
@@ -228,11 +228,7 @@ describe('AdrelevantisAdapter', function () {
.returns({
site: {
keywords: 'US Open',
- ext: {
- data: {
- category: 'sports/tennis'
- }
- }
+ category: 'sports/tennis'
}
});
diff --git a/test/spec/modules/adriverBidAdapter_spec.js b/test/spec/modules/adriverBidAdapter_spec.js
index c16bc5df5cb..9d410090885 100644
--- a/test/spec/modules/adriverBidAdapter_spec.js
+++ b/test/spec/modules/adriverBidAdapter_spec.js
@@ -3,6 +3,7 @@ import { spec } from 'modules/adriverBidAdapter.js';
import { newBidder } from 'src/adapters/bidderFactory.js';
import * as bidderFactory from 'src/adapters/bidderFactory.js';
import { auctionManager } from 'src/auctionManager.js';
+
const ENDPOINT = 'https://pb.adriver.ru/cgi-bin/bid.cgi';
describe('adriverAdapter', function () {
@@ -15,17 +16,44 @@ describe('adriverAdapter', function () {
});
describe('isBidRequestValid', function () {
- let bid = {
- 'bidder': 'adriver',
- 'params': {
- 'placementId': '55:test_placement',
- 'siteid': 'testSiteID'
+ const bid = {
+ bidder: 'adriver',
+ params: {
+ placementId: '55:test_placement',
+ siteid: 'testSiteID'
},
- 'adUnitCode': 'adunit-code',
- 'sizes': [[300, 250], [300, 600], [300, 250]],
- 'bidId': '30b31c1838de1e',
- 'bidderRequestId': '22edbae2733bf6',
- 'auctionId': '1d1a030790a475',
+ adUnitCode: 'adunit-code',
+ sizes: [[300, 250], [300, 600], [300, 250]],
+ bidId: '30b31c1838de1e',
+ bidderRequestId: '22edbae2733bf6',
+ auctionId: '1d1a030790a475',
+ userIdAsEids: [
+ {
+ source: 'id5-sync.com',
+ uids: [
+ {
+ id: '',
+ atype: 1,
+ ext: {
+ linkType: 0,
+ abTestingControlGroup: true
+ }
+ }
+ ]
+ },
+ {
+ source: 'sharedid.org',
+ uids: [
+ {
+ id: '01F4W41TMN7NBXBA0PXJMPB7GF',
+ atype: 1,
+ ext: {
+ third: '01F4W41TMN7NBXBA0PXJMPB7GF'
+ }
+ }
+ ]
+ }
+ ]
};
it('should return true when required params found', function () {
@@ -37,27 +65,163 @@ describe('adriverAdapter', function () {
let getAdUnitsStub;
const floor = 3;
- let bidRequests = [
+ const bidRequests = [
{
- 'bidder': 'adriver',
- 'params': {
- 'placementId': '55:test_placement',
- 'siteid': 'testSiteID',
- 'dealid': 'dealidTest'
+ bidder: 'adriver',
+ params: {
+ placementId: '55:test_placement',
+ siteid: 'testSiteID',
+ dealid: 'dealidTest'
},
- 'adUnitCode': 'adunit-code',
- 'sizes': [[300, 250], [300, 600], [300, 250]],
- 'bidId': '30b31c1838de1e',
- 'bidderRequestId': '22edbae2733bf6',
- 'auctionId': '1d1a030790a475',
- 'transactionId': '04f2659e-c005-4eb1-a57c-fa93145e3843'
+ adUnitCode: 'adunit-code',
+ sizes: [[300, 250], [300, 600], [300, 250]],
+ bidId: '30b31c1838de1e',
+ bidderRequestId: '22edbae2733bf6',
+ auctionId: '1d1a030790a475',
+ transactionId: '04f2659e-c005-4eb1-a57c-fa93145e3843',
+ userIdAsEids: [
+ {
+ source: 'id5-sync.com',
+ uids: [
+ {
+ id: '',
+ atype: 1,
+ ext: {
+ linkType: 0,
+ abTestingControlGroup: true
+ }
+ }
+ ]
+ },
+ {
+ source: 'sharedid.org',
+ uids: [
+ {
+ id: '01F4W41TMN7NBXBA0PXJMPB7GF',
+ atype: 1,
+ ext: {
+ third: '01F4W41TMN7NBXBA0PXJMPB7GF'
+ }
+ }
+ ]
+ }
+ ]
}
];
+ const bidderRequest = {
+ 'bidderCode': 'adriver',
+ 'auctionId': '2cdbf766-c37e-464c-a924-d8cf2a2f7ed2',
+ 'bidderRequestId': '10415226a1f2ac',
+ 'bids': [
+ {
+ 'bidder': 'adriver',
+ 'params': {
+ 'siteid': '216200',
+ 'bidfloor': 1.33,
+ 'placementId': 'test1'
+ },
+ 'auctionId': '2cdbf766-c37e-464c-a924-d8cf2a2f7ed2',
+ 'floorData': {
+ 'skipped': false,
+ 'skipRate': 5,
+ 'modelVersion': 'BlackBerryZap',
+ 'location': 'setConfig'
+ },
+ 'userId': {
+ 'id5id': {
+ 'uid': 'ID5-ZHMO7vyrzH4ggO1TVF8lZ31h77BjNP6pLgMwIrhvtw!ID5*wP-eG3RLeJjkl1O5yeOMcf3Ksrsq1OeqM5nQZLgPvOMAACaMv9QnPWzdhdbFYu3r',
+ 'ext': {
+ 'linkType': 2,
+ 'abTestingControlGroup': false
+ }
+ },
+ 'sharedid': {
+ 'id': '01F4W41TMN7NBXBA0PXJMPB7GF',
+ 'third': '01F4W41TMN7NBXBA0PXJMPB7GF'
+ }
+ },
+ 'userIdAsEids': [
+ {
+ 'source': 'id5-sync.com',
+ 'uids': [
+ {
+ 'id': 'ID5-ZHMO7vyrzH4ggO1TVF8lZ31h77BjNP6pLgMwIrhvtw!ID5*wP-eG3RLeJjkl1O5yeOMcf3Ksrsq1OeqM5nQZLgPvOMAACaMv9QnPWzdhdbFYu3r',
+ 'atype': 1,
+ 'ext': {
+ 'linkType': 2,
+ 'abTestingControlGroup': false
+ }
+ }
+ ]
+ },
+ {
+ 'source': 'sharedid.org',
+ 'uids': [
+ {
+ 'id': '01F4W41TMN7NBXBA0PXJMPB7GF',
+ 'atype': 1,
+ 'ext': {
+ 'third': '01F4W41TMN7NBXBA0PXJMPB7GF'
+ }
+ }
+ ]
+ }
+ ],
+ 'mediaTypes': {
+ 'banner': {
+ 'sizes': [
+ [
+ 300,
+ 250
+ ],
+ [
+ 600,
+ 500
+ ]
+ ]
+ }
+ },
+ 'adUnitCode': 'div-gpt-ad-51545-0',
+ 'transactionId': '01dfccdf-70d0-461f-b284-9132877ebe02',
+ 'sizes': [
+ [
+ 300,
+ 250
+ ],
+ [
+ 600,
+ 500
+ ]
+ ],
+ 'bidId': '2794d8415635b3',
+ 'bidderRequestId': '10415226a1f2ac',
+ 'src': 'client',
+ 'bidRequestsCount': 1,
+ 'bidderRequestsCount': 1,
+ 'bidderWinsCount': 0
+ }
+ ],
+ 'auctionStart': 1622465003758,
+ 'timeout': 1000,
+ 'refererInfo': {
+ 'referer': 'http://localhost:9999/integrationExamples/gpt/adUnitFloors.html',
+ 'reachedTop': true,
+ 'isAmp': false,
+ 'numIframes': 0,
+ 'stack': [
+ 'http://localhost:9999/integrationExamples/gpt/adUnitFloors.html'
+ ],
+ 'canonicalUrl': null
+ },
+ 'start': 1622465003762
+ };
+
let floorTestData = {
'currency': 'USD',
'floor': floor
};
+
bidRequests[0].getFloor = _ => {
return floorTestData;
};
@@ -79,6 +243,14 @@ describe('adriverAdapter', function () {
expect(payload.cur).to.exist;
});
+ it('should exist timeout', function () {
+ const request = spec.buildRequests(bidRequests, bidderRequest);
+ const payload = JSON.parse(request.data);
+
+ expect(payload.tmax).to.exist;
+ expect(payload.tmax).to.equal(1000);
+ });
+
it('should exist at', function () {
const request = spec.buildRequests(bidRequests);
const payload = JSON.parse(request.data);
@@ -225,7 +397,34 @@ describe('adriverAdapter', function () {
bidId: '30b31c1838de1e',
bidderRequestId: '22edbae2733bf6',
auctionId: '1d1a030790a475',
- transactionId: '04f2659e-c005-4eb1-a57c-fa93145e3843'
+ transactionId: '04f2659e-c005-4eb1-a57c-fa93145e3843',
+ userIdAsEids: [
+ {
+ source: 'id5-sync.com',
+ uids: [
+ {
+ id: '',
+ atype: 1,
+ ext: {
+ linkType: 0,
+ abTestingControlGroup: true
+ }
+ }
+ ]
+ },
+ {
+ source: 'sharedid.org',
+ uids: [
+ {
+ id: '01F4W41TMN7NBXBA0PXJMPB7GF',
+ atype: 1,
+ ext: {
+ third: '01F4W41TMN7NBXBA0PXJMPB7GF'
+ }
+ }
+ ]
+ }
+ ]
}
];
@@ -320,4 +519,66 @@ describe('adriverAdapter', function () {
expect(payload.imp[0].bidfloorcur).to.equal('RUB');
});
});
+
+ describe('user ids', function () {
+ let bidRequests = [
+ {
+ bidder: 'adriver',
+ params: {
+ placementId: '55:test_placement',
+ siteid: 'testSiteID',
+ dealid: 'dealidTest',
+ },
+ adUnitCode: 'adunit-code',
+ sizes: [[300, 250], [300, 600], [300, 250]],
+ bidId: '30b31c1838de1e',
+ bidderRequestId: '22edbae2733bf6',
+ auctionId: '1d1a030790a475',
+ transactionId: '04f2659e-c005-4eb1-a57c-fa93145e3843',
+ userIdAsEids: [
+ {
+ source: 'id5-sync.com',
+ uids: [
+ {
+ id: '',
+ atype: 1,
+ ext: {
+ linkType: 0,
+ abTestingControlGroup: true
+ }
+ }
+ ]
+ },
+ {
+ source: 'sharedid.org',
+ uids: [
+ {
+ id: '01F4W41TMN7NBXBA0PXJMPB7GF',
+ atype: 1,
+ ext: {
+ third: '01F4W41TMN7NBXBA0PXJMPB7GF'
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ];
+
+ it('user id id5-sync.com', function () {
+ const request = spec.buildRequests(bidRequests);
+ const payload = JSON.parse(request.data);
+
+ expect(payload.user.ext.eids[0].source).to.equal('id5-sync.com');
+ expect(payload.user.ext.eids[0].uids[0].id).to.equal('');
+ });
+
+ it('user id sharedid.org', function () {
+ const request = spec.buildRequests(bidRequests);
+ const payload = JSON.parse(request.data);
+
+ expect(payload.user.ext.eids[1].source).to.equal('sharedid.org');
+ expect(payload.user.ext.eids[1].uids[0].id).to.equal('01F4W41TMN7NBXBA0PXJMPB7GF');
+ });
+ });
});
diff --git a/test/spec/modules/adtargetBidAdapter_spec.js b/test/spec/modules/adtargetBidAdapter_spec.js
index 5a867e7dd52..d1221d24022 100644
--- a/test/spec/modules/adtargetBidAdapter_spec.js
+++ b/test/spec/modules/adtargetBidAdapter_spec.js
@@ -45,7 +45,8 @@ const SERVER_VIDEO_RESPONSE = {
'height': 480,
'cur': 'USD',
'width': 640,
- 'cpm': 0.9
+ 'cpm': 0.9,
+ 'adomain': ['a.com']
}]
};
const SERVER_DISPLAY_RESPONSE = {
@@ -107,7 +108,10 @@ const videoEqResponse = [{
height: 480,
width: 640,
ttl: 300,
- cpm: 0.9
+ cpm: 0.9,
+ meta: {
+ advertiserDomains: ['a.com']
+ }
}];
const displayEqResponse = [{
@@ -120,7 +124,10 @@ const displayEqResponse = [{
height: 250,
width: 300,
ttl: 300,
- cpm: 0.9
+ cpm: 0.9,
+ meta: {
+ advertiserDomains: []
+ }
}];
describe('adtargetBidAdapter', () => {
diff --git a/test/spec/modules/adtelligentBidAdapter_spec.js b/test/spec/modules/adtelligentBidAdapter_spec.js
index e6916997133..4cfb367efb3 100644
--- a/test/spec/modules/adtelligentBidAdapter_spec.js
+++ b/test/spec/modules/adtelligentBidAdapter_spec.js
@@ -80,9 +80,9 @@ const SERVER_VIDEO_RESPONSE = {
'height': 480,
'cur': 'USD',
'width': 640,
- 'cpm': 0.9
- }
- ]
+ 'cpm': 0.9,
+ 'adomain': ['a.com']
+ }]
};
const SERVER_OUSTREAM_VIDEO_RESPONSE = SERVER_VIDEO_RESPONSE;
const SERVER_DISPLAY_RESPONSE = {
@@ -163,7 +163,10 @@ const videoEqResponse = [{
height: 480,
width: 640,
ttl: 300,
- cpm: 0.9
+ cpm: 0.9,
+ meta: {
+ advertiserDomains: ['a.com']
+ }
}];
const displayEqResponse = [{
@@ -177,7 +180,11 @@ const displayEqResponse = [{
height: 250,
width: 300,
ttl: 300,
- cpm: 0.9
+ cpm: 0.9,
+ meta: {
+ advertiserDomains: []
+ }
+
}];
describe('adtelligentBidAdapter', () => {
diff --git a/test/spec/modules/adtelligentIdSystem_spec.js b/test/spec/modules/adtelligentIdSystem_spec.js
new file mode 100644
index 00000000000..f3c7262c67a
--- /dev/null
+++ b/test/spec/modules/adtelligentIdSystem_spec.js
@@ -0,0 +1,30 @@
+import { adtelligentIdModule } from 'modules/adtelligentIdSystem'
+import * as ajaxLib from 'src/ajax.js';
+
+const adtUserIdRemoteResponse = { u: 'test1' };
+const adtUserIdLocalResponse = 'test2';
+
+describe('AdtelligentId module', function () {
+ it('gets remote id', function () {
+ const ajaxBuilderStub = sinon.stub(ajaxLib, 'ajaxBuilder').callsFake(() => {
+ return (url, cbObj) => {
+ cbObj.success(JSON.stringify(adtUserIdRemoteResponse))
+ }
+ });
+ const moduleIdCallbackResponse = adtelligentIdModule.getId();
+ moduleIdCallbackResponse.callback((id) => {
+ expect(id).to.equal(adtUserIdRemoteResponse.u)
+ })
+ ajaxBuilderStub.restore();
+ })
+ it('gets id from page context', function () {
+ window.adtDmp = {
+ ready: true,
+ getUID() {
+ return adtUserIdLocalResponse;
+ }
+ }
+ const moduleIdResponse = adtelligentIdModule.getId();
+ assert.deepEqual(moduleIdResponse, { id: adtUserIdLocalResponse });
+ })
+})
diff --git a/test/spec/modules/adtrueBidAdapter_spec.js b/test/spec/modules/adtrueBidAdapter_spec.js
index 8e1c872d460..b499d077a3c 100644
--- a/test/spec/modules/adtrueBidAdapter_spec.js
+++ b/test/spec/modules/adtrueBidAdapter_spec.js
@@ -21,7 +21,7 @@ describe('AdTrueBidAdapter', function () {
params: {
publisherId: '1212',
zoneId: '21423',
- reserve: 0.2
+ reserve: 0
},
placementCode: 'adunit-code-1',
sizes: [[300, 250]],
diff --git a/test/spec/modules/advangelistsBidAdapter_spec.js b/test/spec/modules/advangelistsBidAdapter_spec.js
deleted file mode 100755
index 2b9615fb572..00000000000
--- a/test/spec/modules/advangelistsBidAdapter_spec.js
+++ /dev/null
@@ -1,137 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/advangelistsBidAdapter.js';
-import { BANNER, VIDEO } from 'src/mediaTypes.js';
-
-describe('advangelistsBidAdapter', function () {
- let bidRequests;
- let bidRequestsVid;
-
- beforeEach(function () {
- bidRequests = [{'bidder': 'advangelists', 'params': {'pubid': '0cf8d6d643e13d86a5b6374148a4afac', 'placement': 1234}, 'crumbs': {'pubcid': '979fde13-c71e-4ac2-98b7-28c90f99b449'}, 'mediaTypes': {'banner': {'sizes': [[300, 250]]}}, 'adUnitCode': 'div-gpt-ad-1460505748561-0', 'transactionId': 'f72931e6-2b0e-4e37-a2bc-1ea912141f81', 'sizes': [[300, 250]], 'bidId': '2aa73f571eaf29', 'bidderRequestId': '1bac84515a7af3', 'auctionId': '5dbc60fa-1aa1-41ce-9092-e6bbd4d478f7', 'src': 'client', 'bidRequestsCount': 1, 'pageurl': 'http://google.com'}];
-
- bidRequestsVid = [{'bidder': 'advangelists', 'params': {'pubid': '8537f00948fc37cc03c5f0f88e198a76', 'placement': 1234, 'video': {'id': 123, 'skip': 1, 'mimes': ['video/mp4', 'application/javascript'], 'playbackmethod': [2, 6], 'maxduration': 30}}, 'crumbs': {'pubcid': '979fde13-c71e-4ac2-98b7-28c90f99b449'}, 'mediaTypes': {'video': {'playerSize': [[320, 480]], 'context': 'instream'}}, 'adUnitCode': 'video1', 'transactionId': '8b060952-93f7-4863-af44-bb8796b97c42', 'sizes': [], 'bidId': '25c6ab92aa0e81', 'bidderRequestId': '1d420b73a013fc', 'auctionId': '9a69741c-34fb-474c-83e1-cfa003aaee17', 'src': 'client', 'bidRequestsCount': 1, 'pageurl': 'http://google.com'}];
- });
-
- describe('spec.isBidRequestValid', function () {
- it('should return true when the required params are passed for banner', function () {
- const bidRequest = bidRequests[0];
- expect(spec.isBidRequestValid(bidRequest)).to.equal(true);
- });
-
- it('should return true when the required params are passed for video', function () {
- const bidRequests = bidRequestsVid[0];
- expect(spec.isBidRequestValid(bidRequests)).to.equal(true);
- });
-
- it('should return false when no pub id params are passed', function () {
- const bidRequest = bidRequests[0];
- bidRequest.params.pubid = '';
- expect(spec.isBidRequestValid(bidRequest)).to.equal(false);
- });
-
- it('should return false when no placement params are passed', function () {
- const bidRequest = bidRequests[0];
- bidRequest.params.placement = '';
- expect(spec.isBidRequestValid(bidRequest)).to.equal(false);
- });
-
- it('should return false when a bid request is not passed', function () {
- expect(spec.isBidRequestValid()).to.equal(false);
- expect(spec.isBidRequestValid({})).to.equal(false);
- });
- });
-
- describe('spec.buildRequests', function () {
- it('should create a POST request for each bid', function () {
- const bidRequest = bidRequests[0];
- const requests = spec.buildRequests([ bidRequest ]);
- expect(requests[0].method).to.equal('POST');
- });
-
- it('should create a POST request for each bid in video request', function () {
- const bidRequest = bidRequestsVid[0];
- const requests = spec.buildRequests([ bidRequest ]);
- expect(requests[0].method).to.equal('POST');
- });
-
- it('should have domain in request', function () {
- const bidRequest = bidRequests[0];
- const requests = spec.buildRequests([ bidRequest ]);
- expect(requests[0].data.site.domain).length !== 0;
- });
- });
-
- describe('spec.interpretResponse', function () {
- describe('for banner bids', function () {
- it('should return no bids if the response is not valid', function () {
- const bidRequest = bidRequests[0];
- bidRequest.mediaTypes = { banner: {} };
- const bidResponse = spec.interpretResponse({ body: null }, { bidRequest });
-
- if (typeof bidResponse !== 'undefined') {
- expect(bidResponse.length).to.equal(0);
- } else {
- expect(true).to.equal(true);
- }
- });
-
- it('should return no bids if the response is empty', function () {
- const bidRequest = bidRequests[0];
- bidRequest.mediaTypes = { banner: {} };
- const bidResponse = spec.interpretResponse({ body: [] }, { bidRequest });
- if (typeof bidResponse !== 'undefined') {
- expect(bidResponse.length).to.equal(0);
- } else { expect(true).to.equal(true); }
- });
-
- it('should return valid video bid responses', function () {
- let _mediaTypes = VIDEO;
- const advangelistsbidreqVid = {'bidRequest': {'mediaTypes': {'video': {'w': 320, 'h': 480}}}};
- const serverResponseVid = {'cur': 'USD', 'id': '25c6ab92aa0e81', 'seatbid': [{'seat': '3', 'bid': [{'crid': '1855', 'h': 480, 'protocol': 2, 'nurl': 'http://nep.advangelists.com/xp/evt?pp=1MO1wiaMhhq7wLRzZZwwwPkJxxKpYEnM5k5MH4qSGm1HR8rp3Nl7vDocvzZzSAvE4pnREL9mQ1kf5PDjk6E8em6DOk7vVrYUH1TYQyqCucd58PFpJNN7h30RXKHHFg3XaLuQ3PKfMuI1qZATBJ6WHcu875y0hqRdiewn0J4JsCYF53M27uwmcV0HnQxARQZZ72mPqrW95U6wgkZljziwKrICM3aBV07TU6YK5R5AyzJRuD6mtrQ2xtHlQ3jXVYKE5bvWFiUQd90t0jOGhPtYBNoOfP7uQ4ZZj4pyucxbr96orHe9PSOn9UpCSWArdx7s8lOfDpwOvbMuyGxynbStDWm38sDgd4bMHnIt762m5VMDNJfiUyX0vWzp05OsufJDVEaWhAM62i40lQZo7mWP4ipoOWLkmlaAzFIMsTcNaHAHiKKqGEOZLkCEhFNM0SLcvgN2HFRULOOIZvusq7TydOKxuXgCS91dLUDxDDDFUK83BFKlMkTxnCzkLbIR1bd9GKcr1TRryOrulyvRWAKAIhEsUzsc5QWFUhmI2dZ1eqnBQJ0c89TaPcnoaP2WipF68UgyiOstf2CBy0M34858tC5PmuQwQYwXscg6zyqDwR0i9MzGH4FkTyU5yeOlPcsA0ht6UcoCdFpHpumDrLUwAaxwGk1Nj8S6YlYYT5wNuTifDGbg22QKXzZBkUARiyVvgPn9nRtXnrd7WmiMYq596rya9RQj7LC0auQW8bHVQLEe49shsZDnAwZTWr4QuYKqgRGZcXteG7RVJe0ryBZezOq11ha9C0Lv0siNVBahOXE35Wzoq4c4BDaGpqvhaKN7pjeWLGlQR04ufWekwxiMWAvjmfgAfexBJ7HfbYNZpq__', 'adid': '61_1855', 'adomain': ['chevrolet.com.ar'], 'price': 2, 'w': 320, 'iurl': 'https://daf37cpxaja7f.cloudfront.net/c61/creative_url_14922301369663_1.png', 'cat': ['IAB2'], 'id': '7f570b40-aca1-4806-8ea8-818ea679c82b_0', 'attr': [], 'impid': '0', 'cid': '61'}]}], 'bidid': '7f570b40-aca1-4806-8ea8-818ea679c82b'}
- const bidResponseVid = spec.interpretResponse({ body: serverResponseVid }, advangelistsbidreqVid);
- delete bidResponseVid['vastUrl'];
- delete bidResponseVid['ad'];
- expect(bidResponseVid).to.deep.equal({
- requestId: bidRequestsVid[0].bidId,
- bidderCode: 'advangelists',
- creativeId: serverResponseVid.seatbid[0].bid[0].crid,
- cpm: serverResponseVid.seatbid[0].bid[0].price,
- width: serverResponseVid.seatbid[0].bid[0].w,
- height: serverResponseVid.seatbid[0].bid[0].h,
- mediaType: 'video',
- currency: 'USD',
- netRevenue: true,
- ttl: 60
- });
- });
-
- it('should return valid banner bid responses', function () {
- const advangelistsbidreq = {bids: {}};
- bidRequests.forEach(bid => {
- let _mediaTypes = (bid.mediaTypes && bid.mediaTypes.video ? VIDEO : BANNER);
- advangelistsbidreq.bids[bid.bidId] = {mediaTypes: _mediaTypes,
- w: _mediaTypes == BANNER ? bid.mediaTypes[_mediaTypes].sizes[0][0] : bid.mediaTypes[_mediaTypes].playerSize[0],
- h: _mediaTypes == BANNER ? bid.mediaTypes[_mediaTypes].sizes[0][1] : bid.mediaTypes[_mediaTypes].playerSize[1]
-
- };
- });
- const serverResponse = {'id': '2aa73f571eaf29', 'seatbid': [{'bid': [{'id': '2c5e8a1a84522d', 'impid': '2c5e8a1a84522d', 'price': 0.81, 'adid': 'abcde-12345', 'nurl': '', 'adm': '', 'adomain': ['advertiserdomain.com'], 'iurl': '', 'cid': 'campaign1', 'crid': 'abcde-12345', 'w': 300, 'h': 250}], 'seat': '19513bcfca8006'}], 'bidid': '19513bcfca8006', 'cur': 'USD', 'w': 300, 'h': 250};
-
- const bidResponse = spec.interpretResponse({ body: serverResponse }, advangelistsbidreq);
- expect(bidResponse).to.deep.equal({
- requestId: bidRequests[0].bidId,
- ad: serverResponse.seatbid[0].bid[0].adm,
- bidderCode: 'advangelists',
- creativeId: serverResponse.seatbid[0].bid[0].crid,
- cpm: serverResponse.seatbid[0].bid[0].price,
- width: serverResponse.seatbid[0].bid[0].w,
- height: serverResponse.seatbid[0].bid[0].h,
- mediaType: 'banner',
- currency: 'USD',
- netRevenue: true,
- ttl: 60
- });
- });
- });
- });
-});
diff --git a/test/spec/modules/advenueBidAdapter_spec.js b/test/spec/modules/advenueBidAdapter_spec.js
deleted file mode 100644
index 2d7739361b4..00000000000
--- a/test/spec/modules/advenueBidAdapter_spec.js
+++ /dev/null
@@ -1,107 +0,0 @@
-import {expect} from 'chai';
-import {spec} from '../../../modules/advenueBidAdapter.js';
-
-describe('AdvenueAdapter', function () {
- let bid = {
- bidId: '2dd581a2b6281d',
- bidder: 'advenue',
- bidderRequestId: '145e1d6a7837c9',
- params: {
- placementId: 123,
- traffic: 'banner'
- },
- placementCode: 'placement_0',
- auctionId: '74f78609-a92d-4cf1-869f-1b244bbfb5d2',
- sizes: [[300, 250]],
- transactionId: '3bb2f6da-87a6-4029-aeb0-bfe951372e62'
- };
-
- describe('isBidRequestValid', function () {
- it('Should return true when placementId can be cast to a number', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
- });
- it('Should return false when placementId is not a number', function () {
- bid.params.placementId = 'aaa';
- expect(spec.isBidRequestValid(bid)).to.be.false;
- });
- });
-
- describe('buildRequests', function () {
- let serverRequest = spec.buildRequests([bid]);
- it('Creates a ServerRequest object with method, URL and data', function () {
- expect(serverRequest).to.exist;
- expect(serverRequest.method).to.exist;
- expect(serverRequest.url).to.exist;
- expect(serverRequest.data).to.exist;
- });
- it('Returns POST method', function () {
- expect(serverRequest.method).to.equal('POST');
- });
- it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://ssp.advenuemedia.co.uk/?c=o&m=multi');
- });
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'secure', 'host', 'page', 'placements');
- expect(data.deviceWidth).to.be.a('number');
- expect(data.deviceHeight).to.be.a('number');
- expect(data.secure).to.be.within(0, 1);
- expect(data.host).to.be.a('string');
- expect(data.page).to.be.a('string');
- let placements = data['placements'];
- for (let i = 0; i < placements.length; i++) {
- let placement = placements[i];
- expect(placement).to.have.all.keys('placementId', 'bidId', 'traffic', 'sizes');
- expect(placement.placementId).to.be.a('number');
- expect(placement.bidId).to.be.a('string');
- expect(placement.traffic).to.be.a('string');
- expect(placement.sizes).to.be.an('array');
- }
- });
- it('Returns empty data if no valid requests are passed', function () {
- serverRequest = spec.buildRequests([]);
- let data = serverRequest.data;
- expect(data.placements).to.be.an('array').that.is.empty;
- });
- });
- describe('interpretResponse', function () {
- let resObject = {
- body: [ {
- requestId: '123',
- mediaType: 'banner',
- cpm: 0.3,
- width: 320,
- height: 50,
- ad: 'Hello ad ',
- ttl: 1000,
- creativeId: '123asd',
- netRevenue: true,
- currency: 'USD'
- } ]
- };
- let serverResponses = spec.interpretResponse(resObject);
- it('Returns an array of valid server responses if response object is valid', function () {
- expect(serverResponses).to.be.an('array').that.is.not.empty;
- for (let i = 0; i < serverResponses.length; i++) {
- let dataItem = serverResponses[i];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'mediaType');
- expect(dataItem.requestId).to.be.a('string');
- expect(dataItem.cpm).to.be.a('number');
- expect(dataItem.width).to.be.a('number');
- expect(dataItem.height).to.be.a('number');
- expect(dataItem.ad).to.be.a('string');
- expect(dataItem.ttl).to.be.a('number');
- expect(dataItem.creativeId).to.be.a('string');
- expect(dataItem.netRevenue).to.be.a('boolean');
- expect(dataItem.currency).to.be.a('string');
- expect(dataItem.mediaType).to.be.a('string');
- }
- it('Returns an empty array if invalid response is passed', function () {
- serverResponses = spec.interpretResponse('invalid_response');
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- });
- });
-});
diff --git a/test/spec/modules/advertlyBidAdapter_spec.js b/test/spec/modules/advertlyBidAdapter_spec.js
deleted file mode 100755
index 7825f11948a..00000000000
--- a/test/spec/modules/advertlyBidAdapter_spec.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/advertlyBidAdapter.js';
-
-const ENDPOINT = 'https://api.advertly.com/www/admin/plugins/Prebid/getAd.php';
-
-describe('The Advertly bidding adapter', function () {
- describe('isBidRequestValid', function () {
- it('should return false when given an invalid bid', function () {
- const bid = {
- bidder: 'advertly',
- };
- const isValid = spec.isBidRequestValid(bid);
- expect(isValid).to.equal(false);
- });
-
- it('should return true when given a publisherId in bid', function () {
- const bid = {
- bidder: 'advertly',
- params: {
- publisherId: 2
- },
- };
- const isValid = spec.isBidRequestValid(bid);
- expect(isValid).to.equal(true);
- });
- });
-
- describe('buildRequests', function () {
- const bidRequests = [{
- 'bidder': 'advertly',
- 'params': {
- 'publisherId': 2
- },
- 'adUnitCode': 'adunit-code',
- 'sizes': [
- [300, 250],
- [300, 600]
- ]
- }];
-
- const request = spec.buildRequests(bidRequests);
-
- it('sends bid request to our endpoint via POST', function () {
- expect(request.method).to.equal('POST');
- });
-
- it('check endpoint url', function () {
- expect(request.url).to.equal(ENDPOINT)
- });
-
- it('sets the proper banner object', function () {
- expect(bidRequests[0].params.publisherId).to.equal(2);
- })
- });
- const response = {
- body: [
- {
- 'requestId': '2ee937f15015c6',
- 'cpm': '0.2000',
- 'width': 300,
- 'height': 600,
- 'creativeId': '4',
- 'currency': 'USD',
- 'netRevenue': true,
- 'ad': 'ads.html',
- 'mediaType': 'banner'
- },
- {
- 'requestId': '3e1af92622bdc',
- 'cpm': '0.2000',
- 'creativeId': '4',
- 'context': 'outstream',
- 'currency': 'USD',
- 'netRevenue': true,
- 'vastUrl': 'tezt.xml',
- 'width': 640,
- 'height': 480,
- 'mediaType': 'video'
- }]
- };
-
- const request = [
- {
- 'bidder': 'advertly',
- 'params': {
- 'publisherId': 2
- },
- 'mediaTypes': {
- 'banner': {
- 'sizes': [
- [300, 600]
- ]
- }
- },
- 'bidId': '2ee937f15015c6',
- 'src': 'client',
- },
- {
- 'bidder': 'advertly',
- 'params': {
- 'publisherId': 2
- },
- 'mediaTypes': {
- 'video': {
- 'context': 'outstream',
- 'playerSize': [
- [640, 480]
- ]
- }
- },
- 'bidId': '3e1af92622bdc',
- 'src': 'client',
- }
- ];
-
- describe('interpretResponse', function () {
- it('return empty array when no ad found', function () {
- const response = {};
- const request = { bidRequests: [] };
- const bids = spec.interpretResponse(response, request);
- expect(bids).to.have.lengthOf(0);
- });
-
- it('check response for banner and video', function () {
- const bids = spec.interpretResponse(response, request);
- expect(bids).to.have.lengthOf(2);
- expect(bids[0].requestId).to.equal('2ee937f15015c6');
- expect(bids[0].cpm).to.equal('0.2000');
- expect(bids[1].cpm).to.equal('0.2000');
- expect(bids[0].width).to.equal(300);
- expect(bids[0].height).to.equal(600);
- expect(bids[1].vastUrl).to.not.equal('');
- expect(bids[0].ad).to.not.equal('');
- expect(bids[1].adResponse).to.not.equal('');
- expect(bids[1].renderer).not.to.be.an('undefined');
- });
- });
-
- describe('On winning bid', function () {
- const bids = spec.interpretResponse(response, request);
- spec.onBidWon(bids);
- });
-
- describe('On bid Time out', function () {
- const bids = spec.interpretResponse(response, request);
- spec.onTimeout(bids);
- });
-
- describe('user sync', function () {
- it('to check the user sync iframe', function () {
- let syncs = spec.getUserSyncs({
- iframeEnabled: true
- });
- expect(syncs).to.not.be.an('undefined');
- expect(syncs).to.have.lengthOf(1);
- expect(syncs[0].type).to.equal('iframe');
- });
- });
-});
diff --git a/test/spec/modules/adyoulikeBidAdapter_spec.js b/test/spec/modules/adyoulikeBidAdapter_spec.js
index abf8793865c..befc95e5f24 100644
--- a/test/spec/modules/adyoulikeBidAdapter_spec.js
+++ b/test/spec/modules/adyoulikeBidAdapter_spec.js
@@ -158,6 +158,17 @@ describe('Adyoulike Adapter', function () {
}
};
+ const sentBidVideo = {
+ 'bid_id_0': {
+ 'PlacementID': 'e622af275681965d3095808561a1e510',
+ 'TransactionID': 'e8355240-d976-4cd5-a493-640656fe08e8',
+ 'AvailableSizes': '',
+ 'Video': {
+ playerSize: [640, 480]
+ }
+ }
+ };
+
const sentNativeImageType = {
'additional': {
'sent': [
@@ -290,6 +301,18 @@ describe('Adyoulike Adapter', function () {
'Placement': 'placement_0'
}
];
+
+ const testMetaObject = {
+ 'networkId': 123,
+ 'advertiserId': '3',
+ 'advertiserName': 'foobar',
+ 'advertiserDomains': ['foobar.com'],
+ 'brandId': '345',
+ 'brandName': 'Foo',
+ 'primaryCatId': '34',
+ 'secondaryCatIds': ['IAB-222', 'IAB-333'],
+ 'mediaType': 'banner'
+ };
const admSample = "\u003cscript id=\"ayl-prebid-a11a121205932e75e622af275681965d\"\u003e\n(function(){\n\twindow.isPrebid = true\n\tvar prebidResults = /*PREBID*/{\"OnEvents\":{\"CLICK\":[{\"Kind\":\"PIXEL_URL\",\"Url\":\"https://testPixelCLICK.com/fake\"}],\"IMPRESSION\":[{\"Kind\":\"PIXEL_URL\",\"Url\":\"https://testPixelIMP.com/fake\"},{\"Kind\":\"JAVASCRIPT_URL\",\"Url\":\"https://testJsIMP.com/fake.js\"}]},\"Disabled\":false,\"Attempt\":\"a11a121205932e75e622af275681965d\",\"ApiPrefix\":\"https://fo-api.omnitagjs.com/fo-api\",\"TrackingPrefix\":\"https://tracking.omnitagjs.com/tracking\",\"DynamicPrefix\":\"https://tag-dyn.omnitagjs.com/fo-dyn\",\"StaticPrefix\":\"https://fo-static.omnitagjs.com/fo-static\",\"BlobPrefix\":\"https://fo-api.omnitagjs.com/fo-api/blobs\",\"SspPrefix\":\"https://fo-ssp.omnitagjs.com/fo-ssp\",\"VisitorPrefix\":\"https://visitor.omnitagjs.com/visitor\",\"Trusted\":true,\"Placement\":\"e622af275681965d3095808561a1e510\",\"PlacementAccess\":\"ALL\",\"Site\":\"6e2df7a92203c3c7a25561ed63f25a27\",\"Lang\":\"EN\",\"SiteLogo\":null,\"HasSponsorImage\":false,\"ResizeIframe\":true,\"IntegrationConfig\":{\"Kind\":\"WIDGET\",\"Widget\":{\"ExtraStyleSheet\":\"\",\"Placeholders\":{\"Body\":{\"Color\":{\"R\":77,\"G\":21,\"B\":82,\"A\":100},\"BackgroundColor\":{\"R\":255,\"G\":255,\"B\":255,\"A\":100},\"FontFamily\":\"Lato\",\"Width\":\"100%\",\"Align\":\"\",\"BoxShadow\":true},\"CallToAction\":{\"Color\":{\"R\":26,\"G\":157,\"B\":212,\"A\":100}},\"Description\":{\"Length\":130},\"Image\":{\"Width\":600,\"Height\":600,\"Lowres\":false,\"Raw\":false},\"Size\":{\"Height\":\"250px\",\"Width\":\"300px\"},\"Sponsor\":{\"Color\":{\"R\":35,\"G\":35,\"B\":35,\"A\":100},\"Label\":true,\"WithoutLogo\":false},\"Title\":{\"Color\":{\"R\":219,\"G\":181,\"B\":255,\"A\":100}}},\"Selector\":{\"Kind\":\"CSS\",\"Css\":\"#ayl-prebid-a11a121205932e75e622af275681965d\"},\"Insertion\":\"AFTER\",\"ClickFormat\":true,\"Creative20\":true,\"WidgetKind\":\"CREATIVE_TEMPLATE_4\"}},\"Legal\":\"Sponsored\",\"ForcedCampaign\":\"f1c80d4bb5643c222ae8de75e9b2f991\",\"ForcedTrack\":\"\",\"ForcedCreative\":\"\",\"ForcedSource\":\"\",\"DisplayMode\":\"DEFAULT\",\"Campaign\":\"f1c80d4bb5643c222ae8de75e9b2f991\",\"CampaignAccess\":\"ALL\",\"CampaignKind\":\"AD_TRAFFIC\",\"DataSource\":\"LOCAL\",\"DataSourceUrl\":\"\",\"DataSourceOnEventsIsolated\":false,\"DataSourceWithoutCookie\":false,\"Content\":{\"Preview\":{\"Thumbnail\":{\"Image\":{\"Kind\":\"EXTERNAL\",\"Data\":{\"External\":{\"Url\":\"https://tag-dyn.omnitagjs.com/fo-dyn/native/preview/image?key=fd4362d35bb174d6f1c80d4bb5643c22\\u0026kind=INTERNAL\\u0026ztop=0.000000\\u0026zleft=0.000000\\u0026zwidth=0.333333\\u0026zheight=1.000000\\u0026width=[width]\\u0026height=[height]\"}},\"ZoneTop\":0,\"ZoneLeft\":0,\"ZoneWidth\":1,\"ZoneHeight\":1,\"Smart\":false,\"NoTransform\":false,\"Quality\":\"NORMAL\"}},\"Text\":{\"CALLTOACTION\":\"Click here to learn more\",\"DESCRIPTION\":\"Considérant l'extrémité conjoncturelle, il serait bon d'anticiper toutes les voies de bon sens.\",\"SPONSOR\":\"Tested by\",\"TITLE\":\"Adserver Traffic Redirect Internal\"},\"Sponsor\":{\"Name\":\"QA Team\"},\"Credit\":{\"Logo\":{\"Resource\":{\"Kind\":\"EXTERNAL\",\"Data\":{\"External\":{\"Url\":\"https://fo-static.omnitagjs.com/fo-static/native/images/info-ayl.png\"}},\"ZoneTop\":0,\"ZoneLeft\":0,\"ZoneWidth\":1,\"ZoneHeight\":1,\"Smart\":false,\"NoTransform\":false,\"Quality\":\"NORMAL\"}},\"Url\":\"https://blobs.omnitagjs.com/adchoice/\"}},\"Landing\":{\"Url\":\"https://www.w3.org/People/mimasa/test/xhtml/entities/entities-11.xhtml#lat1\",\"LegacyTracking\":false},\"ViewButtons\":{\"Close\":{\"Skip\":6000}},\"InternalContentFields\":{\"AnimatedImage\":false}},\"AdDomain\":\"adyoulike.com\",\"Opener\":\"REDIRECT\",\"PerformUITriggers\":[\"CLICK\"],\"RedirectionTarget\":\"TAB\"}/*PREBID*/;\n\tvar insertAds = function insertAds() {\insertAds();\n\t}\n})();\n\u003c/script\u003e";
const responseWithSinglePlacement = [
{
@@ -298,6 +321,7 @@ describe('Adyoulike Adapter', function () {
'Ad': admSample,
'Price': 0.5,
'Height': 600,
+ 'Meta': testMetaObject
}
];
@@ -365,7 +389,30 @@ describe('Adyoulike Adapter', function () {
privacyLink: 'https://blobs.omnitagjs.com/adchoice/',
sponsoredBy: 'QA Team',
title: 'Adserver Traffic Redirect Internal',
- }
+ },
+ meta: testMetaObject
+ }];
+
+ const responseWithSingleVideo = [{
+ 'BidID': 'bid_id_0',
+ 'Placement': 'placement_0',
+ 'Vast': 'PFZBU1Q+RW1wdHkgc2FtcGxlPC92YXN0Pg==',
+ 'Price': 0.5,
+ 'Height': 600,
+ }];
+
+ const videoResult = [{
+ cpm: 0.5,
+ creativeId: undefined,
+ currency: 'USD',
+ netRevenue: true,
+ requestId: 'bid_id_0',
+ ttl: 3600,
+ mediaType: 'video',
+ meta: {
+ advertiserDomains: []
+ },
+ vastXml: 'Empty sample '
}];
const responseWithMultiplePlacements = [
@@ -408,6 +455,17 @@ describe('Adyoulike Adapter', function () {
'transactionId': 'bid_id_1_transaction_id'
};
+ let bidWSize = {
+ 'bidId': 'bid_id_1',
+ 'bidder': 'adyoulike',
+ 'placementCode': 'adunit/hb-1',
+ 'params': {
+ 'placement': 'placement_1',
+ 'size': [250, 300],
+ },
+ 'transactionId': 'bid_id_1_transaction_id'
+ };
+
let nativeBid = {
'bidId': 'bid_id_1',
'bidder': 'adyoulike',
@@ -427,6 +485,10 @@ describe('Adyoulike Adapter', function () {
expect(!!spec.isBidRequestValid(bid)).to.equal(true);
});
+ it('should return true when required params found with size in bid params', function () {
+ expect(!!spec.isBidRequestValid(bidWSize)).to.equal(true);
+ });
+
it('should return true when required params found for native ad', function () {
expect(!!spec.isBidRequestValid(nativeBid)).to.equal(true);
});
@@ -617,6 +679,7 @@ describe('Adyoulike Adapter', function () {
expect(result[0].ad).to.equal(admSample);
expect(result[0].width).to.equal(300);
expect(result[0].height).to.equal(600);
+ expect(result[0].meta).to.deep.equal(testMetaObject);
});
it('receive reponse with multiple placement', function () {
@@ -636,8 +699,8 @@ describe('Adyoulike Adapter', function () {
expect(result[1].height).to.equal(250);
});
- it('receive reponse with Native ad', function () {
- serverResponse.body = responseWithSingleNative;
+ it('receive reponse with Native from ad markup', function () {
+ serverResponse.body = responseWithSinglePlacement;
let result = spec.interpretResponse(serverResponse, {data: '{"Bids":' + JSON.stringify(sentBidNative) + '}'});
expect(result.length).to.equal(1);
@@ -645,13 +708,27 @@ describe('Adyoulike Adapter', function () {
expect(result).to.deep.equal(nativeResult);
});
- it('receive reponse with Native from ad markup', function () {
- serverResponse.body = responseWithSinglePlacement;
+ it('receive reponse with Native ad', function () {
+ serverResponse.body = responseWithSingleNative;
let result = spec.interpretResponse(serverResponse, {data: '{"Bids":' + JSON.stringify(sentBidNative) + '}'});
expect(result.length).to.equal(1);
- expect(result).to.deep.equal(nativeResult);
+ const noMeta = [...nativeResult];
+ const metaBackup = noMeta[0].meta;
+
+ // this test should return default meta object
+ noMeta[0].meta = { advertiserDomains: [] };
+
+ expect(result).to.deep.equal(noMeta);
+ });
+
+ it('receive Vast reponse with Video ad', function () {
+ serverResponse.body = responseWithSingleVideo;
+ let result = spec.interpretResponse(serverResponse, {data: '{"Bids":' + JSON.stringify(sentBidVideo) + '}'});
+
+ expect(result.length).to.equal(1);
+ expect(result).to.deep.equal(videoResult);
});
});
});
diff --git a/test/spec/modules/ajaBidAdapter_spec.js b/test/spec/modules/ajaBidAdapter_spec.js
index 80ecab764e8..addf6a0a409 100644
--- a/test/spec/modules/ajaBidAdapter_spec.js
+++ b/test/spec/modules/ajaBidAdapter_spec.js
@@ -79,7 +79,10 @@ describe('AjaAdapter', function () {
'imps': [
'https://as.amanad.adtdp.com/v1/imp'
]
- }
+ },
+ 'adomain': [
+ 'www.example.com'
+ ]
},
'syncs': [
'https://example.com'
@@ -98,7 +101,12 @@ describe('AjaAdapter', function () {
'mediaType': 'banner',
'currency': 'USD',
'ttl': 300,
- 'netRevenue': true
+ 'netRevenue': true,
+ 'meta': {
+ 'advertiserDomains': [
+ 'www.example.com'
+ ]
+ }
}
];
@@ -218,7 +226,10 @@ describe('AjaAdapter', function () {
'impressionTrackers': [
'https://example.com/imp'
],
- 'privacyLink': 'https://aja-kk.co.jp/optout',
+ 'privacyLink': 'https://aja-kk.co.jp/optout'
+ },
+ 'meta': {
+ 'advertiserDomains': []
}
}
];
diff --git a/test/spec/modules/akamaiDAPIdSystem_spec.js b/test/spec/modules/akamaiDAPIdSystem_spec.js
new file mode 100644
index 00000000000..e44285eda34
--- /dev/null
+++ b/test/spec/modules/akamaiDAPIdSystem_spec.js
@@ -0,0 +1,117 @@
+import {akamaiDAPIdSubmodule} from 'modules/akamaiDAPIdSystem.js';
+import * as utils from 'src/utils.js';
+import {server} from 'test/mocks/xhr.js';
+import {getStorageManager} from '../../../src/storageManager.js';
+
+export const storage = getStorageManager();
+
+const signatureConfigParams = {params: {
+ apiHostname: 'prebid.dap.akadns.net',
+ domain: 'prebid.org',
+ type: 'dap-signature:1.0.0',
+ apiVersion: 'v1'
+}};
+
+const tokenizeConfigParams = {params: {
+ apiHostname: 'prebid.dap.akadns.net',
+ domain: 'prebid.org',
+ type: 'email',
+ identity: 'amishra@xyz.com',
+ apiVersion: 'v1'
+}};
+
+const x1TokenizeConfigParams = {params: {
+ apiHostname: 'prebid.dap.akadns.net',
+ domain: 'prebid.org',
+ type: 'email',
+ identity: 'amishra@xyz.com',
+ apiVersion: 'x1',
+ attributes: '{ "cohorts": [ "3:14400", "5:14400", "7:0" ],"first_name": "Ace","last_name": "McCool" }'
+}};
+
+const consentData = {
+ gdprApplies: true,
+ consentString: 'BOkIpDSOkIpDSADABAENCc-AAAApOAFAAMAAsAMIAcAA_g'
+};
+
+const responseHeader = {'Content-Type': 'application/json'}
+
+const TEST_ID = '51sd61e3-sd82-4vea-8387-093dffca4a3a';
+
+describe('akamaiDAPId getId', function () {
+ let logErrorStub;
+
+ beforeEach(function () {
+ logErrorStub = sinon.stub(utils, 'logError');
+ });
+
+ afterEach(function () {
+ logErrorStub.restore();
+ });
+
+ describe('decode', function () {
+ it('should respond with an object with dapId containing the value', () => {
+ expect(akamaiDAPIdSubmodule.decode(TEST_ID)).to.deep.equal({
+ dapId: TEST_ID
+ });
+ });
+ });
+
+ describe('getId', function () {
+ it('should log an error if no configParams were passed when getId', function () {
+ akamaiDAPIdSubmodule.getId(null);
+ expect(logErrorStub.calledOnce).to.be.true;
+ });
+
+ it('should log an error if configParams were passed without apihostname', function () {
+ akamaiDAPIdSubmodule.getId({ params: {
+ domain: 'prebid.org',
+ type: 'dap-signature:1.0.0'
+ } });
+ expect(logErrorStub.calledOnce).to.be.true;
+ });
+
+ it('should log an error if configParams were passed without domain', function () {
+ akamaiDAPIdSubmodule.getId({ params: {
+ apiHostname: 'prebid.dap.akadns.net',
+ type: 'dap-signature:1.0.0'
+ } });
+ expect(logErrorStub.calledOnce).to.be.true;
+ });
+
+ it('should log an error if configParams were passed without type', function () {
+ akamaiDAPIdSubmodule.getId({ params: {
+ apiHostname: 'prebid.dap.akadns.net',
+ domain: 'prebid.org'
+ } });
+ expect(logErrorStub.calledOnce).to.be.true;
+ });
+
+ it('akamaiDAPId submobile requires consent string to call API', function () {
+ let consentData = {
+ gdprApplies: true,
+ consentString: ''
+ };
+ let submoduleCallback = akamaiDAPIdSubmodule.getId(signatureConfigParams, consentData);
+ expect(submoduleCallback).to.be.undefined;
+ });
+
+ it('should call the signature v1 API and store token in Local storage', function () {
+ let submoduleCallback1 = akamaiDAPIdSubmodule.getId(signatureConfigParams, consentData).id;
+ expect(submoduleCallback1).to.be.eq(storage.getDataFromLocalStorage('akamai_dap_token'))
+ storage.removeDataFromLocalStorage('akamai_dap_token');
+ });
+
+ it('should call the tokenize v1 API and store token in Local storage', function () {
+ let submoduleCallback = akamaiDAPIdSubmodule.getId(tokenizeConfigParams, consentData).id;
+ expect(submoduleCallback).to.be.eq(storage.getDataFromLocalStorage('akamai_dap_token'))
+ storage.removeDataFromLocalStorage('akamai_dap_token');
+ });
+
+ it('should call the tokenize x1 API and store token in Local storage', function () {
+ let submoduleCallback = akamaiDAPIdSubmodule.getId(x1TokenizeConfigParams, consentData).id;
+ expect(submoduleCallback).to.be.eq(storage.getDataFromLocalStorage('akamai_dap_token'))
+ storage.removeDataFromLocalStorage('akamai_dap_token');
+ });
+ });
+});
diff --git a/test/spec/modules/amxIdSystem_spec.js b/test/spec/modules/amxIdSystem_spec.js
new file mode 100644
index 00000000000..dea79e87baa
--- /dev/null
+++ b/test/spec/modules/amxIdSystem_spec.js
@@ -0,0 +1,202 @@
+import { amxIdSubmodule } from 'modules/amxIdSystem.js';
+import { server } from 'test/mocks/xhr.js';
+import * as utils from 'src/utils.js';
+
+const TEST_ID = '51b561e3-0d82-4aea-8487-093fffca4a3a';
+const ERROR_CODES = [404, 501, 500, 403];
+
+const config = {
+ params: {
+ tagId: Math.floor(Math.random() * 9e9).toString(36),
+ },
+ storage: {
+ type: 'html5',
+ },
+};
+
+describe('amxid submodule', () => {
+ it('should expose a "name" property containing amxId', () => {
+ expect(amxIdSubmodule.name).to.equal('amxId');
+ });
+
+ it('should expose a "gvlid" property containing the GVL ID 737', () => {
+ expect(amxIdSubmodule.gvlid).to.equal(737);
+ });
+});
+
+describe('decode', () => {
+ it('should respond with an object with "amxId" key containing the value', () => {
+ expect(amxIdSubmodule.decode(TEST_ID)).to.deep.equal({
+ amxId: TEST_ID
+ });
+ });
+
+ it('should respond with undefined if the value is not a string', () => {
+ [1, null, undefined, NaN, [], {}].forEach((value) => {
+ expect(amxIdSubmodule.decode(value)).to.equal(undefined);
+ });
+ });
+});
+
+describe('validateConfig', () => {
+ let logErrorSpy;
+
+ beforeEach(() => {
+ logErrorSpy = sinon.spy(utils, 'logError');
+ });
+ afterEach(() => {
+ logErrorSpy.restore();
+ });
+
+ it('should return undefined if config.storage is not present', () => {
+ expect(
+ amxIdSubmodule.getId(
+ {
+ ...config,
+ storage: null,
+ },
+ null,
+ null
+ )
+ ).to.equal(undefined);
+
+ expect(logErrorSpy.calledOnce).to.be.true;
+ expect(logErrorSpy.lastCall.lastArg).to.contain('storage is required');
+ });
+
+ it('should return undefined if config.storage.type !== "html5"', () => {
+ expect(
+ amxIdSubmodule.getId(
+ {
+ ...config,
+ storage: {
+ type: 'cookie',
+ },
+ },
+ null,
+ null
+ )
+ ).to.equal(undefined);
+
+ expect(logErrorSpy.calledOnce).to.be.true;
+ expect(logErrorSpy.lastCall.lastArg).to.contain('cookie');
+ });
+
+ it('should return undefined if expires > 30', () => {
+ const expires = Math.floor(Math.random() * 90) + 30.01;
+ expect(
+ amxIdSubmodule.getId(
+ {
+ ...config,
+ storage: {
+ type: 'html5',
+ expires,
+ },
+ },
+ null,
+ null
+ )
+ ).to.equal(undefined);
+
+ expect(logErrorSpy.calledOnce).to.be.true;
+ expect(logErrorSpy.lastCall.lastArg).to.contain(expires);
+ });
+});
+
+describe('getId', () => {
+ const spy = sinon.spy();
+
+ beforeEach(() => {
+ spy.resetHistory();
+ });
+
+ it('should call the sync endpoint and accept a valid response', () => {
+ const { callback } = amxIdSubmodule.getId(config, null, null);
+ callback(spy);
+
+ const [request] = server.requests;
+ expect(request.method).to.equal('GET');
+
+ request.respond(
+ 200,
+ {},
+ JSON.stringify({
+ id: TEST_ID,
+ v: '1.0a',
+ })
+ );
+
+ expect(spy.calledOnce).to.be.true;
+ expect(spy.lastCall.lastArg).to.equal(TEST_ID);
+ });
+
+ it('should return undefined if the server has an error status code', () => {
+ const { callback } = amxIdSubmodule.getId(config, null, null);
+ callback(spy);
+
+ const [request] = server.requests;
+ const responseCode =
+ ERROR_CODES[Math.floor(Math.random() * ERROR_CODES.length)];
+ request.respond(responseCode, {}, '');
+
+ expect(spy.calledOnce).to.be.true;
+ expect(spy.lastCall.lastArg).to.equal(undefined);
+ });
+
+ it('should return undefined if the response has invalid keys', () => {
+ const { callback } = amxIdSubmodule.getId(config, null, null);
+ callback(spy);
+
+ const [request] = server.requests;
+ request.respond(
+ 200,
+ {},
+ JSON.stringify({
+ test: TEST_ID,
+ })
+ );
+
+ expect(spy.calledOnce).to.be.true;
+ expect(spy.lastCall.lastArg).to.equal(undefined);
+ });
+
+ it('should returned undefined if the server JSON is invalid', () => {
+ const { callback } = amxIdSubmodule.getId(config, null, null);
+ callback(spy);
+
+ const [request] = server.requests;
+ request.respond(200, {}, '{,,}');
+
+ expect(spy.calledOnce).to.be.true;
+ expect(spy.lastCall.lastArg).to.equal(undefined);
+ });
+
+ it('should use the intermediate value for the sync server', () => {
+ const { callback } = amxIdSubmodule.getId(config, null, null);
+ callback(spy);
+
+ const [request] = server.requests;
+ const intermediateValue = 'https://example-publisher.com/api/sync';
+
+ request.respond(
+ 200,
+ {},
+ JSON.stringify({
+ u: intermediateValue,
+ })
+ );
+
+ const [, secondRequest] = server.requests;
+ expect(secondRequest.url).to.be.equal(intermediateValue);
+ secondRequest.respond(
+ 200,
+ {},
+ JSON.stringify({
+ id: TEST_ID,
+ })
+ );
+
+ expect(spy.calledOnce).to.be.true;
+ expect(spy.lastCall.lastArg).to.equal(TEST_ID);
+ });
+});
diff --git a/test/spec/modules/aniviewBidAdapter_spec.js b/test/spec/modules/aniviewBidAdapter_spec.js
index b6d63fc2a8e..a9498af046c 100644
--- a/test/spec/modules/aniviewBidAdapter_spec.js
+++ b/test/spec/modules/aniviewBidAdapter_spec.js
@@ -204,6 +204,29 @@ describe('ANIVIEW Bid Adapter Test', function () {
expect(bidResponse.renderer.loaded).to.equal(false)
expect(bidResponse.width).to.equal(640)
expect(bidResponse.height).to.equal(480)
+ });
+
+ it('Support banner format', function () {
+ const bidRequest = spec.buildRequests([
+ {
+ bidId: '253dcb69fb2577',
+ params: {
+ playerDomain: 'example.com',
+ AV_PUBLISHERID: '55b78633181f4603178b4568',
+ AV_CHANNELID: '55b7904d181f46410f8b4568'
+ },
+ mediaTypes: {
+ banner: {
+ sizes: [[640, 480]],
+ }
+ }
+ }
+ ])[0]
+ const bidResponse = spec.interpretResponse(serverResponse, bidRequest)[0]
+
+ expect(bidResponse.ad).to.have.string('https://example.com/script/6.1/prebidRenderer.js');
+ expect(bidResponse.width).to.equal(640)
+ expect(bidResponse.height).to.equal(480)
})
});
diff --git a/test/spec/modules/apacdexBidAdapter_spec.js b/test/spec/modules/apacdexBidAdapter_spec.js
index 5f6a935c453..527d16159bb 100644
--- a/test/spec/modules/apacdexBidAdapter_spec.js
+++ b/test/spec/modules/apacdexBidAdapter_spec.js
@@ -219,15 +219,6 @@ describe('ApacdexBidAdapter', function () {
'id': '2ae366c2-2576-45e5-bd21-72ed10598f17',
'atype': 1
}]
- }, {
- 'source': 'sharedid.org',
- 'uids': [{
- 'id': '01EZXQDVAPER4KE1VBS29XKV4Z',
- 'atype': 1,
- 'ext': {
- 'third': '01EZXQDVAPER4KE1VBS29XKV4Z'
- }
- }]
}],
},
{
diff --git a/test/spec/modules/appnexusBidAdapter_spec.js b/test/spec/modules/appnexusBidAdapter_spec.js
index 4baecdd1ba8..9396c1e1928 100644
--- a/test/spec/modules/appnexusBidAdapter_spec.js
+++ b/test/spec/modules/appnexusBidAdapter_spec.js
@@ -215,6 +215,40 @@ describe('AppNexusAdapter', function () {
expect(payload.tags[0].hb_source).to.deep.equal(1);
});
+ it('should include ORTB video values when video params were not set', function() {
+ let bidRequest = deepClone(bidRequests[0]);
+ bidRequest.params = {
+ placementId: '1234235',
+ video: {
+ skippable: true,
+ playback_method: ['auto_play_sound_off', 'auto_play_sound_unknown'],
+ context: 'outstream'
+ }
+ };
+ bidRequest.mediaTypes = {
+ video: {
+ playerSize: [640, 480],
+ context: 'outstream',
+ mimes: ['video/mp4'],
+ skip: 0,
+ minduration: 5,
+ api: [1, 5, 6],
+ playbackmethod: [2, 4]
+ }
+ };
+
+ const request = spec.buildRequests([bidRequest]);
+ const payload = JSON.parse(request.data);
+
+ expect(payload.tags[0].video).to.deep.equal({
+ minduration: 5,
+ playback_method: 2,
+ skippable: true,
+ context: 4
+ });
+ expect(payload.tags[0].video_frameworks).to.deep.equal([1, 4])
+ });
+
it('should add video property when adUnit includes a renderer', function () {
const videoData = {
mediaTypes: {
@@ -679,7 +713,8 @@ describe('AppNexusAdapter', function () {
'timeout': 3000,
'gdprConsent': {
consentString: consentString,
- gdprApplies: true
+ gdprApplies: true,
+ addtlConsent: '1~7.12.35.62.66.70.89.93.108'
}
};
bidderRequest.bids = bidRequests;
@@ -691,6 +726,7 @@ describe('AppNexusAdapter', function () {
expect(payload.gdpr_consent).to.exist;
expect(payload.gdpr_consent.consent_string).to.exist.and.to.equal(consentString);
expect(payload.gdpr_consent.consent_required).to.exist.and.to.be.true;
+ expect(payload.gdpr_consent.addtl_consent).to.exist.and.to.deep.equal([7, 12, 35, 62, 66, 70, 89, 93, 108]);
});
it('should add us privacy string to payload', function() {
diff --git a/test/spec/modules/asoBidAdapter_spec.js b/test/spec/modules/asoBidAdapter_spec.js
new file mode 100644
index 00000000000..0dc779a300d
--- /dev/null
+++ b/test/spec/modules/asoBidAdapter_spec.js
@@ -0,0 +1,340 @@
+import {expect} from 'chai';
+import {spec} from 'modules/asoBidAdapter.js';
+import {parseUrl} from 'src/utils.js';
+import {BANNER, VIDEO} from 'src/mediaTypes.js';
+
+describe('Adserver.Online bidding adapter', function () {
+ const bannerRequest = {
+ bidder: 'aso',
+ params: {
+ zone: 1,
+ attr: {
+ keywords: ['a', 'b'],
+ tags: ['t1', 't2']
+ }
+ },
+ adUnitCode: 'adunit-banner',
+ mediaTypes: {
+ banner: {
+ sizes: [
+ [300, 250],
+ [240, 400],
+ ]
+ }
+ },
+ bidId: 'bidid1',
+ bidderRequestId: 'bidreq1',
+ auctionId: 'auctionid1',
+ userIdAsEids: [{
+ source: 'src1',
+ uids: [
+ {
+ id: 'id123...'
+ }
+ ]
+ }]
+ };
+
+ const videoRequest = {
+ bidder: 'aso',
+ params: {
+ zone: 2,
+ video: {
+ api: [2],
+ maxduration: 30
+ }
+ },
+ mediaTypes: {
+ video: {
+ context: 'outstream',
+ playerSize: [[640, 480]],
+ protocols: [1, 2],
+ mimes: ['video/mp4'],
+ }
+ },
+ adUnitCode: 'adunit-video',
+ bidId: 'bidid12',
+ bidderRequestId: 'bidreq2',
+ auctionId: 'auctionid12'
+ };
+
+ const bidderRequest = {
+ refererInfo: {
+ numIframes: 0,
+ reachedTop: true,
+ referer: 'https://example.com'
+ }
+ };
+
+ const gdprConsent = {
+ gdprApplies: true,
+ consentString: 'consentString',
+ vendorData: {
+ purpose: {
+ consents: {
+ 1: true,
+ 2: true,
+ 3: false
+ }
+ }
+ }
+ };
+
+ const uspConsent = 'usp_consent';
+
+ describe('isBidRequestValid', function () {
+ it('should return true when required params found in bidVideo', function () {
+ expect(spec.isBidRequestValid(videoRequest)).to.be.true
+ });
+
+ it('should return true when required params found in bidBanner', function () {
+ expect(spec.isBidRequestValid(bannerRequest)).to.be.true
+ });
+
+ it('should return false when required params not found', function () {
+ expect(spec.isBidRequestValid({})).to.be.false;
+ });
+
+ it('should return false when required params are not passed', function () {
+ const bid = Object.assign({}, bannerRequest);
+ delete bid.params;
+ bid.params = {};
+ expect(spec.isBidRequestValid(bid)).to.be.false
+ });
+
+ it('should return false when required zone param not found', function () {
+ const bid = JSON.parse(JSON.stringify(videoRequest));
+ delete bid.params.zone;
+ expect(spec.isBidRequestValid(bid)).to.be.false;
+ });
+ });
+
+ describe('buildRequests', function () {
+ it('creates a valid banner request', function () {
+ bannerRequest.getFloor = () => ({ currency: 'USD', floor: 0.5 });
+
+ const requests = spec.buildRequests([bannerRequest], bidderRequest);
+ expect(requests).to.have.lengthOf(1);
+ const request = requests[0];
+
+ expect(request).to.exist;
+ expect(request.method).to.equal('POST');
+ const parsedRequestUrl = parseUrl(request.url);
+ expect(parsedRequestUrl.hostname).to.equal('srv.aso1.net');
+ expect(parsedRequestUrl.pathname).to.equal('/prebid/bidder');
+
+ const query = parsedRequestUrl.search;
+ expect(query.pbjs).to.equal('$prebid.version$');
+ expect(query.zid).to.equal('1');
+
+ expect(request.data).to.exist;
+
+ const payload = request.data;
+
+ expect(payload.site).to.not.equal(null);
+ expect(payload.site.ref).to.equal('');
+ expect(payload.site.page).to.equal('https://example.com');
+
+ expect(payload.device).to.not.equal(null);
+ expect(payload.device.w).to.equal(window.innerWidth);
+ expect(payload.device.h).to.equal(window.innerHeight);
+
+ expect(payload.imp).to.have.lengthOf(1);
+
+ expect(payload.imp[0].tagid).to.equal('adunit-banner');
+ expect(payload.imp[0].banner).to.not.equal(null);
+ expect(payload.imp[0].banner.w).to.equal(300);
+ expect(payload.imp[0].banner.h).to.equal(250);
+ expect(payload.imp[0].bidfloor).to.equal(0.5);
+ expect(payload.imp[0].bidfloorcur).to.equal('USD');
+ });
+
+ it('creates a valid video request', function () {
+ const requests = spec.buildRequests([videoRequest], bidderRequest);
+ expect(requests).to.have.lengthOf(1);
+ const request = requests[0];
+
+ expect(request).to.exist;
+ expect(request.method).to.equal('POST');
+ const parsedRequestUrl = parseUrl(request.url);
+ expect(parsedRequestUrl.hostname).to.equal('srv.aso1.net');
+ expect(parsedRequestUrl.pathname).to.equal('/prebid/bidder');
+
+ const query = parsedRequestUrl.search;
+ expect(query.pbjs).to.equal('$prebid.version$');
+ expect(query.zid).to.equal('2');
+
+ expect(request.data).to.not.be.empty;
+
+ const payload = request.data;
+
+ expect(payload.site).to.not.equal(null);
+ expect(payload.site.ref).to.equal('');
+ expect(payload.site.page).to.equal('https://example.com');
+
+ expect(payload.device).to.not.equal(null);
+ expect(payload.device.w).to.equal(window.innerWidth);
+ expect(payload.device.h).to.equal(window.innerHeight);
+
+ expect(payload.imp).to.have.lengthOf(1);
+
+ expect(payload.imp[0].tagid).to.equal('adunit-video');
+ expect(payload.imp[0].video).to.not.equal(null);
+ expect(payload.imp[0].video.w).to.equal(640);
+ expect(payload.imp[0].video.h).to.equal(480);
+ expect(payload.imp[0].banner).to.be.undefined;
+ });
+ });
+
+ describe('GDPR/USP compliance', function () {
+ it('should send GDPR/USP consent data if it applies', function () {
+ bidderRequest.gdprConsent = gdprConsent;
+ bidderRequest.uspConsent = uspConsent;
+
+ const requests = spec.buildRequests([bannerRequest], bidderRequest);
+ expect(requests).to.have.lengthOf(1);
+ const request = requests[0];
+
+ expect(request.data).to.not.be.empty;
+
+ const payload = request.data;
+
+ expect(payload.user.ext.consent).to.equal('consentString');
+ expect(payload.regs.ext.us_privacy).to.equal(uspConsent);
+ expect(payload.regs.ext.gdpr).to.equal(1);
+ });
+
+ it('should not send GDPR/USP consent data if it does not apply', function () {
+ bidderRequest.gdprConsent = null;
+ bidderRequest.uspConsent = null;
+
+ const requests = spec.buildRequests([bannerRequest], bidderRequest);
+ expect(requests).to.have.lengthOf(1);
+ const request = requests[0];
+
+ expect(request.data).to.not.be.empty;
+
+ const payload = request.data;
+
+ expect(payload).to.not.have.nested.property('regs.ext.gdpr');
+ expect(payload).to.not.have.nested.property('user.ext.consent');
+ expect(payload).to.not.have.nested.property('regs.ext.us_privacy');
+ });
+ });
+
+ describe('response handler', function () {
+ const bannerResponse = {
+ body: {
+ id: 'auctionid1',
+ bidid: 'bidid1',
+ seatbid: [{
+ bid: [
+ {
+ impid: 'impid1',
+ price: 0.3,
+ crid: 321,
+ adm: '',
+ w: 300,
+ h: 250,
+ adomain: ['example.com'],
+ }
+ ]
+ }],
+ cur: 'USD',
+ ext: {
+ user_syncs: [
+ {
+ url: 'sync_url',
+ type: 'iframe'
+ }
+ ]
+ }
+ },
+ };
+
+ const videoResponse = {
+ body: {
+ id: 'auctionid2',
+ bidid: 'bidid2',
+ seatbid: [{
+ bid: [
+ {
+ impid: 'impid2',
+ price: 0.5,
+ crid: 123,
+ adm: '',
+ adomain: ['example.com'],
+ w: 640,
+ h: 480,
+ }
+ ]
+ }],
+ cur: 'USD'
+ },
+ };
+
+ it('handles banner responses', function () {
+ bannerRequest.bidRequest = {
+ mediaType: BANNER
+ };
+ const result = spec.interpretResponse(bannerResponse, bannerRequest);
+
+ expect(result).to.have.lengthOf(1);
+
+ expect(result[0]).to.exist;
+ expect(result[0].width).to.equal(300);
+ expect(result[0].height).to.equal(250);
+ expect(result[0].mediaType).to.equal(BANNER);
+ expect(result[0].creativeId).to.equal(321);
+ expect(result[0].cpm).to.be.within(0.1, 0.5);
+ expect(result[0].ad).to.equal('');
+ expect(result[0].currency).to.equal('USD');
+ expect(result[0].netRevenue).to.equal(true);
+ expect(result[0].ttl).to.equal(300);
+ expect(result[0].dealId).to.not.exist;
+ expect(result[0].meta.advertiserDomains[0]).to.equal('example.com');
+ });
+
+ it('handles video responses', function () {
+ const request = {
+ bidRequest: videoRequest
+ };
+ request.bidRequest.mediaType = VIDEO;
+
+ const result = spec.interpretResponse(videoResponse, request);
+ expect(result).to.have.lengthOf(1);
+
+ expect(result[0].width).to.equal(640);
+ expect(result[0].height).to.equal(480);
+ expect(result[0].mediaType).to.equal(VIDEO);
+ expect(result[0].creativeId).to.equal(123);
+ expect(result[0].cpm).to.equal(0.5);
+ expect(result[0].vastXml).to.equal('');
+ expect(result[0].renderer).to.be.a('object');
+ expect(result[0].currency).to.equal('USD');
+ expect(result[0].netRevenue).to.equal(true);
+ expect(result[0].ttl).to.equal(300);
+ });
+
+ it('handles empty responses', function () {
+ const response = [];
+ const bidderRequest = {};
+
+ const result = spec.interpretResponse(response, bidderRequest);
+ expect(result.length).to.equal(0);
+ });
+
+ describe('getUserSyncs', function () {
+ const syncOptions = {
+ iframeEnabled: true
+ };
+
+ it('should return iframe sync option', function () {
+ expect(spec.getUserSyncs(syncOptions, [bannerResponse], gdprConsent, uspConsent)[0].type).to.equal('iframe');
+ expect(spec.getUserSyncs(syncOptions, [bannerResponse], gdprConsent, uspConsent)[0].url).to.equal(
+ 'sync_url?gdpr=1&consents_str=consentString&consents=1%2C2&us_privacy=usp_consent&'
+ );
+ });
+ });
+ });
+});
diff --git a/test/spec/modules/atomxBidAdapter_spec.js b/test/spec/modules/atomxBidAdapter_spec.js
deleted file mode 100644
index d798bd6308c..00000000000
--- a/test/spec/modules/atomxBidAdapter_spec.js
+++ /dev/null
@@ -1,119 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/atomxBidAdapter.js';
-
-describe('atomxAdapterTest', function () {
- describe('bidRequestValidity', function () {
- it('bidRequest with id param', function () {
- expect(spec.isBidRequestValid({
- bidder: 'atomx',
- params: {
- id: 1234,
- },
- })).to.equal(true);
- });
-
- it('bidRequest with no id param', function () {
- expect(spec.isBidRequestValid({
- bidder: 'atomx',
- params: {
- },
- })).to.equal(false);
- });
- });
-
- describe('bidRequest', function () {
- const bidRequests = [{
- 'bidder': 'atomx',
- 'params': {
- 'id': '123'
- },
- 'adUnitCode': 'aaa',
- 'transactionId': '1b8389fe-615c-482d-9f1a-177fb8f7d5b0',
- 'sizes': [300, 250],
- 'bidId': '1abgs362e0x48a8',
- 'bidderRequestId': '70deaff71c281d',
- 'auctionId': '5c66da22-426a-4bac-b153-77360bef5337'
- },
- {
- 'bidder': 'atomx',
- 'params': {
- 'id': '456',
- },
- 'adUnitCode': 'bbb',
- 'transactionId': '193995b4-7122-4739-959b-2463282a138b',
- 'sizes': [[800, 600]],
- 'bidId': '22aidtbx5eabd9',
- 'bidderRequestId': '70deaff71c281d',
- 'auctionId': 'e97cafd0-ebfc-4f5c-b7c9-baa0fd335a4a'
- }];
-
- it('bidRequest HTTP method', function () {
- const requests = spec.buildRequests(bidRequests);
- requests.forEach(function(requestItem) {
- expect(requestItem.method).to.equal('GET');
- });
- });
-
- it('bidRequest url', function () {
- const requests = spec.buildRequests(bidRequests);
- requests.forEach(function(requestItem) {
- expect(requestItem.url).to.match(new RegExp('p\\.ato\\.mx/placement'));
- });
- });
-
- it('bidRequest data', function () {
- const requests = spec.buildRequests(bidRequests);
- expect(requests[0].data.id).to.equal('123');
- expect(requests[0].data.size).to.equal('300x250');
- expect(requests[0].data.prebid).to.equal('1abgs362e0x48a8');
- expect(requests[1].data.id).to.equal('456');
- expect(requests[1].data.size).to.equal('800x600');
- expect(requests[1].data.prebid).to.equal('22aidtbx5eabd9');
- });
- });
-
- describe('interpretResponse', function () {
- const bidRequest = {
- 'method': 'GET',
- 'url': 'https://p.ato.mx/placement',
- 'data': {
- 'v': 12,
- 'id': '123',
- 'size': '300x250',
- 'prebid': '22aidtbx5eabd9',
- 'b': 0,
- 'h': '7t3y9',
- 'type': 'javascript',
- 'screen': '800x600x32',
- 'timezone': 0,
- 'domain': 'https://example.com',
- 'r': '',
- }
- };
-
- const bidResponse = {
- body: {
- 'cpm': 0.00009,
- 'width': 300,
- 'height': 250,
- 'url': 'https://atomx.com',
- 'creative_id': 456,
- 'code': '22aidtbx5eabd9',
- },
- headers: {}
- };
-
- it('result is correct', function () {
- const result = spec.interpretResponse(bidResponse, bidRequest);
-
- expect(result[0].requestId).to.equal('22aidtbx5eabd9');
- expect(result[0].cpm).to.equal(0.00009 * 1000);
- expect(result[0].width).to.equal(300);
- expect(result[0].height).to.equal(250);
- expect(result[0].creativeId).to.equal(456);
- expect(result[0].currency).to.equal('USD');
- expect(result[0].ttl).to.equal(60);
- expect(result[0].adUrl).to.equal('https://atomx.com');
- });
- });
-});
diff --git a/test/spec/modules/atsAnalyticsAdapter_spec.js b/test/spec/modules/atsAnalyticsAdapter_spec.js
index 59b9105925a..e2dd4747199 100644
--- a/test/spec/modules/atsAnalyticsAdapter_spec.js
+++ b/test/spec/modules/atsAnalyticsAdapter_spec.js
@@ -21,10 +21,12 @@ describe('ats analytics adapter', function () {
events.getEvents.restore();
atsAnalyticsAdapter.getUserAgent.restore();
atsAnalyticsAdapter.disableAnalytics();
+ Math.random.restore();
});
describe('track', function () {
it('builds and sends request and response data', function () {
+ sinon.stub(Math, 'random').returns(0.99);
sinon.stub(atsAnalyticsAdapter, 'shouldFireRequest').returns(true);
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
let now = new Date();
@@ -156,26 +158,52 @@ describe('ats analytics adapter', function () {
// check that the publisher ID is configured via options
expect(atsAnalyticsAdapter.context.pid).to.equal(initOptions.pid);
+
+ atsAnalyticsAdapter.shouldFireRequest.restore();
})
it('check browser is safari', function () {
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
+ sinon.stub(Math, 'random').returns(0.99);
let browser = parseBrowser();
expect(browser).to.equal('Safari');
})
it('check browser is chrome', function () {
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/80.0.3987.95 Mobile/15E148 Safari/604.1');
+ sinon.stub(Math, 'random').returns(0.99);
let browser = parseBrowser();
expect(browser).to.equal('Chrome');
})
it('check browser is edge', function () {
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.74 Safari/537.36 Edg/79.0.309.43');
+ sinon.stub(Math, 'random').returns(0.99);
let browser = parseBrowser();
expect(browser).to.equal('Microsoft Edge');
})
it('check browser is firefox', function () {
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (iPhone; CPU OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/23.0 Mobile/15E148 Safari/605.1.15');
+ sinon.stub(Math, 'random').returns(0.99);
let browser = parseBrowser();
expect(browser).to.equal('Firefox');
})
+ it('should not fire analytics request if sampling rate is 0', function () {
+ sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
+ sinon.stub(Math, 'random').returns(0.99);
+ let result = atsAnalyticsAdapter.shouldFireRequest(0);
+ expect(result).to.equal(false);
+ })
+ it('should fire analytics request', function () {
+ sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
+ sinon.stub(Math, 'random').returns(0.99);
+ // publisher can try to pass anything they want but we will set sampling rate to 100, which means we will have 1% of requests
+ let result = atsAnalyticsAdapter.shouldFireRequest(10);
+ expect(result).to.equal(true);
+ })
+ it('should not fire analytics request if math random is something other then 0.99', function () {
+ sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
+ sinon.stub(Math, 'random').returns(0.98);
+ // publisher can try to pass anything they want but we will set sampling rate to 100, which means we will have 1% of requests
+ let result = atsAnalyticsAdapter.shouldFireRequest(10);
+ expect(result).to.equal(false);
+ })
})
})
diff --git a/test/spec/modules/audiencerunBidAdapter_spec.js b/test/spec/modules/audiencerunBidAdapter_spec.js
index 826944abaf5..7c1279f5073 100644
--- a/test/spec/modules/audiencerunBidAdapter_spec.js
+++ b/test/spec/modules/audiencerunBidAdapter_spec.js
@@ -10,7 +10,6 @@ const BID_SERVER_RESPONSE = {
{
'bidId': '51ef8751f9aead',
'zoneId': '12345abcde',
- 'adId': '1234',
'crid': '5678',
'cpm': 8.021951999999999999,
'currency': 'USD',
@@ -19,7 +18,8 @@ const BID_SERVER_RESPONSE = {
'isNet': false,
'buying_type': 'rtb',
'syncUrl': 'https://ac.audiencerun.com/f/sync.html',
- 'adm': ''
+ 'adm': '',
+ 'adomain': ['example.com']
}
]
}
@@ -77,7 +77,7 @@ describe('AudienceRun bid adapter tests', function() {
});
describe('buildRequests', function() {
- let bidRequests = [
+ const bidRequests = [
{
'bidder': 'audiencerun',
'bidId': '51ef8751f9aead',
@@ -96,6 +96,7 @@ describe('AudienceRun bid adapter tests', function() {
'bidRequestsCount': 1
}
];
+ const bidRequest = bidRequests[0];
it('sends a valid bid request to ENDPOINT via POST', function() {
const request = spec.buildRequests(bidRequests, {
@@ -156,12 +157,43 @@ describe('AudienceRun bid adapter tests', function() {
expect(payload2.gdpr.consent).to.equal(consentString);
expect(payload2.gdpr.applies).to.equal(false);
});
+
+ it('should use a bidfloor with a 0 value', function() {
+ const bid = Object.assign({}, bidRequest);
+ const request = spec.buildRequests([bid]);
+ const payload = JSON.parse(request.data);
+ expect(payload.bids[0].bidfloor).to.exist.and.to.equal(0);
+ })
+
+ it('should use bidfloor param value', function () {
+ const bid = Object.assign({}, bidRequest, {
+ params: {
+ 'bidfloor': 0.2
+ }
+ })
+ const request = spec.buildRequests([bid]);
+ const payload = JSON.parse(request.data);
+ expect(payload.bids[0].bidfloor).to.exist.and.to.equal(0.2);
+ });
+
+ it('should use floors module value', function () {
+ const bid = Object.assign({}, bidRequest, {
+ params: {
+ 'bidfloor': 0.5
+ }
+ })
+ bid.getFloor = () => {
+ return { floor: 1, currency: 'USD' }
+ }
+ const request = spec.buildRequests([bid]);
+ const payload = JSON.parse(request.data);
+ expect(payload.bids[0].bidfloor).to.exist.and.to.equal(1);
+ });
});
describe('interpretResponse', function () {
const expectedResponse = [{
'requestId': '51ef8751f9aead',
- 'adId': '12345abcde',
'cpm': 8.021951999999999999,
'width': '728',
'height': '90',
@@ -170,7 +202,10 @@ describe('AudienceRun bid adapter tests', function() {
'netRevenue': false,
'ttl': 300,
'ad': '',
- 'mediaType': 'banner'
+ 'mediaType': 'banner',
+ 'meta': {
+ 'advertiserDomains': ['example.com']
+ }
}];
it('should get the correct bid response by display ad', function () {
@@ -178,7 +213,7 @@ describe('AudienceRun bid adapter tests', function() {
expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
});
- it('handles empty bid response', function () {
+ it('should handle empty bid response', function () {
const response = {
body: {}
};
@@ -201,4 +236,10 @@ describe('AudienceRun bid adapter tests', function() {
expect(syncs).to.deep.equal([{type: 'iframe', url: 'https://ac.audiencerun.com/f/sync.html'}])
});
});
+
+ describe('onTimeout', function () {
+ it('should exists and be a function', () => {
+ expect(spec.onTimeout).to.exist.and.to.be.a('function');
+ });
+ });
});
diff --git a/test/spec/modules/avocetBidAdapter_spec.js b/test/spec/modules/avocetBidAdapter_spec.js
deleted file mode 100644
index 2a2f29e48d2..00000000000
--- a/test/spec/modules/avocetBidAdapter_spec.js
+++ /dev/null
@@ -1,167 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/avocetBidAdapter';
-import { newBidder } from 'src/adapters/bidderFactory';
-import { config } from 'src/config';
-
-describe('Avocet adapter', function () {
- beforeEach(function () {
- config.setConfig({
- currency: {
- adServerCurrency: 'USD',
- },
- publisherDomain: 'test.com',
- fpd: {
- some: 'data',
- },
- });
- });
-
- afterEach(function () {
- config.resetConfig();
- });
-
- describe('inherited functions', function () {
- it('exists and is a function', function () {
- const adapter = newBidder(spec);
- expect(adapter.callBids).to.exist.and.to.be.a('function');
- });
- });
-
- describe('isBidRequestValid', function () {
- it('should return false for bid request missing params', () => {
- const invalidBidRequest = {
- bid: {},
- };
- expect(spec.isBidRequestValid(invalidBidRequest)).to.equal(false);
- });
- it('should return false for an invalid type placement param', () => {
- const invalidBidRequest = {
- params: {
- placement: 123,
- },
- };
- expect(spec.isBidRequestValid(invalidBidRequest)).to.equal(false);
- });
- it('should return false for an invalid length placement param', () => {
- const invalidBidRequest = {
- params: {
- placement: '123',
- },
- };
- expect(spec.isBidRequestValid(invalidBidRequest)).to.equal(false);
- });
- it('should return true for a valid length placement param', () => {
- const validBidRequest = {
- params: {
- placement: '012345678901234567890123',
- },
- };
- expect(spec.isBidRequestValid(validBidRequest)).to.equal(true);
- });
- });
- describe('buildRequests', function () {
- it('constructs a valid POST request', function () {
- const request = spec.buildRequests(
- [
- {
- bidder: 'avct',
- params: {
- placement: '012345678901234567890123',
- },
- userId: {
- id5id: {
- uid: 'test'
- }
- }
- },
- {
- bidder: 'avct',
- params: {
- placement: '012345678901234567890123',
- },
- },
- ],
- exampleBidderRequest
- );
- expect(request.method).to.equal('POST');
- expect(request.url).to.equal('https://ads.avct.cloud/prebid');
-
- const requestData = JSON.parse(request.data);
- expect(requestData.ext).to.be.an('object');
- expect(requestData.ext.currency).to.equal('USD');
- expect(requestData.ext.publisherDomain).to.equal('test.com');
- expect(requestData.ext.fpd).to.deep.equal({ some: 'data' });
- expect(requestData.ext.schain).to.deep.equal({
- validation: 'strict',
- config: {
- ver: '1.0',
- complete: 1,
- nodes: [
- {
- asi: 'indirectseller.com',
- sid: '00001',
- hp: 1,
- },
- ],
- },
- });
- expect(requestData.ext.id5id).to.equal('test');
- expect(requestData.bids).to.be.an('array');
- expect(requestData.bids.length).to.equal(2);
- });
- });
- describe('interpretResponse', function () {
- it('no response', function () {
- const response = spec.interpretResponse();
- expect(response).to.be.an('array');
- expect(response.length).to.equal(0);
- });
- it('no body', function () {
- const response = spec.interpretResponse({});
- expect(response).to.be.an('array');
- expect(response.length).to.equal(0);
- });
- it('null body', function () {
- const response = spec.interpretResponse({ body: null });
- expect(response).to.be.an('array');
- expect(response.length).to.equal(0);
- });
- it('empty body', function () {
- const response = spec.interpretResponse({ body: {} });
- expect(response).to.be.an('array');
- expect(response.length).to.equal(0);
- });
- it('null body.responses', function () {
- const response = spec.interpretResponse({ body: { responses: null } });
- expect(response).to.be.an('array');
- expect(response.length).to.equal(0);
- });
- it('array body', function () {
- const response = spec.interpretResponse({ body: [{}] });
- expect(response).to.be.an('array');
- expect(response.length).to.equal(1);
- });
- it('array body.responses', function () {
- const response = spec.interpretResponse({ body: { responses: [{}] } });
- expect(response).to.be.an('array');
- expect(response.length).to.equal(1);
- });
- });
-});
-
-const exampleBidderRequest = {
- schain: {
- validation: 'strict',
- config: {
- ver: '1.0',
- complete: 1,
- nodes: [
- {
- asi: 'indirectseller.com',
- sid: '00001',
- hp: 1,
- },
- ],
- },
- },
-};
diff --git a/test/spec/modules/beachfrontBidAdapter_spec.js b/test/spec/modules/beachfrontBidAdapter_spec.js
index 555f2c21262..e29994eba44 100644
--- a/test/spec/modules/beachfrontBidAdapter_spec.js
+++ b/test/spec/modules/beachfrontBidAdapter_spec.js
@@ -316,58 +316,54 @@ describe('BeachfrontAdapter', function () {
expect(data.source.ext.schain).to.deep.equal(schain);
});
- it('must add the Trade Desk User ID to the request', () => {
- const tdid = '4321';
- const bidRequest = bidRequests[0];
- bidRequest.mediaTypes = { video: {} };
- bidRequest.userId = { tdid };
- const requests = spec.buildRequests([ bidRequest ]);
- const data = requests[0].data;
- expect(data.user.ext.eids[0]).to.deep.equal({
- source: 'adserver.org',
- uids: [{
- id: tdid,
- ext: {
- rtiPartner: 'TDID'
- }
- }]
- });
- });
-
- it('must add the IdentityLink ID to the request', () => {
- const idl_env = '4321';
- const bidRequest = bidRequests[0];
- bidRequest.mediaTypes = { video: {} };
- bidRequest.userId = { idl_env };
- const requests = spec.buildRequests([ bidRequest ]);
- const data = requests[0].data;
- expect(data.user.ext.eids[0]).to.deep.equal({
- source: 'liveramp.com',
- uids: [{
- id: idl_env,
- ext: {
- rtiPartner: 'idl'
- }
- }]
- });
- });
-
- it('must add the Unified ID 2.0 to the request', () => {
- const uid2 = { id: '4321' };
+ it('must add supported user IDs to the request', () => {
+ const userId = {
+ tdid: '54017816',
+ idl_env: '13024996',
+ uid2: { id: '45843401' },
+ haloId: { haloId: '60314917', auSeg: ['segment1', 'segment2'] }
+ };
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { video: {} };
- bidRequest.userId = { uid2 };
+ bidRequest.userId = userId;
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
- expect(data.user.ext.eids[0]).to.deep.equal({
- source: 'uidapi.com',
- uids: [{
- id: uid2.id,
- ext: {
- rtiPartner: 'UID2'
- }
- }]
- });
+ expect(data.user.ext.eids).to.deep.equal([
+ {
+ source: 'adserver.org',
+ uids: [{
+ id: userId.tdid,
+ ext: {
+ rtiPartner: 'TDID'
+ }
+ }]
+ },
+ {
+ source: 'liveramp.com',
+ uids: [{
+ id: userId.idl_env,
+ ext: {
+ rtiPartner: 'idl'
+ }
+ }]
+ },
+ {
+ source: 'uidapi.com',
+ uids: [{
+ id: userId.uid2.id,
+ ext: {
+ rtiPartner: 'UID2'
+ }
+ }]
+ },
+ {
+ source: 'audigent.com',
+ uids: [{
+ id: userId.haloId,
+ atype: 1,
+ }]
+ }
+ ]);
});
});
@@ -541,34 +537,22 @@ describe('BeachfrontAdapter', function () {
expect(data.schain).to.deep.equal(schain);
});
- it('must add the Trade Desk User ID to the request', () => {
- const tdid = '4321';
- const bidRequest = bidRequests[0];
- bidRequest.mediaTypes = { banner: {} };
- bidRequest.userId = { tdid };
- const requests = spec.buildRequests([ bidRequest ]);
- const data = requests[0].data;
- expect(data.tdid).to.equal(tdid);
- });
-
- it('must add the IdentityLink ID to the request', () => {
- const idl_env = '4321';
- const bidRequest = bidRequests[0];
- bidRequest.mediaTypes = { banner: {} };
- bidRequest.userId = { idl_env };
- const requests = spec.buildRequests([ bidRequest ]);
- const data = requests[0].data;
- expect(data.idl).to.equal(idl_env);
- });
-
- it('must add the Unified ID 2.0 to the request', () => {
- const uid2 = { id: '4321' };
+ it('must add supported user IDs to the request', () => {
+ const userId = {
+ tdid: '54017816',
+ idl_env: '13024996',
+ uid2: { id: '45843401' },
+ haloId: { haloId: '60314917', auSeg: ['segment1', 'segment2'] }
+ };
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { banner: {} };
- bidRequest.userId = { uid2 };
+ bidRequest.userId = userId;
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
- expect(data.uid2).to.equal(uid2.id);
+ expect(data.tdid).to.equal(userId.tdid);
+ expect(data.idl).to.equal(userId.idl_env);
+ expect(data.uid2).to.equal(userId.uid2.id);
+ expect(data.haloid).to.equal(userId.haloId);
});
});
diff --git a/test/spec/modules/betweenBidAdapter_spec.js b/test/spec/modules/betweenBidAdapter_spec.js
index 0e772e7be02..62f36182d55 100644
--- a/test/spec/modules/betweenBidAdapter_spec.js
+++ b/test/spec/modules/betweenBidAdapter_spec.js
@@ -222,51 +222,6 @@ describe('betweenBidAdapterTests', function () {
expect(req_data.sizes).to.deep.equal(['970x250', '240x400', '728x90'])
});
- it('check sharedId with id and third', function() {
- const bidRequestData = [{
- bidId: 'bid123',
- bidder: 'between',
- mediaTypes: {
- banner: {
- sizes: [[728, 90]]
- }
- },
- params: {
- s: 1112,
- },
- userId: {
- sharedid: {
- id: '01EXQE7JKNDRDDVATB0S2GX1NT',
- third: '01EXQE7JKNDRDDVATB0S2GX1NT'
- }
- }
- }];
- const shid = JSON.parse(spec.buildRequests(bidRequestData).data)[0].data.shid;
- const shid3 = JSON.parse(spec.buildRequests(bidRequestData).data)[0].data.shid3;
- expect(shid).to.equal('01EXQE7JKNDRDDVATB0S2GX1NT') && expect(shid3).to.equal('01EXQE7JKNDRDDVATB0S2GX1NT');
- });
- it('check sharedId with only id', function() {
- const bidRequestData = [{
- bidId: 'bid123',
- bidder: 'between',
- mediaTypes: {
- banner: {
- sizes: [[728, 90]]
- }
- },
- params: {
- s: 1112,
- },
- userId: {
- sharedid: {
- id: '01EXQE7JKNDRDDVATB0S2GX1NT',
- }
- }
- }];
- const shid = JSON.parse(spec.buildRequests(bidRequestData).data)[0].data.shid;
- const shid3 = JSON.parse(spec.buildRequests(bidRequestData).data)[0].data.shid3;
- expect(shid).to.equal('01EXQE7JKNDRDDVATB0S2GX1NT') && expect(shid3).to.equal('');
- });
it('check adomain', function() {
const serverResponse = {
body: [{
diff --git a/test/spec/modules/bidfluenceBidAdapter_spec.js b/test/spec/modules/bidfluenceBidAdapter_spec.js
deleted file mode 100644
index 6b3a0c2b044..00000000000
--- a/test/spec/modules/bidfluenceBidAdapter_spec.js
+++ /dev/null
@@ -1,114 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/bidfluenceBidAdapter.js';
-
-const BIDDER_CODE = 'bidfluence';
-const PLACEMENT_ID = '1000';
-const PUB_ID = '1000';
-const CONSENT_STRING = 'DUXDSDFSFWRRR8345F==';
-
-const validBidRequests = [{
- 'bidder': BIDDER_CODE,
- 'params': {
- 'placementId': PLACEMENT_ID,
- 'publisherId': PUB_ID,
- 'reservePrice': 0
- },
- 'adUnitCode': 'adunit-code',
- 'sizes': [[300, 250]],
- 'bidId': '2b1f23307fb8ef',
- 'bidderRequestId': '10edf38ec1a719',
- 'auctionId': '1025ba77-5463-4877-b0eb-14b205cb9304'
-}];
-
-const bidderRequest = {
- 'bidderCode': 'bidfluence',
- 'auctionId': '1025ba77-5463-4877-b0eb-14b205cb9304',
- 'bidderRequestId': '10edf38ec1a719',
- 'refererInfo': {
- 'numIframes': 0,
- 'reachedTop': true,
- 'referer': 'test',
- 'stack': ['test']
- },
- 'timeout': 1000,
- 'gdprConsent': {
- 'gdprApplies': true,
- 'consentString': CONSENT_STRING,
- 'vendorData': ''
- }
-};
-
-bidderRequest.bids = validBidRequests;
-
-describe('Bidfluence Adapter test', () => {
- describe('isBidRequestValid', function () {
- it('should return true when required params found', function () {
- expect(spec.isBidRequestValid(validBidRequests[0])).to.equal(true);
- });
- it('should return the right bidder code', function () {
- expect(spec.code).to.eql(BIDDER_CODE);
- });
- });
-
- describe('buildRequests', function () {
- it('sends bid request to our endpoint via POST', function () {
- const request = spec.buildRequests(validBidRequests, bidderRequest);
- expect(request.method).to.equal('POST');
- const payload = JSON.parse(request.data);
-
- expect(payload.bids[0].bid).to.equal(validBidRequests[0].bidId);
- expect(payload.azr).to.equal(true);
- expect(payload.ck).to.not.be.undefined;
- expect(payload.bids[0].tid).to.equal(PLACEMENT_ID);
- expect(payload.bids[0].pid).to.equal(PUB_ID);
- expect(payload.bids[0].rp).to.be.a('number');
- expect(payload.re).to.not.be.undefined;
- expect(payload.st).to.not.be.undefined;
- expect(payload.tz).to.not.be.undefined;
- expect(payload.sr).to.not.be.undefined;
- expect(payload.vp).to.not.be.undefined;
- expect(payload.sdt).to.not.be.undefined;
- expect(payload.bids[0].w).to.equal('300');
- expect(payload.bids[0].h).to.equal('250');
- });
-
- it('sends gdpr info if exists', function () {
- const request = spec.buildRequests(validBidRequests, bidderRequest);
- const payload = JSON.parse(request.data);
- expect(payload.gdpr).to.equal(true);
- expect(payload.gdprc).to.equal(CONSENT_STRING);
- });
- });
-
- describe('interpretResponse', function () {
- const response = {
- body: {
- Bids:
- [{
- 'CreativeId': '1000',
- 'Cpm': 0.50,
- 'Ad': '
',
- 'Height': 250,
- 'Width': 300
- }]
- }
- };
-
- it('should get correct bid response', function () {
- const expectedResponse = [{
- requestId: response.body.Bids[0].BidId,
- cpm: response.body.Bids[0].Cpm,
- width: response.body.Bids[0].Width,
- height: response.body.Bids[0].Height,
- creativeId: response.body.Bids[0].CreativeId,
- ad: response.body.Bids[0].Ad,
- currency: 'USD',
- netRevenue: true,
- ttl: 360
- }];
-
- let result = spec.interpretResponse(response, { 'bidderRequest': validBidRequests[0] });
- expect(result).to.deep.equal(expectedResponse);
- });
- });
-});
diff --git a/test/spec/modules/bidglassAdapter_spec.js b/test/spec/modules/bidglassAdapter_spec.js
index d153430103d..7b007f7cc1f 100644
--- a/test/spec/modules/bidglassAdapter_spec.js
+++ b/test/spec/modules/bidglassAdapter_spec.js
@@ -65,7 +65,10 @@ describe('Bid Glass Adapter', function () {
'creativeId': '-1',
'width': '300',
'height': '250',
- 'requestId': '30b31c1838de1e'
+ 'requestId': '30b31c1838de1e',
+ 'meta': {
+ 'advertiserDomains': ['https://example.com']
+ }
}]
}
};
@@ -83,7 +86,10 @@ describe('Bid Glass Adapter', function () {
'mediaType': 'banner',
'netRevenue': true,
'ttl': 10,
- 'ad': ''
+ 'ad': '',
+ 'meta': {
+ 'advertiserDomains': ['https://example.com']
+ }
}];
let result = spec.interpretResponse(response);
diff --git a/test/spec/modules/bidlabBidAdapter_spec.js b/test/spec/modules/bidlabBidAdapter_spec.js
deleted file mode 100644
index cffd43ae6ca..00000000000
--- a/test/spec/modules/bidlabBidAdapter_spec.js
+++ /dev/null
@@ -1,235 +0,0 @@
-import {expect} from 'chai';
-import {spec} from '../../../modules/bidlabBidAdapter.js';
-
-describe('BidlabBidAdapter', function () {
- let bid = {
- bidId: '23fhj33i987f',
- bidder: 'bidlab',
- params: {
- placementId: 0,
- traffic: 'banner'
- }
- };
-
- describe('isBidRequestValid', function () {
- it('Should return true if there are bidId, params and placementId parameters present', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
- });
- it('Should return false if at least one of parameters is not present', function () {
- delete bid.params.placementId;
- expect(spec.isBidRequestValid(bid)).to.be.false;
- });
- });
-
- describe('buildRequests', function () {
- let serverRequest = spec.buildRequests([bid]);
- it('Creates a ServerRequest object with method, URL and data', function () {
- expect(serverRequest).to.exist;
- expect(serverRequest.method).to.exist;
- expect(serverRequest.url).to.exist;
- expect(serverRequest.data).to.exist;
- });
- it('Returns POST method', function () {
- expect(serverRequest.method).to.equal('POST');
- });
- it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://service.bidlab.ai/?c=o&m=multi');
- });
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'secure', 'host', 'page', 'placements');
- expect(data.deviceWidth).to.be.a('number');
- expect(data.deviceHeight).to.be.a('number');
- expect(data.language).to.be.a('string');
- expect(data.secure).to.be.within(0, 1);
- expect(data.host).to.be.a('string');
- expect(data.page).to.be.a('string');
- let placement = data['placements'][0];
- expect(placement).to.have.keys('placementId', 'bidId', 'traffic', 'sizes');
- expect(placement.placementId).to.equal(0);
- expect(placement.bidId).to.equal('23fhj33i987f');
- expect(placement.traffic).to.equal('banner');
- });
- it('Returns empty data if no valid requests are passed', function () {
- serverRequest = spec.buildRequests([]);
- let data = serverRequest.data;
- expect(data.placements).to.be.an('array').that.is.empty;
- });
- });
- describe('interpretResponse', function () {
- it('Should interpret banner response', function () {
- const banner = {
- body: [{
- mediaType: 'banner',
- width: 300,
- height: 250,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let bannerResponses = spec.interpretResponse(banner);
- expect(bannerResponses).to.be.an('array').that.is.not.empty;
- let dataItem = bannerResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.width).to.equal(300);
- expect(dataItem.height).to.equal(250);
- expect(dataItem.ad).to.equal('Test');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret video response', function () {
- const video = {
- body: [{
- vastUrl: 'test.com',
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let videoResponses = spec.interpretResponse(video);
- expect(videoResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = videoResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.5);
- expect(dataItem.vastUrl).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret native response', function () {
- const native = {
- body: [{
- mediaType: 'native',
- native: {
- clickUrl: 'test.com',
- title: 'Test',
- image: 'test.com',
- impressionTrackers: ['test.com'],
- },
- ttl: 120,
- cpm: 0.4,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let nativeResponses = spec.interpretResponse(native);
- expect(nativeResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = nativeResponses[0];
- expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native');
- expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.native.clickUrl).to.equal('test.com');
- expect(dataItem.native.title).to.equal('Test');
- expect(dataItem.native.image).to.equal('test.com');
- expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
- expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should return an empty array if invalid banner response is passed', function () {
- const invBanner = {
- body: [{
- width: 300,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
-
- let serverResponses = spec.interpretResponse(invBanner);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid video response is passed', function () {
- const invVideo = {
- body: [{
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invVideo);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid native response is passed', function () {
- const invNative = {
- body: [{
- mediaType: 'native',
- clickUrl: 'test.com',
- title: 'Test',
- impressionTrackers: ['test.com'],
- ttl: 120,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let serverResponses = spec.interpretResponse(invNative);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid response is passed', function () {
- const invalid = {
- body: [{
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invalid);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- });
- describe('getUserSyncs', function () {
- let userSync = spec.getUserSyncs();
- it('Returns valid URL and type', function () {
- if (spec.noSync) {
- expect(userSync).to.be.equal(false);
- } else {
- expect(userSync).to.be.an('array').with.lengthOf(1);
- expect(userSync[0].type).to.exist;
- expect(userSync[0].url).to.exist;
- expect(userSync[0].type).to.be.equal('image');
- expect(userSync[0].url).to.be.equal('https://service.bidlab.ai/?c=o&m=sync');
- }
- });
- });
-});
diff --git a/test/spec/modules/bidphysicsBidAdapter_spec.js b/test/spec/modules/bidphysicsBidAdapter_spec.js
deleted file mode 100644
index fc15c39cf81..00000000000
--- a/test/spec/modules/bidphysicsBidAdapter_spec.js
+++ /dev/null
@@ -1,261 +0,0 @@
-import {expect} from 'chai';
-import {spec} from 'modules/bidphysicsBidAdapter.js';
-
-const REQUEST = {
- 'bidderCode': 'bidphysics',
- 'auctionId': 'auctionId-56a2-4f71-9098-720a68f2f708',
- 'bidderRequestId': 'requestId',
- 'bidRequest': [{
- 'bidder': 'bidphysics',
- 'params': {
- 'unitId': 123456,
- },
- 'placementCode': 'div-gpt-dummy-placement-code',
- 'sizes': [
- [300, 250]
- ],
- 'bidId': 'bidId1',
- 'bidderRequestId': 'bidderRequestId',
- 'auctionId': 'auctionId-56a2-4f71-9098-720a68f2f708'
- },
- {
- 'bidder': 'bidphysics',
- 'params': {
- 'unitId': 123456,
- },
- 'placementCode': 'div-gpt-dummy-placement-code',
- 'sizes': [
- [300, 250]
- ],
- 'bidId': 'bidId2',
- 'bidderRequestId': 'bidderRequestId',
- 'auctionId': 'auctionId-56a2-4f71-9098-720a68f2f708'
- }],
- 'start': 1487883186070,
- 'auctionStart': 1487883186069,
- 'timeout': 3000
-};
-
-const RESPONSE = {
- 'headers': null,
- 'body': {
- 'id': 'responseId',
- 'seatbid': [
- {
- 'bid': [
- {
- 'id': 'bidId1',
- 'impid': 'bidId1',
- 'price': 0.18,
- 'adm': '',
- 'adid': '144762342',
- 'adomain': [
- 'https://dummydomain.com'
- ],
- 'iurl': 'iurl',
- 'cid': '109',
- 'crid': 'creativeId',
- 'cat': [],
- 'w': 300,
- 'h': 250,
- 'ext': {
- 'prebid': {
- 'type': 'banner'
- },
- 'bidder': {
- 'appnexus': {
- 'brand_id': 334553,
- 'auction_id': 514667951122925701,
- 'bidder_id': 2,
- 'bid_ad_type': 0
- }
- }
- }
- },
- {
- 'id': 'bidId2',
- 'impid': 'bidId2',
- 'price': 0.1,
- 'adm': '',
- 'adid': '144762342',
- 'adomain': [
- 'https://dummydomain.com'
- ],
- 'iurl': 'iurl',
- 'cid': '109',
- 'crid': 'creativeId',
- 'cat': [],
- 'w': 300,
- 'h': 250,
- 'ext': {
- 'prebid': {
- 'type': 'banner'
- },
- 'bidder': {
- 'appnexus': {
- 'brand_id': 386046,
- 'auction_id': 517067951122925501,
- 'bidder_id': 2,
- 'bid_ad_type': 0
- }
- }
- }
- }
- ],
- 'seat': 'bidphysics'
- }
- ],
- 'ext': {
- 'usersync': {
- 'sovrn': {
- 'status': 'none',
- 'syncs': [
- {
- 'url': 'urlsovrn',
- 'type': 'iframe'
- }
- ]
- },
- 'appnexus': {
- 'status': 'none',
- 'syncs': [
- {
- 'url': 'urlappnexus',
- 'type': 'pixel'
- }
- ]
- }
- },
- 'responsetimemillis': {
- 'appnexus': 127
- }
- }
- }
-};
-
-describe('BidPhysics bid adapter', function () {
- describe('isBidRequestValid', function () {
- it('should accept request if only unitId is passed', function () {
- let bid = {
- bidder: 'bidphysics',
- params: {
- unitId: 'unitId',
- }
- };
- expect(spec.isBidRequestValid(bid)).to.equal(true);
- });
- it('should accept request if only networkId is passed', function () {
- let bid = {
- bidder: 'bidphysics',
- params: {
- networkId: 'networkId',
- }
- };
- expect(spec.isBidRequestValid(bid)).to.equal(true);
- });
- it('should accept request if only publisherId is passed', function () {
- let bid = {
- bidder: 'bidphysics',
- params: {
- publisherId: 'publisherId',
- }
- };
- expect(spec.isBidRequestValid(bid)).to.equal(true);
- });
-
- it('reject requests without params', function () {
- let bid = {
- bidder: 'bidphysics',
- params: {}
- };
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- it('creates request data', function () {
- let request = spec.buildRequests(REQUEST.bidRequest, REQUEST);
-
- expect(request).to.exist.and.to.be.a('object');
- const payload = JSON.parse(request.data);
- expect(payload.imp[0]).to.have.property('id', REQUEST.bidRequest[0].bidId);
- expect(payload.imp[1]).to.have.property('id', REQUEST.bidRequest[1].bidId);
- });
-
- it('has gdpr data if applicable', function () {
- const req = Object.assign({}, REQUEST, {
- gdprConsent: {
- consentString: 'consentString',
- gdprApplies: true,
- }
- });
- let request = spec.buildRequests(REQUEST.bidRequest, req);
-
- const payload = JSON.parse(request.data);
- expect(payload.user.ext).to.have.property('consent', req.gdprConsent.consentString);
- expect(payload.regs.ext).to.have.property('gdpr', 1);
- });
- });
-
- describe('interpretResponse', function () {
- it('have bids', function () {
- let bids = spec.interpretResponse(RESPONSE, REQUEST);
- expect(bids).to.be.an('array').that.is.not.empty;
- validateBidOnIndex(0);
- validateBidOnIndex(1);
-
- function validateBidOnIndex(index) {
- expect(bids[index]).to.have.property('currency', 'USD');
- expect(bids[index]).to.have.property('requestId', RESPONSE.body.seatbid[0].bid[index].impid);
- expect(bids[index]).to.have.property('cpm', RESPONSE.body.seatbid[0].bid[index].price);
- expect(bids[index]).to.have.property('width', RESPONSE.body.seatbid[0].bid[index].w);
- expect(bids[index]).to.have.property('height', RESPONSE.body.seatbid[0].bid[index].h);
- expect(bids[index]).to.have.property('ad', RESPONSE.body.seatbid[0].bid[index].adm);
- expect(bids[index]).to.have.property('creativeId', RESPONSE.body.seatbid[0].bid[index].crid);
- expect(bids[index]).to.have.property('ttl', 30);
- expect(bids[index]).to.have.property('netRevenue', true);
- }
- });
-
- it('handles empty response', function () {
- const EMPTY_RESP = Object.assign({}, RESPONSE, {'body': {}});
- const bids = spec.interpretResponse(EMPTY_RESP, REQUEST);
-
- expect(bids).to.be.empty;
- });
- });
-
- describe('getUserSyncs', function () {
- it('handles no parameters', function () {
- let opts = spec.getUserSyncs({});
- expect(opts).to.be.an('array').that.is.empty;
- });
- it('returns non if sync is not allowed', function () {
- let opts = spec.getUserSyncs({iframeEnabled: false, pixelEnabled: false});
-
- expect(opts).to.be.an('array').that.is.empty;
- });
-
- it('iframe sync enabled should return results', function () {
- let opts = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: false}, [RESPONSE]);
-
- expect(opts.length).to.equal(1);
- expect(opts[0].type).to.equal('iframe');
- expect(opts[0].url).to.equal(RESPONSE.body.ext.usersync['sovrn'].syncs[0].url);
- });
-
- it('pixel sync enabled should return results', function () {
- let opts = spec.getUserSyncs({iframeEnabled: false, pixelEnabled: true}, [RESPONSE]);
-
- expect(opts.length).to.equal(1);
- expect(opts[0].type).to.equal('image');
- expect(opts[0].url).to.equal(RESPONSE.body.ext.usersync['appnexus'].syncs[0].url);
- });
-
- it('all sync enabled should return all results', function () {
- let opts = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, [RESPONSE]);
-
- expect(opts.length).to.equal(2);
- });
- });
-});
diff --git a/test/spec/modules/decenteradsBidAdapter_spec.js b/test/spec/modules/bidscubeBidAdapter_spec.js
similarity index 78%
rename from test/spec/modules/decenteradsBidAdapter_spec.js
rename to test/spec/modules/bidscubeBidAdapter_spec.js
index 257094cae3a..26cf19fc310 100644
--- a/test/spec/modules/decenteradsBidAdapter_spec.js
+++ b/test/spec/modules/bidscubeBidAdapter_spec.js
@@ -1,14 +1,15 @@
import { expect } from 'chai'
-import { spec } from '../../../modules/decenteradsBidAdapter.js'
+import { spec } from '../../../modules/bidscubeBidAdapter.js'
import { deepStrictEqual, notEqual, ok, strictEqual } from 'assert'
-describe('DecenteradsAdapter', () => {
+describe('BidsCubeAdapter', () => {
const bid = {
bidId: '9ec5b177515ee2e5',
- bidder: 'decenterads',
+ bidder: 'bidscube',
params: {
placementId: 0,
- traffic: 'banner'
+ traffic: 'banner',
+ allParams: '{}'
}
}
@@ -39,7 +40,7 @@ describe('DecenteradsAdapter', () => {
})
it('Returns valid URL', () => {
- strictEqual('https://supply.decenterads.com/?c=o&m=multi', serverRequest.url)
+ strictEqual('https://supply.bidscube.com/?c=o&m=multi', serverRequest.url)
})
it('Returns valid data if array of bids is valid', () => {
@@ -54,10 +55,11 @@ describe('DecenteradsAdapter', () => {
notEqual(-1, [0, 1].indexOf(data.secure))
const placement = data.placements[0]
- deepStrictEqual(['placementId', 'bidId', 'traffic'], Object.keys(placement))
+ deepStrictEqual(['placementId', 'bidId', 'traffic', 'allParams'], Object.keys(placement))
strictEqual(0, placement.placementId)
strictEqual('9ec5b177515ee2e5', placement.bidId)
strictEqual('banner', placement.traffic)
+ strictEqual('{"bidId":"9ec5b177515ee2e5","bidder":"bidscube","params":{"placementId":0,"traffic":"banner","allParams":"{}"}}', placement.allParams)
})
it('Returns empty data if no valid requests are passed', () => {
@@ -82,12 +84,15 @@ describe('DecenteradsAdapter', () => {
creativeId: '2',
netRevenue: true,
currency: 'USD',
- dealId: '1'
+ dealId: '1',
+ meta: {
+ advertiserDomains: ['test.com']
+ }
}]
},
{
body: [{
- vastUrl: 'decenterads.com',
+ vastUrl: 'bidscube.com',
mediaType: 'video',
cpm: 0.5,
requestId: '9ec5b177515ee2e5',
@@ -95,22 +100,28 @@ describe('DecenteradsAdapter', () => {
creativeId: '2',
netRevenue: true,
currency: 'USD',
- dealId: '1'
+ dealId: '1',
+ meta: {
+ advertiserDomains: ['test.com']
+ }
}]
},
{
body: [{
mediaType: 'native',
- clickUrl: 'decenterads.com',
+ clickUrl: 'bidscube.com',
title: 'Test',
- image: 'decenterads.com',
+ image: 'bidscube.com',
creativeId: '2',
- impressionTrackers: ['decenterads.com'],
+ impressionTrackers: ['bidscube.com'],
ttl: 120,
cpm: 0.4,
requestId: '9ec5b177515ee2e5',
netRevenue: true,
currency: 'USD',
+ meta: {
+ advertiserDomains: ['test.com']
+ }
}]
}
]
@@ -125,11 +136,19 @@ describe('DecenteradsAdapter', () => {
strictEqual(1, response.length)
const copy = { ...obj.body[0] }
- delete copy.mediaType
deepStrictEqual(copy, response[0])
})
}
+ for (const obj of validData) {
+ it(`Should interpret response has meta.advertiserDomains`, () => {
+ const response = spec.interpretResponse(obj)
+
+ expect(response[0]['meta']['advertiserDomains']).to.be.an('array')
+ expect(response[0]['meta']['advertiserDomains'][0]).to.be.an('string')
+ })
+ }
+
const invalidData = [
{
body: [{
@@ -159,9 +178,9 @@ describe('DecenteradsAdapter', () => {
{
body: [{
mediaType: 'native',
- clickUrl: 'decenterads.com',
+ clickUrl: 'bidscube.com',
title: 'Test',
- impressionTrackers: ['decenterads.com'],
+ impressionTrackers: ['bidscube.com'],
ttl: 120,
requestId: '9ec5b177515ee2e5',
creativeId: '2',
@@ -200,7 +219,7 @@ describe('DecenteradsAdapter', () => {
describe('getUserSyncs', () => {
it('Returns valid URL and type', () => {
- const expectedResult = [{ type: 'image', url: 'https://supply.decenterads.com/?c=o&m=cookie' }]
+ const expectedResult = [{ type: 'image', url: 'https://supply.bidscube.com/?c=o&m=cookie' }]
deepStrictEqual(expectedResult, spec.getUserSyncs())
})
})
diff --git a/test/spec/modules/bizzclickBidAdapter_spec.js b/test/spec/modules/bizzclickBidAdapter_spec.js
index e0698c9eda8..500f45e0573 100644
--- a/test/spec/modules/bizzclickBidAdapter_spec.js
+++ b/test/spec/modules/bizzclickBidAdapter_spec.js
@@ -299,6 +299,8 @@ describe('BizzclickAdapter', function() {
netRevenue: true,
creativeId: BANNER_BID_RESPONSE.seatbid[0].bid[0].crid,
dealId: BANNER_BID_RESPONSE.seatbid[0].bid[0].dealid,
+
+ meta: {advertiserDomains: BANNER_BID_RESPONSE.seatbid[0].bid[0].adomain},
mediaType: 'banner',
ad: BANNER_BID_RESPONSE.seatbid[0].bid[0].adm
}
@@ -308,11 +310,12 @@ describe('BizzclickAdapter', function() {
expect(bannerResponses).to.be.an('array').that.is.not.empty;
let dataItem = bannerResponses[0];
expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
+ 'netRevenue', 'currency', 'dealId', 'meta', 'mediaType');
expect(dataItem.requestId).to.equal(expectedBidResponse.requestId);
expect(dataItem.cpm).to.equal(expectedBidResponse.cpm);
expect(dataItem.ad).to.equal(expectedBidResponse.ad);
expect(dataItem.ttl).to.equal(expectedBidResponse.ttl);
+ expect(dataItem.meta.advertiserDomains).to.equal(expectedBidResponse.meta.advertiserDomains);
expect(dataItem.creativeId).to.equal(expectedBidResponse.creativeId);
expect(dataItem.netRevenue).to.be.true;
expect(dataItem.currency).to.equal(expectedBidResponse.currency);
@@ -337,6 +340,7 @@ describe('BizzclickAdapter', function() {
dealId: VIDEO_BID_RESPONSE.seatbid[0].bid[0].dealid,
mediaType: 'video',
vastXml: VIDEO_BID_RESPONSE.seatbid[0].bid[0].adm,
+ meta: {advertiserDomains: VIDEO_BID_RESPONSE.seatbid[0].bid[0].adomain},
vastUrl: VIDEO_BID_RESPONSE.seatbid[0].bid[0].ext.vastUrl
}
@@ -345,12 +349,13 @@ describe('BizzclickAdapter', function() {
expect(videoResponses).to.be.an('array').that.is.not.empty;
let dataItem = videoResponses[0];
expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'vastXml', 'vastUrl', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
+ 'netRevenue', 'currency', 'dealId', 'meta', 'mediaType');
expect(dataItem.requestId).to.equal(expectedBidResponse.requestId);
expect(dataItem.cpm).to.equal(expectedBidResponse.cpm);
expect(dataItem.vastXml).to.equal(expectedBidResponse.vastXml)
expect(dataItem.ttl).to.equal(expectedBidResponse.ttl);
expect(dataItem.creativeId).to.equal(expectedBidResponse.creativeId);
+ expect(dataItem.meta.advertiserDomains).to.equal(expectedBidResponse.meta.advertiserDomains);
expect(dataItem.netRevenue).to.be.true;
expect(dataItem.currency).to.equal(expectedBidResponse.currency);
expect(dataItem.width).to.equal(expectedBidResponse.width);
@@ -373,6 +378,7 @@ describe('BizzclickAdapter', function() {
creativeId: NATIVE_BID_RESPONSE.seatbid[0].bid[0].crid,
dealId: NATIVE_BID_RESPONSE.seatbid[0].bid[0].dealid,
mediaType: 'native',
+ meta: {advertiserDomains: NATIVE_BID_RESPONSE.seatbid[0].bid[0].adomain},
native: {clickUrl: NATIVE_BID_RESPONSE.seatbid[0].bid[0].adm.native.link.url}
}
@@ -381,9 +387,10 @@ describe('BizzclickAdapter', function() {
expect(nativeResponses).to.be.an('array').that.is.not.empty;
let dataItem = nativeResponses[0];
expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'native', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
expect(dataItem.requestId).to.equal(expectedBidResponse.requestId);
expect(dataItem.cpm).to.equal(expectedBidResponse.cpm);
+ expect(dataItem.meta.advertiserDomains).to.equal(expectedBidResponse.meta.advertiserDomains);
expect(dataItem.native.clickUrl).to.equal(expectedBidResponse.native.clickUrl)
expect(dataItem.ttl).to.equal(expectedBidResponse.ttl);
expect(dataItem.creativeId).to.equal(expectedBidResponse.creativeId);
diff --git a/test/spec/modules/bluebillywigBidAdapter_spec.js b/test/spec/modules/bluebillywigBidAdapter_spec.js
index 3aee6c69438..c831ddf6ddf 100644
--- a/test/spec/modules/bluebillywigBidAdapter_spec.js
+++ b/test/spec/modules/bluebillywigBidAdapter_spec.js
@@ -760,6 +760,10 @@ describe('BlueBillywigAdapter', () => {
expect(bid.currency).to.equal(serverResponse.body.cur);
expect(bid.ttl).to.equal(BB_CONSTANTS.DEFAULT_TTL);
+ expect(bid).to.have.property('meta');
+ expect(bid.meta).to.have.property('advertiserDomains');
+ expect(bid.meta.advertiserDomains[0]).to.equal('bluebillywig.com');
+
expect(bid.publicationName).to.equal(validBidderRequest.bids[0].params.publicationName);
expect(bid.rendererCode).to.equal(validBidderRequest.bids[0].params.rendererCode);
expect(bid.accountId).to.equal(validBidderRequest.bids[0].params.accountId);
diff --git a/test/spec/modules/boldwinBidAdapter_spec.js b/test/spec/modules/boldwinBidAdapter_spec.js
deleted file mode 100644
index a353665ec33..00000000000
--- a/test/spec/modules/boldwinBidAdapter_spec.js
+++ /dev/null
@@ -1,281 +0,0 @@
-import {expect} from 'chai';
-import {spec} from '../../../modules/boldwinBidAdapter.js';
-import { BANNER, VIDEO } from '../../../src/mediaTypes.js';
-
-describe('BoldwinBidAdapter', function () {
- const bid = {
- bidId: '23fhj33i987f',
- bidder: 'boldwin',
- params: {
- placementId: 0,
- traffic: BANNER
- }
- };
-
- const bidderRequest = {
- refererInfo: {
- referer: 'test.com'
- }
- };
-
- describe('isBidRequestValid', function () {
- it('Should return true if there are bidId, params and placementId parameters present', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
- });
- it('Should return false if at least one of parameters is not present', function () {
- delete bid.params.placementId;
- expect(spec.isBidRequestValid(bid)).to.be.false;
- });
- });
-
- describe('buildRequests', function () {
- let serverRequest = spec.buildRequests([bid], bidderRequest);
- it('Creates a ServerRequest object with method, URL and data', function () {
- expect(serverRequest).to.exist;
- expect(serverRequest.method).to.exist;
- expect(serverRequest.url).to.exist;
- expect(serverRequest.data).to.exist;
- });
- it('Returns POST method', function () {
- expect(serverRequest.method).to.equal('POST');
- });
- it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://ssp.videowalldirect.com/?c=o&m=multi');
- });
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'secure', 'host', 'page', 'placements');
- expect(data.deviceWidth).to.be.a('number');
- expect(data.deviceHeight).to.be.a('number');
- expect(data.language).to.be.a('string');
- expect(data.secure).to.be.within(0, 1);
- expect(data.host).to.be.a('string');
- expect(data.page).to.be.a('string');
- expect(data.gdpr).to.not.exist;
- expect(data.ccpa).to.not.exist;
- let placement = data['placements'][0];
- expect(placement).to.have.keys('placementId', 'bidId', 'traffic', 'sizes', 'hPlayer', 'wPlayer', 'schain');
- expect(placement.placementId).to.equal(0);
- expect(placement.bidId).to.equal('23fhj33i987f');
- expect(placement.traffic).to.equal(BANNER);
- expect(placement.schain).to.be.an('object');
- });
-
- it('Returns valid data for mediatype video', function () {
- const playerSize = [300, 300];
- bid.mediaTypes = {};
- bid.params.traffic = VIDEO;
- bid.mediaTypes[VIDEO] = {
- playerSize
- };
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- let placement = data['placements'][0];
- expect(placement).to.be.an('object');
- expect(placement.traffic).to.equal(VIDEO);
- expect(placement.wPlayer).to.equal(playerSize[0]);
- expect(placement.hPlayer).to.equal(playerSize[1]);
- });
-
- it('Returns data with gdprConsent and without uspConsent', function () {
- bidderRequest.gdprConsent = 'test';
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data.gdpr).to.exist;
- expect(data.gdpr).to.be.a('string');
- expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
- expect(data.ccpa).to.not.exist;
- delete bidderRequest.gdprConsent;
- });
-
- it('Returns data with uspConsent and without gdprConsent', function () {
- bidderRequest.uspConsent = 'test';
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data.ccpa).to.exist;
- expect(data.ccpa).to.be.a('string');
- expect(data.ccpa).to.equal(bidderRequest.uspConsent);
- expect(data.gdpr).to.not.exist;
- });
-
- it('Returns empty data if no valid requests are passed', function () {
- serverRequest = spec.buildRequests([]);
- let data = serverRequest.data;
- expect(data.placements).to.be.an('array').that.is.empty;
- });
- });
- describe('interpretResponse', function () {
- it('Should interpret banner response', function () {
- const banner = {
- body: [{
- mediaType: 'banner',
- width: 300,
- height: 250,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let bannerResponses = spec.interpretResponse(banner);
- expect(bannerResponses).to.be.an('array').that.is.not.empty;
- let dataItem = bannerResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.width).to.equal(300);
- expect(dataItem.height).to.equal(250);
- expect(dataItem.ad).to.equal('Test');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret video response', function () {
- const video = {
- body: [{
- vastUrl: 'test.com',
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let videoResponses = spec.interpretResponse(video);
- expect(videoResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = videoResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.5);
- expect(dataItem.vastUrl).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret native response', function () {
- const native = {
- body: [{
- mediaType: 'native',
- native: {
- clickUrl: 'test.com',
- title: 'Test',
- image: 'test.com',
- impressionTrackers: ['test.com'],
- },
- ttl: 120,
- cpm: 0.4,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let nativeResponses = spec.interpretResponse(native);
- expect(nativeResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = nativeResponses[0];
- expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native');
- expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.native.clickUrl).to.equal('test.com');
- expect(dataItem.native.title).to.equal('Test');
- expect(dataItem.native.image).to.equal('test.com');
- expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
- expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should return an empty array if invalid banner response is passed', function () {
- const invBanner = {
- body: [{
- width: 300,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
-
- let serverResponses = spec.interpretResponse(invBanner);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid video response is passed', function () {
- const invVideo = {
- body: [{
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invVideo);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid native response is passed', function () {
- const invNative = {
- body: [{
- mediaType: 'native',
- clickUrl: 'test.com',
- title: 'Test',
- impressionTrackers: ['test.com'],
- ttl: 120,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let serverResponses = spec.interpretResponse(invNative);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid response is passed', function () {
- const invalid = {
- body: [{
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invalid);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- });
-
- describe('getUserSyncs', function () {
- let userSync = spec.getUserSyncs();
- it('Returns valid URL and type', function () {
- expect(userSync).to.be.an('array').with.lengthOf(1);
- expect(userSync[0].type).to.exist;
- expect(userSync[0].url).to.exist;
- expect(userSync[0].type).to.be.equal('image');
- expect(userSync[0].url).to.be.equal('https://cs.videowalldirect.com/?c=o&m=cookie');
- });
- });
-});
diff --git a/test/spec/modules/bridgewellBidAdapter_spec.js b/test/spec/modules/bridgewellBidAdapter_spec.js
index 0860404355e..8da82c71820 100644
--- a/test/spec/modules/bridgewellBidAdapter_spec.js
+++ b/test/spec/modules/bridgewellBidAdapter_spec.js
@@ -2,6 +2,14 @@ import { expect } from 'chai';
import { spec } from 'modules/bridgewellBidAdapter.js';
import { newBidder } from 'src/adapters/bidderFactory.js';
+const userId = {
+ 'criteoId': 'vYlICF9oREZlTHBGRVdrJTJCUUJnc3U2ckNVaXhrV1JWVUZVSUxzZmJlcnJZR0ZxbVhFRnU5bDAlMkJaUWwxWTlNcmdEeHFrJTJGajBWVlV4T3lFQ0FyRVcxNyUyQlIxa0lLSlFhcWJpTm9PSkdPVkx0JTJCbzlQRTQlM0Q',
+ 'pubcid': '074864cb-3705-430e-9ff7-48ccf3c21b94',
+ 'sharedid': {'id': '01F61MX53D786DSB2WYD38ZVM7', 'third': '01F61MX53D786DSB2WYD38ZVM7'},
+ 'uid2': {'id': 'eb33b0cb-8d35-1234-b9c0-1a31d4064777'},
+ 'flocId': {'id': '12345', 'version': 'chrome.1.1'},
+}
+
describe('bridgewellBidAdapter', function () {
const adapter = newBidder(spec);
@@ -87,6 +95,7 @@ describe('bridgewellBidAdapter', function () {
'bidId': '3150ccb55da321',
'bidderRequestId': '22edbae2733bf6',
'auctionId': '1d1a030790a475',
+ 'userId': userId,
},
{
'bidder': 'bridgewell',
@@ -126,6 +135,7 @@ describe('bridgewellBidAdapter', function () {
'bidId': '3150ccb55da321',
'bidderRequestId': '22edbae2733bf6',
'auctionId': '1d1a030790a475',
+ 'userId': userId,
}
];
@@ -142,10 +152,13 @@ describe('bridgewellBidAdapter', function () {
expect(payload.adUnits).to.be.an('array');
expect(payload.url).to.exist.and.to.equal('https://www.bridgewell.com/');
for (let i = 0, max_i = payload.adUnits.length; i < max_i; i++) {
- expect(payload.adUnits[i]).to.have.property('ChannelID').that.is.a('string');
- expect(payload.adUnits[i]).to.not.have.property('cid');
- expect(payload.adUnits[i]).to.have.property('adUnitCode').and.to.equal('adunit-code-2');
- expect(payload.adUnits[i]).to.have.property('requestId').and.to.equal('3150ccb55da321');
+ let u = payload.adUnits[i];
+ expect(u).to.have.property('ChannelID').that.is.a('string');
+ expect(u).to.not.have.property('cid');
+ expect(u).to.have.property('adUnitCode').and.to.equal('adunit-code-2');
+ expect(u).to.have.property('requestId').and.to.equal('3150ccb55da321');
+ expect(u).to.have.property('userIds');
+ expect(u.userIds).to.deep.equal(userId);
}
});
@@ -170,6 +183,7 @@ describe('bridgewellBidAdapter', function () {
'bidId': '3150ccb55da321',
'bidderRequestId': '22edbae2733bf6',
'auctionId': '1d1a030790a475',
+ 'userId': userId
},
];
@@ -180,10 +194,13 @@ describe('bridgewellBidAdapter', function () {
expect(payload.adUnits).to.be.an('array');
expect(payload.url).to.exist.and.to.equal('https://www.bridgewell.com/');
for (let i = 0, max_i = payload.adUnits.length; i < max_i; i++) {
- expect(payload.adUnits[i]).to.have.property('cid').that.is.a('number');
- expect(payload.adUnits[i]).to.not.have.property('ChannelID');
- expect(payload.adUnits[i]).to.have.property('adUnitCode').and.to.equal('adunit-code-2');
- expect(payload.adUnits[i]).to.have.property('requestId').and.to.equal('3150ccb55da321');
+ let u = payload.adUnits[i];
+ expect(u).to.have.property('cid').that.is.a('number');
+ expect(u).to.not.have.property('ChannelID');
+ expect(u).to.have.property('adUnitCode').and.to.equal('adunit-code-2');
+ expect(u).to.have.property('requestId').and.to.equal('3150ccb55da321');
+ expect(u).to.have.property('userIds');
+ expect(u.userIds).to.deep.equal(userId);
}
});
diff --git a/test/spec/modules/brightMountainMediaBidAdapter_spec.js b/test/spec/modules/brightMountainMediaBidAdapter_spec.js
index 17f23c5acd3..114c1f19a6e 100644
--- a/test/spec/modules/brightMountainMediaBidAdapter_spec.js
+++ b/test/spec/modules/brightMountainMediaBidAdapter_spec.js
@@ -86,7 +86,7 @@ describe('brightMountainMediaBidAdapter_spec', function () {
it('Returns valid data if array of bids is valid', function () {
let data = serverRequest.data;
expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'secure', 'host', 'page', 'placements');
+ expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'secure', 'host', 'page', 'prebidVersion', 'placements');
expect(data.deviceWidth).to.be.a('number');
expect(data.deviceHeight).to.be.a('number');
expect(data.language).to.be.a('string');
@@ -145,6 +145,47 @@ describe('brightMountainMediaBidAdapter_spec', function () {
expect(request.data.placements[0].schain).to.be.an('object');
});
+ it('sends userId info if exists', function () {
+ const userIdAsEids = [
+ {
+ 'source': 'id5-sync.com',
+ 'uids': [
+ {
+ 'id': 'ID5-ZHMOaW5vh_TJhKVSaTWmuoTpwqjGGwx5v0WbaSV8yw',
+ 'atype': 1,
+ 'ext': {
+ 'linkType': 2
+ }
+ }
+ ]
+ },
+ {
+ 'source': 'pubcid.org',
+ 'uids': [
+ {
+ 'id': '00000000000000000000000000',
+ 'atype': 1
+ }
+ ]
+ }
+ ];
+ bidBanner.userIdAsEids = userIdAsEids;
+ const request = spec.buildRequests([bidBanner], bidderRequest);
+
+ expect(request.data.placements[0]).to.have.property('userIds');
+ expect(request.data.placements[0].userIds).to.not.equal(null).and.to.not.be.undefined;
+ expect(request.data.placements[0].userIds.eids.length).to.greaterThan(0);
+ for (let index in request.data.placements[0].userIds.eids) {
+ let eid = request.data.placements[0].userIds.eids[index];
+ expect(eid.source).to.not.equal(null).and.to.not.be.undefined;
+ expect(eid.uids).to.not.equal(null).and.to.not.be.undefined;
+ for (let uidsIndex in eid.uids) {
+ let uid = eid.uids[uidsIndex];
+ expect(uid.id).to.not.equal(null).and.to.not.be.undefined;
+ }
+ }
+ });
+
bidderRequest['bids'] = [bidVideo];
serverRequest = spec.buildRequests([bidVideo], bidderRequest);
testServerRequestBody(serverRequest);
diff --git a/test/spec/modules/brightcomBidAdapter_spec.js b/test/spec/modules/brightcomBidAdapter_spec.js
index a89391d681e..b7d52c9f7d5 100644
--- a/test/spec/modules/brightcomBidAdapter_spec.js
+++ b/test/spec/modules/brightcomBidAdapter_spec.js
@@ -247,7 +247,8 @@ describe('brightcomBidAdapter', function() {
'nurl': '',
'adm': '',
'w': 300,
- 'h': 250
+ 'h': 250,
+ 'adomain': ['example.com']
}]
}]
}
@@ -265,7 +266,10 @@ describe('brightcomBidAdapter', function() {
'netRevenue': true,
'mediaType': 'banner',
'ad': ``,
- 'ttl': 60
+ 'ttl': 60,
+ 'meta': {
+ 'advertiserDomains': ['example.com']
+ }
}];
let result = spec.interpretResponse(response);
@@ -283,7 +287,10 @@ describe('brightcomBidAdapter', function() {
'netRevenue': true,
'mediaType': 'banner',
'ad': ``,
- 'ttl': 60
+ 'ttl': 60,
+ 'meta': {
+ 'advertiserDomains': ['example.com']
+ }
}];
let result = spec.interpretResponse(response);
diff --git a/test/spec/modules/buzzoolaBidAdapter_spec.js b/test/spec/modules/buzzoolaBidAdapter_spec.js
index 8a04999219d..312441c4202 100644
--- a/test/spec/modules/buzzoolaBidAdapter_spec.js
+++ b/test/spec/modules/buzzoolaBidAdapter_spec.js
@@ -1,6 +1,7 @@
import {expect} from 'chai';
import {spec} from 'modules/buzzoolaBidAdapter.js';
import {newBidder} from 'src/adapters/bidderFactory.js';
+import '../../../src/prebid.js';
import {executeRenderer, Renderer} from '../../../src/Renderer.js';
import {deepClone} from '../../../src/utils.js';
@@ -54,7 +55,12 @@ const BANNER_RESPONSE = [{
'netRevenue': true,
'ttl': 10800,
'ad': '
',
- 'mediaType': 'banner'
+ 'mediaType': 'banner',
+ 'meta': {
+ 'advertiserDomains': [
+ 'buzzoola.com'
+ ]
+ }
}];
const REQUIRED_BANNER_FIELDS = [
@@ -67,7 +73,8 @@ const REQUIRED_BANNER_FIELDS = [
'creativeId',
'netRevenue',
'currency',
- 'mediaType'
+ 'mediaType',
+ 'meta'
];
const VIDEO_BID = {
@@ -92,17 +99,22 @@ const VIDEO_BID_REQUEST = {
const VIDEO_RESPONSE = [{
'requestId': '325a54271dc40a',
- 'cpm': 4.6158956756756755,
+ 'cpm': 5.528554074074074,
'width': 640,
- 'height': 380,
+ 'height': 480,
'creativeId': '11774',
'dealId': '',
'currency': 'RUB',
'netRevenue': true,
'ttl': 10800,
'ad': '{"crs":[{"advertiser_id":165,"title":"qa//PrebidJStestVideoURL","description":"qa//PrebidJStest","duration":0,"ya_id":"55038886","raw_content":"{\\"main_content\\": \\"https://tube.buzzoola.com/xstatic/o42/mcaug/2.mp4\\"}","content":{"main_content":"https://tube.buzzoola.com/xstatic/o42/mcaug/2.mp4"},"content_type":"video_url","sponsor_link":"","sponsor_name":"","overlay":"","overlay_start_after":0,"overlay_close_after":0,"action_button_title":"","tracking_url":{},"iframe_domains":[],"soc_share_url":"https://tube.buzzoola.com/share.html","player_show_skip_button_before_play":false,"player_show_skip_button_seconds":5,"player_show_title":true,"player_data_attributes":{"expandable":"default","overroll":"default"},"click_event_view":"default","share_panel_position":"left","auto_play":true,"logo_url":{},"share_buttons":["vkontakte","facebook","twitter","moimir","odnoklassniki","embed"],"player_show_panels":false,"thumbnail":"","tracking_js":{},"click_event_url":"https://exchange.buzzoola.com/event/f9382ceb-49c2-4683-50d8-5c516c53cd69/14795a96-6261-49dc-7241-207333ab1490/m7JVQI9Y7J35_gEDugNO2bIiP2qTqPKfuLrqqh_LoJu0tD6PoLEglMXUBzVpSg75c-unsaijXpIERGosa1adogXgqjDml4Pm/click/0/","vpaid_js_url":"https://tube.buzzoola.com/new/js/lib/vpaid_js_proxy.js","skip_clickthru":false,"landing_link_text":"","sound_enabled_by_default":false,"landing_link_position":"right","displayed_price":"","js_wrapper_url":"","enable_moat":false,"branding_template":"","event_url":"https://exchange.buzzoola.com/event/f9382ceb-49c2-4683-50d8-5c516c53cd69/14795a96-6261-49dc-7241-207333ab1490/m7JVQI9Y7J35_gEDugNO2bIiP2qTqPKfuLrqqh_LoJu0tD6PoLEglMXUBzVpSg75c-unsaijXpIERGosa1adogXgqjDml4Pm/","resend_event_url":"https://exchange.buzzoola.com/resend_event/f9382ceb-49c2-4683-50d8-5c516c53cd69/14795a96-6261-49dc-7241-207333ab1490/m7JVQI9Y7J35_gEDugNO2bIiP2qTqPKfuLrqqh_LoJu0tD6PoLEglMXUBzVpSg75c-unsaijXpIERGosa1adogXgqjDml4Pm/","creative_hash":"m7JVQI9Y7J35_gEDugNO2bIiP2qTqPKfuLrqqh_LoJu0tD6PoLEglMXUBzVpSg75c-unsaijXpIERGosa1adogXgqjDml4Pm","custom_html":"","custom_js":"","height":0,"width":0,"campaign_id":5758,"line_item_id":17319,"creative_id":11774,"extra":{"imp_id":"14795a96-6261-49dc-7241-207333ab1490","rtime":"2019-08-27 13:58:36"},"subcontent":"vast","auction_settings":{"price":"4.6158956756756755","currency":"RUB","event_name":"player_seen","time_slice":0},"hash_to_embed":"kbDH64c7yFYkSu0KCwSkoUD2bNHAnUTHBERqLGtWnaIF4Kow5peD5g","need_ad":false}],"tracking_urls":{"ctor":["https://www.tns-counter.ru/V13a****buzzola_com/ru/CP1251/tmsec=buzzola_total/1322650417245790778","https://www.tns-counter.ru/V13a****buzzoola_kz/ru/UTF-8/tmsec=buzzoola_video/5395765100939533275","https://buzzoolaru.solution.weborama.fr/fcgi-bin/dispatch.fcgi?a.A=ev&a.si=3071&a.te=37&a.aap=1&a.agi=862&a.evn=PrebidJS.test&g.ra=4581478478720298652","https://x01.aidata.io/0.gif?pid=BUZZOOLA&id=dbdb5b13-e719-4987-7f6a-a882322bbfce","https://top-fwz1.mail.ru/counter?id=3026769","https://www.tns-counter.ru/V13a****buzzola_com/ru/UTF-8/tmsec=buzzola_inread/542059452789128996","https://dm.hybrid.ai/match?id=111&vid=dbdb5b13-e719-4987-7f6a-a882322bbfce","https://px.adhigh.net/p/cm/buzzoola?u=dbdb5b13-e719-4987-7f6a-a882322bbfce","https://ssp1.rtb.beeline.ru/userbind?src=buz&ssp_user_id=dbdb5b13-e719-4987-7f6a-a882322bbfce","https://sync.upravel.com/image?source=buzzoola&id=dbdb5b13-e719-4987-7f6a-a882322bbfce","https://relap.io/api/partners/bzcs.gif?uid=dbdb5b13-e719-4987-7f6a-a882322bbfce","https://x.bidswitch.net/sync?ssp=sspicyads","https://inv-nets.admixer.net/adxcm.aspx?ssp=3C5173FC-CA30-4692-9116-009C19CB1BF9&rurl=%2F%2Fexchange.buzzoola.com%2Fcookiesync%2Fdsp%2Fadmixer-video%2F%24%24visitor_cookie%24%24","https://sync.datamind.ru/cookie/accepter?source=buzzoola&id=dbdb5b13-e719-4987-7f6a-a882322bbfce","https://dmp.vihub.ru/match?sysid=buz&redir=no&uid=dbdb5b13-e719-4987-7f6a-a882322bbfce","https://ad.adriver.ru/cgi-bin/rle.cgi?sid=1&ad=608223&bt=21&pid=2551979&bid=6150299&bn=6150299&rnd=1279444531737367663","https://reichelcormier.bid/point/?method=match&type=ssp&key=4677290772f9000878093d69c199bfba&id=3509&extUid=dbdb5b13-e719-4987-7f6a-a882322bbfce","https://sync.republer.com/match?src=buzzoola&id=dbdb5b13-e719-4987-7f6a-a882322bbfce","https://sm.rtb.mts.ru/p?id=dbdb5b13-e719-4987-7f6a-a882322bbfce&ssp=buzzoola","https://cm.mgid.com/m?cdsp=371151&adu=https%3A%2F%2Fexchange.buzzoola.com%2Fcookiesync%2Fdsp%2Fmarketgid-native%2F%7Bmuidn%7D","https://dmp.gotechnology.io/dmp/syncsspdmp?sspid=122258"]},"tracking_js":{"ctor":["https://buzzoola.fraudscore.mobi/dooJ9sheeeDaZ3fe.js?s=268671&l=417845"]},"placement":{"placement_id":417845,"unit_type":"inread","unit_settings":{"align":"left","autoplay_enable_sound":false,"creatives_amount":1,"debug_mode":false,"expandable":"never","sound_control":"default","target":"","width":"100%"},"unit_settings_list":["width","sound_control","debug_mode","target","creatives_amount","expandable","container_height","align","height"]},"uuid":"dbdb5b13-e719-4987-7f6a-a882322bbfce","auction_id":"f9382ceb-49c2-4683-50d8-5c516c53cd69","env":"prod"}',
- 'vastXml': '\n00:00:30 ',
- 'mediaType': 'video'
+ 'vastUrl': 'https://exchange.buzzoola.com/prebid/adm/6cfa2ee1-f001-4fab-5582-a62eaee46205/m7JVQI9Y7J35_gEDugNO2bIiP2qTqPKfuLrqqh_LoJu0tD6PoLEglMXUBzVpSg75R6wziBhL0JAERGosa1adogXgqjDml4Pm/?auction_id=92702ce1-2328-4c7a-57aa-41c738e8bb75',
+ 'mediaType': 'video',
+ 'meta': {
+ 'advertiserDomains': [
+ 'buzzoola.com'
+ ]
+ }
}];
const RENDERER_DATA = {
@@ -121,8 +133,107 @@ const REQUIRED_VIDEO_FIELDS = [
'creativeId',
'netRevenue',
'currency',
- 'vastXml',
- 'mediaType'
+ 'vastUrl',
+ 'mediaType',
+ 'meta'
+];
+
+const NATIVE_BID = {
+ 'bidder': 'buzzoola',
+ 'params': {'placementId': 417845},
+ 'mediaTypes': {
+ 'native': {
+ 'image': {
+ 'required': true,
+ 'sizes': [640, 134]
+ },
+ 'title': {
+ 'required': true,
+ 'len': 80
+ },
+ 'sponsoredBy': {
+ 'required': true
+ },
+ 'clickUrl': {
+ 'required': true
+ },
+ 'privacyLink': {
+ 'required': false
+ },
+ 'body': {
+ 'required': true
+ },
+ 'icon': {
+ 'required': true,
+ 'sizes': [50, 50]
+ }
+ }
+ },
+ 'bidId': '22a42cd3522c6f'
+};
+
+const NATIVE_BID_REQUEST = {
+ bidderCode: 'buzzoola',
+ bids: [NATIVE_BID]
+};
+
+const NATIVE_RESPONSE = [{
+ 'requestId': '22a42cd3522c6f',
+ 'cpm': 6.553015238095238,
+ 'width': 600,
+ 'height': 300,
+ 'creativeId': '17970',
+ 'dealId': '',
+ 'currency': 'RUB',
+ 'netRevenue': true,
+ 'ttl': 10800,
+ 'ad': 'https://tube.buzzoola.com/xstatic/o42/stoloto/6',
+ 'mediaType': 'native',
+ 'native': {
+ 'body': 'В 1388-м тираже «Русского лото» джекпот',
+ 'clickTrackers': [
+ 'https://exchange.buzzoola.com/event/6cee890f-1878-4a37-46b3-0107b6c590ae/a1aedc5b-50f2-4a7c-6d24-e235bb1f87ed/m7JVQI9Y7J35_gEDugNO2bIiP2qTqPKfuLrqqh_LoJu0tD6PoLEglMXUBzVpSg75c-unsaijXpJwP8cy-zNH8GX-_nWFkILh/click/'
+ ],
+ 'clickUrl': 'https://ad.doubleclick.net/ddm/trackclk/N250204.3446512BUZZOOLA/B25801892.303578321;dc_trk_aid=496248119;dc_trk_cid=151207455;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=;ltd=?https://stoloto.onelink.me/mEJM?pid=Buzzoola_mb4&c=rl_10_05_2021&is_retargeting=true&af_ios_url=https%3A%2F%2Fapps.apple.com%2Fru%2Fapp%2F%25D1%2581%25D1%2582%25D0%25BE%25D0%25BB%25D0%25BE%25D1%2582%25D0%25BE-%25D1%2583-%25D0%25BD%25D0%25B0%25D1%2581-%25D0%25B2%25D1%258B%25D0%25B8%25D0%25B3%25D1%2580%25D1%258B%25D0%25B2%25D0%25B0%25D1%258E%25D1%2582%2Fid579961527&af_android_url=https%3A%2F%2Fgalaxystore.samsung.com%2Fdetail%2Fru.stoloto.mobile&af_dp=stolotoone%3A%2F%2Fgames&af_web_dp=https%3A%2F%2Fwww.stoloto.ru%2Fruslotto%2Fgame%3Flastdraw%3Fad%3Dbuzzoola_app_dx_rl_10_05_2021%26utm_source%3Dbuzzoola_app_dx%26utm_medium%3Dcpm%26utm_campaign%3Drl_10_05_2021%26utm_content%3Dbuzzoola_app_dx_mob_native_ios_mb4%26utm_term%3D__6ple2-9znjyg_',
+ 'icon': {
+ 'height': '100',
+ 'url': 'https://tube.buzzoola.com/xstatic/o42/stoloto/logo3.png',
+ 'width': '100'
+ },
+ 'image': {
+ 'height': '450',
+ 'url': 'https://tube.buzzoola.com/xstatic/o42/stoloto/6/16x9.png',
+ 'width': '800'
+ },
+ 'impressionTrackers': [
+ 'https://exchange.buzzoola.com/event/6cee890f-1878-4a37-46b3-0107b6c590ae/a1aedc5b-50f2-4a7c-6d24-e235bb1f87ed/m7JVQI9Y7J35_gEDugNO2bIiP2qTqPKfuLrqqh_LoJu0tD6PoLEglMXUBzVpSg75c-unsaijXpJwP8cy-zNH8GX-_nWFkILh/ctor/',
+ 'https://exchange.buzzoola.com/event/6cee890f-1878-4a37-46b3-0107b6c590ae/a1aedc5b-50f2-4a7c-6d24-e235bb1f87ed/m7JVQI9Y7J35_gEDugNO2bIiP2qTqPKfuLrqqh_LoJu0tD6PoLEglMXUBzVpSg75c-unsaijXpJwP8cy-zNH8GX-_nWFkILh/impression/?price=${AUCTION_PRICE}&cur=${AUCTION_CURRENCY}',
+ 'https://exchange.buzzoola.com/event/6cee890f-1878-4a37-46b3-0107b6c590ae/a1aedc5b-50f2-4a7c-6d24-e235bb1f87ed/m7JVQI9Y7J35_gEDugNO2bIiP2qTqPKfuLrqqh_LoJu0tD6PoLEglMXUBzVpSg75c-unsaijXpJwP8cy-zNH8GX-_nWFkILh/player_seen/',
+ 'https://cr.frontend.weborama.fr/cr?key=mailru&url=https%3A%2F%2Fad.mail.ru%2Fcm.gif%3Fp%3D68%26id%3D%7BWEBO_CID%7D'
+ ],
+ 'sponsoredBy': 'Buzzoola',
+ 'title': 'Test PrebidJS Native'
+ },
+ 'meta': {
+ 'advertiserDomains': [
+ 'buzzoola.com'
+ ]
+ }
+}];
+
+const REQUIRED_NATIVE_FIELDS = [
+ 'requestId',
+ 'cpm',
+ 'width',
+ 'height',
+ 'ad',
+ 'native',
+ 'ttl',
+ 'creativeId',
+ 'netRevenue',
+ 'currency',
+ 'mediaType',
+ 'meta'
];
describe('buzzoolaBidAdapter', () => {
@@ -149,18 +260,22 @@ describe('buzzoolaBidAdapter', () => {
describe('buildRequests', () => {
let videoBidRequests = [VIDEO_BID];
let bannerBidRequests = [BANNER_BID];
+ let nativeBidRequests = [NATIVE_BID];
const bannerRequest = spec.buildRequests(bannerBidRequests, BANNER_BID_REQUEST);
+ const nativeRequest = spec.buildRequests(nativeBidRequests, NATIVE_BID_REQUEST);
const videoRequest = spec.buildRequests(videoBidRequests, VIDEO_BID_REQUEST);
it('sends bid request to ENDPOINT via POST', () => {
expect(videoRequest.method).to.equal('POST');
expect(bannerRequest.method).to.equal('POST');
+ expect(nativeRequest.method).to.equal('POST');
});
it('sends bid request to correct ENDPOINT', () => {
expect(videoRequest.url).to.equal(ENDPOINT);
expect(bannerRequest.url).to.equal(ENDPOINT);
+ expect(nativeRequest.url).to.equal(ENDPOINT);
});
it('sends correct video bid parameters', () => {
@@ -170,6 +285,10 @@ describe('buzzoolaBidAdapter', () => {
it('sends correct banner bid parameters', () => {
expect(bannerRequest.data).to.deep.equal(BANNER_BID_REQUEST);
});
+
+ it('sends correct native bid parameters', () => {
+ expect(nativeRequest.data).to.deep.equal(NATIVE_BID_REQUEST);
+ });
});
describe('interpretResponse', () => {
@@ -201,6 +320,10 @@ describe('buzzoolaBidAdapter', () => {
nobidServerResponseCheck(BANNER_BID_REQUEST);
});
+ it('handles native nobid responses', () => {
+ nobidServerResponseCheck(NATIVE_BID_REQUEST);
+ });
+
it('handles video empty responses', () => {
nobidServerResponseCheck(VIDEO_BID_REQUEST, emptyResponse);
});
@@ -209,6 +332,10 @@ describe('buzzoolaBidAdapter', () => {
nobidServerResponseCheck(BANNER_BID_REQUEST, emptyResponse);
});
+ it('handles native empty responses', () => {
+ nobidServerResponseCheck(NATIVE_BID_REQUEST, emptyResponse);
+ });
+
it('should get correct video bid response', () => {
bidServerResponseCheck(VIDEO_RESPONSE, VIDEO_BID_REQUEST, REQUIRED_VIDEO_FIELDS);
});
@@ -216,6 +343,10 @@ describe('buzzoolaBidAdapter', () => {
it('should get correct banner bid response', () => {
bidServerResponseCheck(BANNER_RESPONSE, BANNER_BID_REQUEST, REQUIRED_BANNER_FIELDS);
});
+
+ it('should get correct native bid response', () => {
+ bidServerResponseCheck(NATIVE_RESPONSE, NATIVE_BID_REQUEST, REQUIRED_NATIVE_FIELDS);
+ });
});
describe('outstream renderer', () => {
@@ -268,6 +399,7 @@ describe('buzzoolaBidAdapter', () => {
};
const spy = sinon.spy(window.Buzzoola.Core, 'install');
executeRenderer(renderer, result);
+ renderer.callback();
expect(spy.called).to.be.true;
const spyCall = spy.getCall(0);
diff --git a/test/spec/modules/byplayBidAdapter_spec.js b/test/spec/modules/byplayBidAdapter_spec.js
deleted file mode 100644
index 57aad403c4e..00000000000
--- a/test/spec/modules/byplayBidAdapter_spec.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/byplayBidAdapter.js';
-import { newBidder } from 'src/adapters/bidderFactory.js';
-import * as bidderFactory from 'src/adapters/bidderFactory.js';
-
-describe('byplayBidAdapter', () => {
- describe('isBidRequestValid', () => {
- describe('exist sectionId', () => {
- const bid = {
- 'bidder': 'byplay',
- 'params': {
- 'sectionId': '11111'
- },
- };
-
- it('should equal true', () => {
- expect(spec.isBidRequestValid(bid)).to.equal(true);
- });
- });
-
- describe('not exist sectionId', () => {
- const bid = {
- 'bidder': 'byplay',
- 'params': {
- },
- };
-
- it('should equal false', () => {
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
- });
- });
-
- describe('buildRequests', () => {
- const bids = [
- {
- 'bidder': 'byplay',
- 'bidId': '1234',
- 'params': {
- 'sectionId': '1111'
- },
- }
- ];
-
- const request = spec.buildRequests(bids);
-
- it('should return POST', () => {
- expect(request[0].method).to.equal('POST');
- });
-
- it('should return data', () => {
- expect(request[0].data).to.equal('{"requestId":"1234","sectionId":"1111"}');
- });
- });
-
- describe('interpretResponse', () => {
- const serverResponse = {
- body: {
- 'cpm': 1500,
- 'width': 320,
- 'height': 180,
- 'netRevenue': true,
- 'creativeId': '1',
- 'requestId': '209c1fb5ad88f5',
- 'vastXml': ' '
- }
- };
-
- const bidderRequest = {
- 'method': 'GET',
- 'url': 'https://tasp0g98f2.execute-api.ap-northeast-1.amazonaws.com/v1/bidder',
- 'data': '{"requestId":"209c1fb5ad88f5","sectionId":7986}'
- };
-
- const result = spec.interpretResponse(serverResponse, bidderRequest);
-
- it('should return Array', () => {
- expect(Array.isArray(result)).to.equal(true);
- });
-
- it('should get the correct bid response', () => {
- expect(result[0].cpm).to.equal(1500);
- expect(result[0].creativeId).to.equal('1');
- expect(result[0].width).to.equal(320);
- expect(result[0].height).to.equal(180);
- expect(result[0].mediaType).to.equal('video');
- expect(result[0].netRevenue).to.equal(true);
- expect(result[0].requestId).to.equal('209c1fb5ad88f5');
- expect(result[0].ttl).to.equal(3000);
- expect(result[0].vastXml).to.equal(' ');
- });
- });
-});
diff --git a/test/spec/modules/c1xBidAdapter_spec.js b/test/spec/modules/c1xBidAdapter_spec.js
deleted file mode 100644
index 00741abda7a..00000000000
--- a/test/spec/modules/c1xBidAdapter_spec.js
+++ /dev/null
@@ -1,182 +0,0 @@
-import { expect } from 'chai';
-import { c1xAdapter } from 'modules/c1xBidAdapter.js';
-import { newBidder } from 'src/adapters/bidderFactory.js';
-
-const ENDPOINT = 'https://ht.c1exchange.com/ht';
-const BIDDER_CODE = 'c1x';
-
-describe('C1XAdapter', function () {
- const adapter = newBidder(c1xAdapter);
-
- 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': BIDDER_CODE,
- 'adUnitCode': 'adunit-code',
- 'sizes': [[300, 250], [300, 600]],
- 'params': {
- 'siteId': '9999'
- }
- };
-
- it('should return true when required params are passed', function () {
- expect(c1xAdapter.isBidRequestValid(bid)).to.equal(true);
- });
-
- it('should return false when required params are not found', function () {
- let bid = Object.assign({}, bid);
- delete bid.params;
- bid.params = {
- 'siteId': null
- };
- expect(c1xAdapter.isBidRequestValid(bid)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- let bidRequests = [
- {
- 'bidder': BIDDER_CODE,
- 'params': {
- 'siteId': '9999'
- },
- 'adUnitCode': 'adunit-code',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '30b31c1838de1e',
- 'bidderRequestId': '22edbae2733bf6',
- 'auctionId': '1d1a030790a475',
- }
- ];
-
- const parseRequest = (data) => {
- const parsedData = '{"' + data.replace(/=|&/g, (foundChar) => {
- if (foundChar == '=') return '":"';
- else if (foundChar == '&') return '","';
- }) + '"}'
- return parsedData;
- };
-
- it('sends bid request to ENDPOINT via GET', function () {
- const request = c1xAdapter.buildRequests(bidRequests);
- expect(request.url).to.equal(ENDPOINT);
- expect(request.method).to.equal('GET');
- });
-
- it('should generate correct bid Id tag', function () {
- const request = c1xAdapter.buildRequests(bidRequests);
- expect(request.bids[0].adUnitCode).to.equal('adunit-code');
- expect(request.bids[0].bidId).to.equal('30b31c1838de1e');
- });
-
- it('should convert params to proper form and attach to request', function () {
- const request = c1xAdapter.buildRequests(bidRequests);
- const originalPayload = parseRequest(request.data);
- const payloadObj = JSON.parse(originalPayload);
- expect(payloadObj.adunits).to.equal('1');
- expect(payloadObj.a1s).to.equal('300x250,300x600');
- expect(payloadObj.a1).to.equal('adunit-code');
- expect(payloadObj.site).to.equal('9999');
- });
-
- it('should convert floor price to proper form and attach to request', function () {
- let bidRequest = Object.assign({},
- bidRequests[0],
- {
- 'params': {
- 'siteId': '9999',
- 'floorPriceMap': {
- '300x250': 4.35
- }
- }
- });
- const request = c1xAdapter.buildRequests([bidRequest]);
- const originalPayload = parseRequest(request.data);
- const payloadObj = JSON.parse(originalPayload);
- expect(payloadObj.a1p).to.equal('4.35');
- });
-
- it('should convert pageurl to proper form and attach to request', function () {
- let bidRequest = Object.assign({},
- bidRequests[0],
- {
- 'params': {
- 'siteId': '9999',
- 'pageurl': 'https://c1exchange.com/'
- }
- });
- const request = c1xAdapter.buildRequests([bidRequest]);
- const originalPayload = parseRequest(request.data);
- const payloadObj = JSON.parse(originalPayload);
- expect(payloadObj.pageurl).to.equal('https://c1exchange.com/');
- });
-
- it('should convert GDPR Consent to proper form and attach to request', function () {
- let consentString = 'BOP2gFWOQIFovABABAENBGAAAAAAMw';
- let bidderRequest = {
- 'bidderCode': 'c1x',
- 'gdprConsent': {
- 'consentString': consentString,
- 'gdprApplies': true
- }
- }
- bidderRequest.bids = bidRequests;
-
- const request = c1xAdapter.buildRequests(bidRequests, bidderRequest);
- const originalPayload = parseRequest(request.data);
- const payloadObj = JSON.parse(originalPayload);
- expect(payloadObj['consent_string']).to.equal('BOP2gFWOQIFovABABAENBGAAAAAAMw');
- expect(payloadObj['consent_required']).to.equal('true');
- });
- });
-
- describe('interpretResponse', function () {
- let response = {
- 'bid': true,
- 'cpm': 1.5,
- 'ad': '',
- 'width': 300,
- 'height': 250,
- 'crid': '8888',
- 'adId': 'c1x-test',
- 'bidType': 'GROSS_BID'
- };
-
- it('should get correct bid response', function () {
- let expectedResponse = [
- {
- width: 300,
- height: 250,
- cpm: 1.5,
- ad: '',
- creativeId: '8888',
- currency: 'USD',
- ttl: 300,
- netRevenue: false,
- requestId: 'yyyy'
- }
- ];
- let bidderRequest = {};
- bidderRequest.bids = [
- { adUnitCode: 'c1x-test',
- bidId: 'yyyy' }
- ];
- let result = c1xAdapter.interpretResponse({ body: [response] }, bidderRequest);
- expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
- });
-
- it('handles nobid responses', function () {
- let response = {
- bid: false,
- adId: 'c1x-test'
- };
- let bidderRequest = {};
- let result = c1xAdapter.interpretResponse({ body: [response] }, bidderRequest);
- expect(result.length).to.equal(0);
- });
- });
-});
diff --git a/test/spec/modules/cedatoBidAdapter_spec.js b/test/spec/modules/cedatoBidAdapter_spec.js
deleted file mode 100644
index a7f4875afff..00000000000
--- a/test/spec/modules/cedatoBidAdapter_spec.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import {expect} from 'chai';
-import {spec} from 'modules/cedatoBidAdapter.js';
-
-describe('the cedato adapter', function () {
- function getValidBidObject() {
- return {
- bidId: '2f4a613a702b6c',
- mediaTypes: {
- banner: {
- sizes: [[300, 250]]
- }
- },
- params: {
- player_id: 1450133326,
- }
- };
- };
-
- describe('isBidRequestValid', function() {
- var bid;
-
- beforeEach(function() {
- bid = getValidBidObject();
- });
-
- it('should fail validation if the bid isn\'t defined or not an object', function() {
- var result = spec.isBidRequestValid();
-
- expect(result).to.equal(false);
-
- result = spec.isBidRequestValid('not an object');
-
- expect(result).to.equal(false);
- });
- });
-
- describe('buildRequests', function() {
- var bid, bidRequestObj;
-
- beforeEach(function() {
- bid = getValidBidObject();
- bidRequestObj = {
- refererInfo: {referer: 'prebid.js'},
- gdprConsent: {
- consentString: 'test-string',
- gdprApplies: true
- },
- uspConsent: '1NYN'
- };
- });
-
- it('should build a very basic request', function() {
- var [request] = spec.buildRequests([bid], bidRequestObj);
- expect(request.method).to.equal('POST');
- });
-
- it('should pass gdpr and usp strings to server', function() {
- var [request] = spec.buildRequests([bid], bidRequestObj);
- var payload = JSON.parse(request.data);
- expect(payload.gdpr_consent).to.not.be.undefined;
- expect(payload.gdpr_consent.consent_string).to.equal(bidRequestObj.gdprConsent.consentString);
- expect(payload.gdpr_consent.consent_required).to.equal(bidRequestObj.gdprConsent.gdprApplies);
- expect(payload.us_privacy).to.equal(bidRequestObj.uspConsent);
- });
- });
-
- describe('interpretResponse', function() {
- var bid, serverResponse, bidderRequest;
-
- beforeEach(function() {
- bid = getValidBidObject();
- serverResponse = {
- body: {
- bidid: '0.36157306192821',
- seatbid: [
- {
- seat: '0',
- bid: [{
- gp: {
- 'negative': 0.496954,
- 'positive': 0.503046,
- 'class': '0'
- },
- id: '0.75549202124378',
- adomain: 'cedato.com',
- uuid: bid.bidId,
- crid: '1450133326',
- adm: "
\n\n \n",
- h: 250,
- w: 300,
- price: '0.1'
- }]
- }
- ],
- cur: 'USD'
- }
- };
- bidderRequest = {
- bids: [bid]
- };
- });
-
- it('should return an array of bid responses', function() {
- var responses = spec.interpretResponse(serverResponse, {bidderRequest});
- expect(responses).to.be.an('array').with.length(1);
- });
- });
-
- describe('getUserSyncs', function() {
- var bid;
-
- beforeEach(function() {
- bid = getValidBidObject();
- });
-
- it('should sync with iframe', function() {
- var syncs = spec.getUserSyncs({ iframeEnabled: true }, null, {
- consentString: '',
- gdprApplies: true
- });
-
- expect(syncs).to.be.an('array').with.length(1);
- expect(syncs[0].type).to.equal('iframe');
- });
-
- it('should sync with image', function() {
- var syncs = spec.getUserSyncs({ pixelEnabled: true });
-
- expect(syncs).to.be.an('array').with.length(1);
- expect(syncs[0].type).to.equal('image');
- });
- });
-});
diff --git a/test/spec/modules/cleanmedianetBidAdapter_spec.js b/test/spec/modules/cleanmedianetBidAdapter_spec.js
index 5438f6c8701..c2eea6f32d7 100644
--- a/test/spec/modules/cleanmedianetBidAdapter_spec.js
+++ b/test/spec/modules/cleanmedianetBidAdapter_spec.js
@@ -31,22 +31,6 @@ describe('CleanmedianetAdapter', function () {
).to.equal(true);
});
- it('should validate bid floor', function() {
- expect(
- spec.isBidRequestValid({ params: { supplyPartnerId: '123' } })
- ).to.equal(true); // bidfloor has a default
- expect(
- spec.isBidRequestValid({
- params: { supplyPartnerId: '123', bidfloor: '123' }
- })
- ).to.equal(false);
- expect(
- spec.isBidRequestValid({
- params: { supplyPartnerId: '123', bidfloor: 0.1 }
- })
- ).to.equal(true);
- });
-
it('should validate adpos', function() {
expect(
spec.isBidRequestValid({ params: { supplyPartnerId: '123' } })
@@ -159,15 +143,6 @@ describe('CleanmedianetAdapter', function () {
expect(response.data.imp[0].instl).to.equal(
bidRequestWithInstlEquals0.params.instl
);
- const bidRequestWithBidfloorEquals1 = utils.deepClone(bidRequest);
- bidRequestWithBidfloorEquals1.params.bidfloor = 1;
- response = spec.buildRequests(
- [bidRequestWithBidfloorEquals1],
- bidRequest2
- )[0];
- expect(response.data.imp[0].bidfloor).to.equal(
- bidRequestWithBidfloorEquals1.params.bidfloor
- );
});
it('builds request banner object correctly', function() {
diff --git a/test/spec/modules/clickforceBidAdapter_spec.js b/test/spec/modules/clickforceBidAdapter_spec.js
index dad00f94641..c4c4d77e954 100644
--- a/test/spec/modules/clickforceBidAdapter_spec.js
+++ b/test/spec/modules/clickforceBidAdapter_spec.js
@@ -75,7 +75,10 @@ describe('ClickforceAdapter', function () {
'currency': 'USD',
'ttl': 60,
'netRevenue': true,
- 'zone': '6682'
+ 'zone': '6682',
+ 'adomain': [
+ 'www.example.com'
+ ]
}];
let response1 = [{
@@ -116,6 +119,11 @@ describe('ClickforceAdapter', function () {
'ttl': 60,
'ad': '',
'mediaType': 'banner',
+ 'meta': {
+ 'advertiserDomains': [
+ 'www.example.com'
+ ]
+ }
}];
let expectedResponse1 = [{
@@ -144,6 +152,9 @@ describe('ClickforceAdapter', function () {
},
'clickUrl': 'cu',
'impressionTrackers': ['iu']
+ },
+ 'meta': {
+ 'advertiserDomains': []
}
}];
diff --git a/test/spec/modules/clicktripzBidAdapter_spec.js b/test/spec/modules/clicktripzBidAdapter_spec.js
deleted file mode 100644
index fed94811c4e..00000000000
--- a/test/spec/modules/clicktripzBidAdapter_spec.js
+++ /dev/null
@@ -1,152 +0,0 @@
-import {expect} from 'chai';
-import {spec} from 'modules/clicktripzBidAdapter.js';
-
-const ENDPOINT_URL = 'https://www.clicktripz.com/x/prebid/v1';
-
-describe('clicktripzBidAdapter', function () {
- describe('isBidRequestValid', function () {
- let bid = {
- 'bidder': 'clicktripz',
- 'params': {
- placementId: 'testPlacementId',
- siteId: 'testSiteId'
- },
- 'adUnitCode': 'adunit-code',
- 'sizes': [
- [300, 250]
- ],
- 'bidId': '1234asdf1234',
- 'bidderRequestId': '1234asdf1234asdf',
- 'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf120'
- };
-
- let bid2 = {
- 'bidder': 'clicktripz',
- 'params': {
- placementId: 'testPlacementId'
- },
- 'adUnitCode': 'adunit-code',
- 'sizes': [
- [300, 250]
- ],
- 'bidId': '1234asdf1234',
- 'bidderRequestId': '1234asdf1234asdf',
- 'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf120'
- };
-
- let bid3 = {
- 'bidder': 'clicktripz',
- 'params': {
- siteId: 'testSiteId'
- },
- 'adUnitCode': 'adunit-code',
- 'sizes': [
- [300, 250]
- ],
- 'bidId': '1234asdf1234',
- 'bidderRequestId': '1234asdf1234asdf',
- 'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf120'
- };
-
- 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 found', function () {
- expect(spec.isBidRequestValid(bid2)).to.equal(false);
- expect(spec.isBidRequestValid(bid3)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- let validBidRequests = [{
- 'bidder': 'clicktripz',
- 'params': {
- placementId: 'testPlacementId',
- siteId: 'testSiteId'
- },
- 'sizes': [
- [300, 250],
- [300, 300]
- ],
- 'bidId': '23beaa6af6cdde',
- 'bidderRequestId': '19c0c1efdf37e7',
- 'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
- }, {
- 'bidder': 'clicktripz',
- 'params': {
- placementId: 'testPlacementId2',
- siteId: 'testSiteId2'
- },
- 'sizes': [
- [300, 250]
- ],
- 'bidId': '25beaa6af6cdde',
- 'bidderRequestId': '19c0c1efdf37e7',
- 'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
- }];
-
- const request = spec.buildRequests(validBidRequests);
- it('sends bid request to our endpoint via POST', function () {
- expect(request.method).to.equal('POST');
- });
- it('sends bid request to our endpoint via POST', function () {
- expect(request.method).to.equal('POST');
- });
-
- it('sends bid request to our endpoint at the correct URL', function () {
- expect(request.url).to.equal(ENDPOINT_URL);
- });
- it('sends bid request to our endpoint at the correct URL', function () {
- expect(request.url).to.equal(ENDPOINT_URL);
- });
-
- it('transforms sizes into an array of strings. Pairs of concatenated sizes joined with an x', function () {
- expect(request.data[0].sizes.toString()).to.equal('300x250,300x300');
- });
- it('transforms sizes into an array of strings. Pairs of concatenated sizes joined with an x', function () {
- expect(request.data[1].sizes.toString()).to.equal('300x250');
- });
-
- it('includes bidId, siteId, and placementId in payload', function () {
- expect(request.data[0].bidId).to.equal('23beaa6af6cdde');
- expect(request.data[0].siteId).to.equal('testSiteId');
- expect(request.data[0].placementId).to.equal('testPlacementId');
- });
- it('includes bidId, siteId, and placementId in payload', function () {
- expect(request.data[1].bidId).to.equal('25beaa6af6cdde');
- expect(request.data[1].siteId).to.equal('testSiteId2');
- expect(request.data[1].placementId).to.equal('testPlacementId2');
- });
- });
-
- describe('interpretResponse', function () {
- let serverResponse = {
- body: [{
- 'bidId': 'bid-request-id',
- 'ttl': 120,
- 'netRevenue': true,
- 'size': '300x200',
- 'currency': 'USD',
- 'adUrl': 'https://www.clicktripz.com/n3/crane/v0/render?t=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjoiaHR0cHM6XC9cL3d3dy5jbGlja3RyaXB6LmNvbVwvY2xpY2sucGhwP2NhbXBhaWduSUQ9MTkxNTYmcHJlQ2hlY2tlZD0xJnB1Ymxpc2hlcklEPTM2MCZzZWFyY2hLZXk9N2M5MzQ0NzhlM2M1NTc3Y2EyN2ZmN2Y1NTg5N2NkMzkmc2VhcmNoRGlzcGxheVR5cGU9MSZkaXNwbGF5VHlwZT00JmNyZWF0aXZlVHlwZT1zaW5nbGUmaXNQb3BVbmRlcj0wJnBvc2l0aW9uPTEmdHlwZT0xJmNpdHk9TWFkcmlkJTJDK1NwYWluJmNoZWNrSW5EYXRlPTAzJTJGMDElMkYyMDIwJmNoZWNrT3V0RGF0ZT0wMyUyRjA1JTJGMjAyMCZndWVzdHM9MiZyb29tcz0xIn0.WBDGYr1qfkSvOuK02VpMW3iAua1E02jjDGDViFc2kaE',
- 'creativeId': '25ef9876abc5681f153',
- 'cpm': 50
- }]
- };
- it('should get the correct bid response', function () {
- let expectedResponse = [{
- 'requestId': 'bid-request-id',
- 'cpm': 50,
- 'netRevenue': true,
- 'width': '300',
- 'height': '200',
- 'creativeId': '25ef9876abc5681f153',
- 'currency': 'USD',
- 'adUrl': 'https://www.clicktripz.com/n3/crane/v0/render?t=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjoiaHR0cHM6XC9cL3d3dy5jbGlja3RyaXB6LmNvbVwvY2xpY2sucGhwP2NhbXBhaWduSUQ9MTkxNTYmcHJlQ2hlY2tlZD0xJnB1Ymxpc2hlcklEPTM2MCZzZWFyY2hLZXk9N2M5MzQ0NzhlM2M1NTc3Y2EyN2ZmN2Y1NTg5N2NkMzkmc2VhcmNoRGlzcGxheVR5cGU9MSZkaXNwbGF5VHlwZT00JmNyZWF0aXZlVHlwZT1zaW5nbGUmaXNQb3BVbmRlcj0wJnBvc2l0aW9uPTEmdHlwZT0xJmNpdHk9TWFkcmlkJTJDK1NwYWluJmNoZWNrSW5EYXRlPTAzJTJGMDElMkYyMDIwJmNoZWNrT3V0RGF0ZT0wMyUyRjA1JTJGMjAyMCZndWVzdHM9MiZyb29tcz0xIn0.WBDGYr1qfkSvOuK02VpMW3iAua1E02jjDGDViFc2kaE',
- 'ttl': 120
- }];
- let result = spec.interpretResponse(serverResponse);
- expect(result).to.deep.equal(expectedResponse);
- });
- });
-});
diff --git a/test/spec/modules/coinzillaBidAdapter_spec.js b/test/spec/modules/coinzillaBidAdapter_spec.js
index a3438b80126..01f22722abf 100644
--- a/test/spec/modules/coinzillaBidAdapter_spec.js
+++ b/test/spec/modules/coinzillaBidAdapter_spec.js
@@ -85,7 +85,6 @@ describe('coinzillaBidAdapter', function () {
'bidId': 'bidId123',
'referer': 'www.example.com'
}
-
}
];
let serverResponse = {
@@ -98,7 +97,9 @@ describe('coinzillaBidAdapter', function () {
'requestId': 'bidId123',
'width': 300,
'height': 250,
- 'netRevenue': true
+ 'netRevenue': true,
+ 'mediaType': 'banner',
+ 'advertiserDomain': ['none.com']
}
};
it('should get the correct bid response', function () {
@@ -111,7 +112,9 @@ describe('coinzillaBidAdapter', function () {
'currency': 'EUR',
'netRevenue': true,
'ttl': 3000,
- 'ad': 'I am an ad '
+ 'ad': 'I am an ad ',
+ 'mediaType': 'banner',
+ 'meta': {'advertiserDomains': ['none.com']}
}];
let result = spec.interpretResponse(serverResponse, bidRequest[0]);
expect(Object.keys(result)).to.deep.equal(Object.keys(expectedResponse));
diff --git a/test/spec/modules/collectcentBidAdapter_spec.js b/test/spec/modules/collectcentBidAdapter_spec.js
deleted file mode 100644
index 0ab83a8024b..00000000000
--- a/test/spec/modules/collectcentBidAdapter_spec.js
+++ /dev/null
@@ -1,118 +0,0 @@
-import {expect} from 'chai';
-import {spec} from '../../../modules/collectcentBidAdapter.js';
-
-describe('Collectcent', function () {
- let bid = {
- bidId: '2dd581a2b6281d',
- bidder: 'collectcent',
- bidderRequestId: '145e1d6a7837c9',
- params: {
- placementId: 123,
- traffic: 'banner'
- },
- placementCode: 'placement_0',
- auctionId: '74f78609-a92d-4cf1-869f-1b244bbfb5d2',
- sizes: [[300, 250]],
- transactionId: '3bb2f6da-87a6-4029-aeb0-bfe951372e62'
- };
-
- describe('isBidRequestValid', function () {
- it('Should return true when placementId can be cast to a number', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
- });
- it('Should return false when placementId is not a number', function () {
- bid.params.placementId = 'aaa';
- expect(spec.isBidRequestValid(bid)).to.be.false;
- });
- });
-
- describe('buildRequests', function () {
- let serverRequest = spec.buildRequests([bid]);
- it('Creates a ServerRequest object with method, URL and data', function () {
- expect(serverRequest).to.exist;
- expect(serverRequest.method).to.exist;
- expect(serverRequest.url).to.exist;
- expect(serverRequest.data).to.exist;
- });
- it('Returns POST method', function () {
- expect(serverRequest.method).to.equal('POST');
- });
- it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://publishers.motionspots.com/?c=o&m=multi');
- });
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'secure', 'host', 'page', 'placements');
- expect(data.deviceWidth).to.be.a('number');
- expect(data.deviceHeight).to.be.a('number');
- expect(data.secure).to.be.within(0, 1);
- expect(data.host).to.be.a('string');
- expect(data.page).to.be.a('string');
- let placements = data['placements'];
- for (let i = 0; i < placements.length; i++) {
- let placement = placements[i];
- expect(placement).to.have.all.keys('placementId', 'bidId', 'traffic', 'sizes');
- expect(placement.placementId).to.be.a('number');
- expect(placement.bidId).to.be.a('string');
- expect(placement.traffic).to.be.a('string');
- expect(placement.sizes).to.be.an('array');
- }
- });
- it('Returns empty data if no valid requests are passed', function () {
- serverRequest = spec.buildRequests([]);
- let data = serverRequest.data;
- expect(data.placements).to.be.an('array').that.is.empty;
- });
- });
- describe('interpretResponse', function () {
- let resObject = {
- body: [ {
- requestId: '123',
- mediaType: 'banner',
- cpm: 0.3,
- width: 320,
- height: 50,
- ad: 'Hello ad ',
- ttl: 1000,
- creativeId: '123asd',
- netRevenue: true,
- currency: 'USD'
- } ]
- };
- let serverResponses = spec.interpretResponse(resObject);
- it('Returns an array of valid server responses if response object is valid', function () {
- expect(serverResponses).to.be.an('array').that.is.not.empty;
- for (let i = 0; i < serverResponses.length; i++) {
- let dataItem = serverResponses[i];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'mediaType');
- expect(dataItem.requestId).to.be.a('string');
- expect(dataItem.cpm).to.be.a('number');
- expect(dataItem.width).to.be.a('number');
- expect(dataItem.height).to.be.a('number');
- expect(dataItem.ad).to.be.a('string');
- expect(dataItem.ttl).to.be.a('number');
- expect(dataItem.creativeId).to.be.a('string');
- expect(dataItem.netRevenue).to.be.a('boolean');
- expect(dataItem.currency).to.be.a('string');
- expect(dataItem.mediaType).to.be.a('string');
- }
- it('Returns an empty array if invalid response is passed', function () {
- serverResponses = spec.interpretResponse('invalid_response');
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- });
- });
-
- describe('getUserSyncs', function () {
- let userSync = spec.getUserSyncs();
- it('Returns valid URL and `', function () {
- expect(userSync).to.be.an('array').with.lengthOf(1);
- expect(userSync[0].type).to.exist;
- expect(userSync[0].url).to.exist;
- expect(userSync[0].type).to.be.equal('image');
- expect(userSync[0].url).to.be.equal('https://publishers.motionspots.com/?c=o&m=cookie');
- });
- });
-});
diff --git a/test/spec/modules/colombiaBidAdapter_spec.js b/test/spec/modules/colombiaBidAdapter_spec.js
deleted file mode 100644
index 4e80c6b1d9d..00000000000
--- a/test/spec/modules/colombiaBidAdapter_spec.js
+++ /dev/null
@@ -1,152 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/colombiaBidAdapter';
-import { newBidder } from 'src/adapters/bidderFactory';
-
-const HOST_NAME = document.location.protocol + '//' + window.location.host;
-const ENDPOINT = 'https://ade.clmbtech.com/cde/prebid.htm';
-
-describe('colombiaBidAdapter', function() {
- const adapter = newBidder(spec);
-
- describe('isBidRequestValid', function () {
- let bid = {
- 'bidder': 'colombia',
- 'params': {
- placementId: '307466'
- },
- 'adUnitCode': 'adunit-code',
- 'sizes': [
- [300, 250]
- ],
- 'bidId': '23beaa6af6cdde',
- 'bidderRequestId': '19c0c1efdf37e7',
- 'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
- };
-
- it('should return true when required params found', function () {
- expect(spec.isBidRequestValid(bid)).to.equal(true);
- });
-
- it('should return false when placementId not passed correctly', function () {
- bid.params.placementId = '';
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
-
- it('should return false when require params are not passed', function () {
- let bid = Object.assign({}, bid);
- bid.params = {};
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- let bidRequests = [
- {
- 'bidder': 'colombia',
- 'params': {
- placementId: '307466'
- },
- 'adUnitCode': 'adunit-code1',
- 'sizes': [
- [300, 250]
- ],
- 'bidId': '23beaa6af6cdde',
- 'bidderRequestId': '19c0c1efdf37e7',
- 'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
- },
- {
- 'bidder': 'colombia',
- 'params': {
- placementId: '307466'
- },
- 'adUnitCode': 'adunit-code2',
- 'sizes': [
- [300, 250]
- ],
- 'bidId': '382091349b149f"',
- 'bidderRequestId': '"1f9c98192de251"',
- 'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
- }
- ];
-
- const request = spec.buildRequests(bidRequests);
-
- it('sends bid request to our endpoint via POST', function () {
- expect(request[0].method).to.equal('POST');
- expect(request[1].method).to.equal('POST');
- });
-
- it('attaches source and version to endpoint URL as query params', function () {
- expect(request[0].url).to.equal(ENDPOINT);
- expect(request[1].url).to.equal(ENDPOINT);
- });
- });
-
- describe('interpretResponse', function () {
- let bidRequest = [
- {
- 'method': 'POST',
- 'url': 'https://ade.clmbtech.com/cde/prebid.htm',
- 'data': {
- 'v': 'hb1',
- 'p': '307466',
- 'w': '300',
- 'h': '250',
- 'cb': 12892917383,
- 'r': 'http%3A%2F%2Flocalhost%3A9876%2F%3Fid%3D74552836',
- 'uid': '23beaa6af6cdde',
- 't': 'i',
- }
- }
- ];
-
- let serverResponse = {
- body: {
- 'ad': 'This is test case for colombia adapter
',
- 'cpm': 3.14,
- 'creativeId': '6b958110-612c-4b03-b6a9-7436c9f746dc-1sk24',
- 'currency': 'USD',
- 'uid': '23beaa6af6cdde',
- 'width': 728,
- 'height': 90,
- 'netRevenue': true,
- 'ttl': 600,
- 'dealid': '',
- 'referrer': 'http%3A%2F%2Flocalhost%3A9876%2F%3Fid%3D74552836'
- }
- };
-
- it('should get the correct bid response', function () {
- let expectedResponse = [{
- 'requestId': '23beaa6af6cdde',
- 'cpm': 3.14,
- 'width': 728,
- 'height': 90,
- 'creativeId': '6b958110-612c-4b03-b6a9-7436c9f746dc-1sk24',
- 'dealId': '',
- 'currency': 'USD',
- 'netRevenue': true,
- 'ttl': 300,
- 'referrer': 'http%3A%2F%2Flocalhost%3A9876%2F%3Fid%3D74552836',
- 'ad': 'This is test case for colombia adapter
'
- }];
- let result = spec.interpretResponse(serverResponse, bidRequest[0]);
- expect(Object.keys(result[0])).to.deep.equal(Object.keys(expectedResponse[0]));
- });
-
- it('handles empty bid response', function () {
- let response = {
- body: {
- 'uid': '23beaa6af6cdde',
- 'height': 0,
- 'creativeId': '',
- 'statusMessage': 'Bid returned empty or error response',
- 'width': 0,
- 'cpm': 0
- }
- };
- let result = spec.interpretResponse(response, bidRequest[0]);
- expect(result.length).to.equal(0);
- });
- });
-});
diff --git a/test/spec/modules/colossussspBidAdapter_spec.js b/test/spec/modules/colossussspBidAdapter_spec.js
deleted file mode 100644
index f6e24d07c63..00000000000
--- a/test/spec/modules/colossussspBidAdapter_spec.js
+++ /dev/null
@@ -1,185 +0,0 @@
-import {expect} from 'chai';
-import {spec} from '../../../modules/colossussspBidAdapter.js';
-
-describe('ColossussspAdapter', function () {
- let bid = {
- bidId: '2dd581a2b6281d',
- bidder: 'colossusssp',
- bidderRequestId: '145e1d6a7837c9',
- params: {
- placement_id: 0
- },
- placementCode: 'placementid_0',
- auctionId: '74f78609-a92d-4cf1-869f-1b244bbfb5d2',
- mediaTypes: {
- banner: {
- sizes: [[300, 250]]
- }
- },
- transactionId: '3bb2f6da-87a6-4029-aeb0-bfe951372e62',
- schain: {
- ver: '1.0',
- complete: 1,
- nodes: [
- {
- asi: 'example.com',
- sid: '0',
- hp: 1,
- rid: 'bidrequestid',
- // name: 'alladsallthetime',
- domain: 'example.com'
- }
- ]
- }
- };
- let bidderRequest = {
- bidderCode: 'colossus',
- auctionId: 'fffffff-ffff-ffff-ffff-ffffffffffff',
- bidderRequestId: 'ffffffffffffff',
- start: 1472239426002,
- auctionStart: 1472239426000,
- timeout: 5000,
- uspConsent: '1YN-',
- refererInfo: {
- referer: 'http://www.example.com',
- reachedTop: true,
- },
- bids: [bid]
- }
-
- describe('isBidRequestValid', function () {
- it('Should return true when placement_id can be cast to a number', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
- });
- it('Should return false when placement_id is not a number', function () {
- bid.params.placement_id = 'aaa';
- expect(spec.isBidRequestValid(bid)).to.be.false;
- });
- });
-
- describe('buildRequests', function () {
- let serverRequest = spec.buildRequests([bid], bidderRequest);
- it('Creates a ServerRequest object with method, URL and data', function () {
- expect(serverRequest).to.exist;
- expect(serverRequest.method).to.exist;
- expect(serverRequest.url).to.exist;
- expect(serverRequest.data).to.exist;
- });
- it('Returns POST method', function () {
- expect(serverRequest.method).to.equal('POST');
- });
- it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://colossusssp.com/?c=o&m=multi');
- });
- it('Should contain ccpa', function() {
- expect(serverRequest.data.ccpa).to.be.an('string')
- })
-
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'secure', 'host', 'page', 'placements', 'ccpa');
- expect(data.deviceWidth).to.be.a('number');
- expect(data.deviceHeight).to.be.a('number');
- expect(data.language).to.be.a('string');
- expect(data.secure).to.be.within(0, 1);
- expect(data.host).to.be.a('string');
- expect(data.page).to.be.a('string');
- let placements = data['placements'];
- for (let i = 0; i < placements.length; i++) {
- let placement = placements[i];
- expect(placement).to.have.all.keys('placementId', 'eids', 'bidId', 'traffic', 'sizes', 'schain', 'floor');
- expect(placement.schain).to.be.an('object')
- expect(placement.placementId).to.be.a('number');
- expect(placement.bidId).to.be.a('string');
- expect(placement.traffic).to.be.a('string');
- expect(placement.sizes).to.be.an('array');
- expect(placement.floor).to.be.an('object');
- }
- });
- it('Returns empty data if no valid requests are passed', function () {
- serverRequest = spec.buildRequests([]);
- let data = serverRequest.data;
- expect(data.placements).to.be.an('array').that.is.empty;
- });
- });
-
- describe('buildRequests with user ids', function () {
- bid.userId = {}
- bid.userId.britepoolid = 'britepoolid123';
- bid.userId.idl_env = 'idl_env123';
- bid.userId.tdid = 'tdid123';
- bid.userId.id5id = { uid: 'id5id123' };
- let serverRequest = spec.buildRequests([bid], bidderRequest);
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- let placements = data['placements'];
- expect(data).to.be.an('object');
- for (let i = 0; i < placements.length; i++) {
- let placement = placements[i];
- expect(placement).to.have.property('eids')
- expect(placement.eids).to.be.an('array')
- expect(placement.eids.length).to.be.equal(4)
- for (let index in placement.eids) {
- let v = placement.eids[index];
- expect(v).to.have.all.keys('source', 'uids')
- expect(v.source).to.be.oneOf(['britepool.com', 'identityLink', 'adserver.org', 'id5-sync.com'])
- expect(v.uids).to.be.an('array');
- expect(v.uids.length).to.be.equal(1)
- expect(v.uids[0]).to.have.property('id')
- }
- }
- });
- });
-
- describe('interpretResponse', function () {
- let resObject = {
- body: [ {
- requestId: '123',
- mediaType: 'banner',
- cpm: 0.3,
- width: 320,
- height: 50,
- ad: 'Hello ad ',
- ttl: 1000,
- creativeId: '123asd',
- netRevenue: true,
- currency: 'USD'
- } ]
- };
- let serverResponses = spec.interpretResponse(resObject);
- it('Returns an array of valid server responses if response object is valid', function () {
- expect(serverResponses).to.be.an('array').that.is.not.empty;
- for (let i = 0; i < serverResponses.length; i++) {
- let dataItem = serverResponses[i];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'mediaType');
- expect(dataItem.requestId).to.be.a('string');
- expect(dataItem.cpm).to.be.a('number');
- expect(dataItem.width).to.be.a('number');
- expect(dataItem.height).to.be.a('number');
- expect(dataItem.ad).to.be.a('string');
- expect(dataItem.ttl).to.be.a('number');
- expect(dataItem.creativeId).to.be.a('string');
- expect(dataItem.netRevenue).to.be.a('boolean');
- expect(dataItem.currency).to.be.a('string');
- expect(dataItem.mediaType).to.be.a('string');
- }
- it('Returns an empty array if invalid response is passed', function () {
- serverResponses = spec.interpretResponse('invalid_response');
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- });
- });
-
- describe('getUserSyncs', function () {
- let userSync = spec.getUserSyncs();
- it('Returns valid URL and type', function () {
- expect(userSync).to.be.an('array').with.lengthOf(1);
- expect(userSync[0].type).to.exist;
- expect(userSync[0].url).to.exist;
- expect(userSync[0].type).to.be.equal('image');
- expect(userSync[0].url).to.be.equal('https://colossusssp.com/?c=o&m=cookie');
- });
- });
-});
diff --git a/test/spec/modules/consumableBidAdapter_spec.js b/test/spec/modules/consumableBidAdapter_spec.js
index 44076194885..f0b02913f96 100644
--- a/test/spec/modules/consumableBidAdapter_spec.js
+++ b/test/spec/modules/consumableBidAdapter_spec.js
@@ -299,6 +299,7 @@ describe('Consumable BidAdapter', function () {
expect(b).to.have.property('currency', 'USD');
expect(b).to.have.property('creativeId');
expect(b).to.have.property('ttl', 30);
+ expect(b.meta).to.have.property('advertiserDomains');
expect(b).to.have.property('netRevenue', true);
expect(b).to.have.property('referrer');
});
diff --git a/test/spec/modules/convergeBidAdapter_spec.js b/test/spec/modules/convergeBidAdapter_spec.js
deleted file mode 100644
index e92ed475497..00000000000
--- a/test/spec/modules/convergeBidAdapter_spec.js
+++ /dev/null
@@ -1,899 +0,0 @@
-import { expect } from 'chai';
-import { spec, resetUserSync, getSyncUrl } from 'modules/convergeBidAdapter.js';
-import { newBidder } from 'src/adapters/bidderFactory.js';
-
-describe('ConvergeAdapter', 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': 'converge',
- 'params': {
- 'uid': '1'
- },
- 'adUnitCode': 'adunit-code',
- '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 = {
- 'uid': 0
- };
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- function parseRequest(url) {
- const res = {};
- url.split('&').forEach((it) => {
- const couple = it.split('=');
- res[couple[0]] = decodeURIComponent(couple[1]);
- });
- return res;
- }
-
- const bidderRequest = {
- refererInfo: {
- referer: 'https://example.com'
- }
- };
- const referrer = bidderRequest.refererInfo.referer;
-
- let bidRequests = [
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '59'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '30b31c1838de1e',
- 'bidderRequestId': '22edbae2733bf6',
- 'auctionId': '1d1a030790a475',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '59'
- },
- 'adUnitCode': 'adunit-code-2',
- 'sizes': [[728, 90], [300, 250]],
- 'bidId': '3150ccb55da321',
- 'bidderRequestId': '22edbae2733bf6',
- 'auctionId': '1d1a030790a475',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '60'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '42dbe3a7168a6a',
- 'bidderRequestId': '22edbae2733bf6',
- 'auctionId': '1d1a030790a475',
- }
- ];
-
- it('should attach valid params to the tag', function () {
- const request = spec.buildRequests([bidRequests[0]], bidderRequest);
- expect(request.data).to.be.an('string');
- const payload = parseRequest(request.data);
- expect(payload).to.have.property('u', referrer);
- expect(payload).to.have.property('pt', 'net');
- expect(payload).to.have.property('auids', '59');
- expect(payload).to.have.property('sizes', '300x250,300x600');
- expect(payload).to.have.property('r', '22edbae2733bf6');
- expect(payload).to.have.property('wrapperType', 'Prebid_js');
- expect(payload).to.have.property('wrapperVersion', '$prebid.version$');
- });
-
- it('sizes must not be duplicated', function () {
- const request = spec.buildRequests(bidRequests, bidderRequest);
- expect(request.data).to.be.an('string');
- const payload = parseRequest(request.data);
- expect(payload).to.have.property('u', referrer);
- expect(payload).to.have.property('pt', 'net');
- expect(payload).to.have.property('auids', '59,59,60');
- expect(payload).to.have.property('sizes', '300x250,300x600,728x90');
- expect(payload).to.have.property('r', '22edbae2733bf6');
- });
-
- it('pt parameter must be "gross" if params.priceType === "gross"', function () {
- bidRequests[1].params.priceType = 'gross';
- const request = spec.buildRequests(bidRequests, bidderRequest);
- expect(request.data).to.be.an('string');
- const payload = parseRequest(request.data);
- expect(payload).to.have.property('u', referrer);
- expect(payload).to.have.property('pt', 'gross');
- expect(payload).to.have.property('auids', '59,59,60');
- expect(payload).to.have.property('sizes', '300x250,300x600,728x90');
- expect(payload).to.have.property('r', '22edbae2733bf6');
- delete bidRequests[1].params.priceType;
- });
-
- it('pt parameter must be "net" or "gross"', function () {
- bidRequests[1].params.priceType = 'some';
- const request = spec.buildRequests(bidRequests, bidderRequest);
- expect(request.data).to.be.an('string');
- const payload = parseRequest(request.data);
- expect(payload).to.have.property('u', referrer);
- expect(payload).to.have.property('pt', 'net');
- expect(payload).to.have.property('auids', '59,59,60');
- expect(payload).to.have.property('sizes', '300x250,300x600,728x90');
- expect(payload).to.have.property('r', '22edbae2733bf6');
- delete bidRequests[1].params.priceType;
- });
-
- it('if gdprConsent is present payload must have gdpr params', function () {
- const bidderRequestWithGDPR = Object.assign({gdprConsent: {consentString: 'AAA', gdprApplies: true}}, bidderRequest);
- const request = spec.buildRequests(bidRequests, bidderRequestWithGDPR);
- expect(request.data).to.be.an('string');
- const payload = parseRequest(request.data);
- expect(payload).to.have.property('gdpr_consent', 'AAA');
- expect(payload).to.have.property('gdpr_applies', '1');
- });
-
- it('if gdprApplies is false gdpr_applies must be 0', function () {
- const bidderRequestWithGDPR = Object.assign({gdprConsent: {consentString: 'AAA', gdprApplies: false}}, bidderRequest);
- const request = spec.buildRequests(bidRequests, bidderRequestWithGDPR);
- expect(request.data).to.be.an('string');
- const payload = parseRequest(request.data);
- expect(payload).to.have.property('gdpr_consent', 'AAA');
- expect(payload).to.have.property('gdpr_applies', '0');
- });
-
- it('if gdprApplies is undefined gdpr_applies must be 1', function () {
- const bidderRequestWithGDPR = Object.assign({gdprConsent: {consentString: 'AAA'}}, bidderRequest);
- const request = spec.buildRequests(bidRequests, bidderRequestWithGDPR);
- expect(request.data).to.be.an('string');
- const payload = parseRequest(request.data);
- expect(payload).to.have.property('gdpr_consent', 'AAA');
- expect(payload).to.have.property('gdpr_applies', '1');
- });
-
- it('if usPrivacy is present payload must have us_privacy param', function () {
- const bidderRequestWithUSP = Object.assign({uspConsent: '1YNN'}, bidderRequest);
- const request = spec.buildRequests(bidRequests, bidderRequestWithUSP);
- expect(request.data).to.be.an('string');
- const payload = parseRequest(request.data);
- expect(payload).to.have.property('us_privacy', '1YNN');
- });
-
- it('should convert keyword params to proper form and attaches to request', function () {
- const bidRequestWithKeywords = [].concat(bidRequests);
- bidRequestWithKeywords[1] = Object.assign({},
- bidRequests[1],
- {
- params: {
- uid: '59',
- keywords: {
- single: 'val',
- singleArr: ['val'],
- singleArrNum: [5],
- multiValMixed: ['value1', 2, 'value3'],
- singleValNum: 123,
- emptyStr: '',
- emptyArr: [''],
- badValue: {'foo': 'bar'} // should be dropped
- }
- }
- }
- );
-
- const request = spec.buildRequests(bidRequestWithKeywords, bidderRequest);
- expect(request.data).to.be.an('string');
- const payload = parseRequest(request.data);
- expect(payload.keywords).to.be.an('string');
- payload.keywords = JSON.parse(payload.keywords);
-
- expect(payload.keywords).to.deep.equal([{
- 'key': 'single',
- 'value': ['val']
- }, {
- 'key': 'singleArr',
- 'value': ['val']
- }, {
- 'key': 'singleArrNum',
- 'value': ['5']
- }, {
- 'key': 'multiValMixed',
- 'value': ['value1', '2', 'value3']
- }, {
- 'key': 'singleValNum',
- 'value': ['123']
- }, {
- 'key': 'emptyStr'
- }, {
- 'key': 'emptyArr'
- }]);
- });
- });
-
- describe('interpretResponse', function () {
- const responses = [
- {'bid': [{'price': 1.15, 'adm': 'test content 1
', 'auid': 59, 'h': 250, 'w': 300}], 'seat': '1'},
- {'bid': [{'price': 0.5, 'adm': 'test content 2
', 'auid': 60, 'h': 600, 'w': 300}], 'seat': '1'},
- {'bid': [{'price': 0.15, 'adm': 'test content 3
', 'auid': 59, 'h': 90, 'w': 728}], 'seat': '1'},
- {'bid': [{'price': 0, 'auid': 61, 'h': 250, 'w': 300}], 'seat': '1'},
- {'bid': [{'price': 0, 'adm': 'test content 5
', 'h': 250, 'w': 300}], 'seat': '1'},
- undefined,
- {'bid': [], 'seat': '1'},
- {'seat': '1'},
- ];
-
- it('should get correct bid response', function () {
- const bidRequests = [
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '59'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '659423fff799cb',
- 'bidderRequestId': '5f2009617a7c0a',
- 'auctionId': '1cbd2feafe5e8b',
- }
- ];
- const request = spec.buildRequests(bidRequests);
- const expectedResponse = [
- {
- 'requestId': '659423fff799cb',
- 'cpm': 1.15,
- 'creativeId': 59,
- 'dealId': undefined,
- 'width': 300,
- 'height': 250,
- 'ad': 'test content 1
',
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'banner',
- 'netRevenue': true,
- 'ttl': 360,
- }
- ];
-
- const result = spec.interpretResponse({'body': {'seatbid': [responses[0]]}}, request);
- expect(result).to.deep.equal(expectedResponse);
- });
-
- it('should get correct multi bid response', function () {
- const bidRequests = [
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '59'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '300bfeb0d71a5b',
- 'bidderRequestId': '2c2bb1972df9a',
- 'auctionId': '1fa09aee5c8c99',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '60'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '4dff80cc4ee346',
- 'bidderRequestId': '2c2bb1972df9a',
- 'auctionId': '1fa09aee5c8c99',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '59'
- },
- 'adUnitCode': 'adunit-code-2',
- 'sizes': [[728, 90]],
- 'bidId': '5703af74d0472a',
- 'bidderRequestId': '2c2bb1972df9a',
- 'auctionId': '1fa09aee5c8c99',
- }
- ];
- const request = spec.buildRequests(bidRequests);
- const expectedResponse = [
- {
- 'requestId': '300bfeb0d71a5b',
- 'cpm': 1.15,
- 'creativeId': 59,
- 'dealId': undefined,
- 'width': 300,
- 'height': 250,
- 'ad': 'test content 1
',
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'banner',
- 'netRevenue': true,
- 'ttl': 360,
- },
- {
- 'requestId': '4dff80cc4ee346',
- 'cpm': 0.5,
- 'creativeId': 60,
- 'dealId': undefined,
- 'width': 300,
- 'height': 600,
- 'ad': 'test content 2
',
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'banner',
- 'netRevenue': true,
- 'ttl': 360,
- },
- {
- 'requestId': '5703af74d0472a',
- 'cpm': 0.15,
- 'creativeId': 59,
- 'dealId': undefined,
- 'width': 728,
- 'height': 90,
- 'ad': 'test content 3
',
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'banner',
- 'netRevenue': true,
- 'ttl': 360,
- }
- ];
-
- const result = spec.interpretResponse({'body': {'seatbid': responses.slice(0, 3)}}, request);
- expect(result).to.deep.equal(expectedResponse);
- });
-
- it('handles wrong and nobid responses', function () {
- const bidRequests = [
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '61'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '300bfeb0d7190gf',
- 'bidderRequestId': '2c2bb1972d23af',
- 'auctionId': '1fa09aee5c84d34',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '65'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '300bfeb0d71321',
- 'bidderRequestId': '2c2bb1972d23af',
- 'auctionId': '1fa09aee5c84d34',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '70'
- },
- 'adUnitCode': 'adunit-code-2',
- 'sizes': [[728, 90]],
- 'bidId': '300bfeb0d7183bb',
- 'bidderRequestId': '2c2bb1972d23af',
- 'auctionId': '1fa09aee5c84d34',
- }
- ];
- const request = spec.buildRequests(bidRequests);
- const result = spec.interpretResponse({'body': {'seatbid': responses.slice(3)}}, request);
- expect(result.length).to.equal(0);
- });
-
- it('complicated case', function () {
- const fullResponse = [
- {'bid': [{'price': 1.15, 'adm': 'test content 1
', 'auid': 59, 'h': 250, 'w': 300}], 'seat': '1'},
- {'bid': [{'price': 0.5, 'adm': 'test content 2
', 'auid': 60, 'h': 600, 'w': 300}], 'seat': '1'},
- {'bid': [{'price': 0.15, 'adm': 'test content 3
', 'auid': 59, 'h': 90, 'w': 728}], 'seat': '1'},
- {'bid': [{'price': 0.15, 'adm': 'test content 4
', 'auid': 59, 'h': 600, 'w': 300}], 'seat': '1'},
- {'bid': [{'price': 0.5, 'adm': 'test content 5
', 'auid': 60, 'h': 600, 'w': 350}], 'seat': '1'},
- ];
- const bidRequests = [
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '59'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '2164be6358b9',
- 'bidderRequestId': '106efe3247',
- 'auctionId': '32a1f276cb87cb8',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '59'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '326bde7fbf69',
- 'bidderRequestId': '106efe3247',
- 'auctionId': '32a1f276cb87cb8',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '60'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '4e111f1b66e4',
- 'bidderRequestId': '106efe3247',
- 'auctionId': '32a1f276cb87cb8',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '59'
- },
- 'adUnitCode': 'adunit-code-2',
- 'sizes': [[728, 90]],
- 'bidId': '26d6f897b516',
- 'bidderRequestId': '106efe3247',
- 'auctionId': '32a1f276cb87cb8',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '60'
- },
- 'adUnitCode': 'adunit-code-2',
- 'sizes': [[728, 90]],
- 'bidId': '1751cd90161',
- 'bidderRequestId': '106efe3247',
- 'auctionId': '32a1f276cb87cb8',
- }
- ];
- const request = spec.buildRequests(bidRequests);
- const expectedResponse = [
- {
- 'requestId': '2164be6358b9',
- 'cpm': 1.15,
- 'creativeId': 59,
- 'dealId': undefined,
- 'width': 300,
- 'height': 250,
- 'ad': 'test content 1
',
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'banner',
- 'netRevenue': true,
- 'ttl': 360,
- },
- {
- 'requestId': '4e111f1b66e4',
- 'cpm': 0.5,
- 'creativeId': 60,
- 'dealId': undefined,
- 'width': 300,
- 'height': 600,
- 'ad': 'test content 2
',
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'banner',
- 'netRevenue': true,
- 'ttl': 360,
- },
- {
- 'requestId': '26d6f897b516',
- 'cpm': 0.15,
- 'creativeId': 59,
- 'dealId': undefined,
- 'width': 728,
- 'height': 90,
- 'ad': 'test content 3
',
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'banner',
- 'netRevenue': true,
- 'ttl': 360,
- },
- {
- 'requestId': '326bde7fbf69',
- 'cpm': 0.15,
- 'creativeId': 59,
- 'dealId': undefined,
- 'width': 300,
- 'height': 600,
- 'ad': 'test content 4
',
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'banner',
- 'netRevenue': true,
- 'ttl': 360,
- }
- ];
-
- const result = spec.interpretResponse({'body': {'seatbid': fullResponse}}, request);
- expect(result).to.deep.equal(expectedResponse);
- });
-
- it('dublicate uids and sizes in one slot', function () {
- const fullResponse = [
- {'bid': [{'price': 1.15, 'adm': 'test content 1
', 'auid': 59, 'h': 250, 'w': 300}], 'seat': '1'},
- {'bid': [{'price': 0.5, 'adm': 'test content 2
', 'auid': 59, 'h': 250, 'w': 300}], 'seat': '1'},
- ];
- const bidRequests = [
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '59'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '5126e301f4be',
- 'bidderRequestId': '171c5405a390',
- 'auctionId': '35bcbc0f7e79c',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '59'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '57b2ebe70e16',
- 'bidderRequestId': '171c5405a390',
- 'auctionId': '35bcbc0f7e79c',
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '59'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '225fcd44b18c',
- 'bidderRequestId': '171c5405a390',
- 'auctionId': '35bcbc0f7e79c',
- }
- ];
- const request = spec.buildRequests(bidRequests);
- const expectedResponse = [
- {
- 'requestId': '5126e301f4be',
- 'cpm': 1.15,
- 'creativeId': 59,
- 'dealId': undefined,
- 'width': 300,
- 'height': 250,
- 'ad': 'test content 1
',
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'banner',
- 'netRevenue': true,
- 'ttl': 360,
- },
- {
- 'requestId': '57b2ebe70e16',
- 'cpm': 0.5,
- 'creativeId': 59,
- 'dealId': undefined,
- 'width': 300,
- 'height': 250,
- 'ad': 'test content 2
',
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'banner',
- 'netRevenue': true,
- 'ttl': 360,
- }
- ];
-
- const result = spec.interpretResponse({'body': {'seatbid': fullResponse}}, request);
- expect(result).to.deep.equal(expectedResponse);
- });
- });
-
- it('should get correct video bid response', function () {
- const bidRequests = [
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '58'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '57dfefb80eca',
- 'bidderRequestId': '20394420a762a2',
- 'auctionId': '140132d07b031',
- 'mediaTypes': {
- 'video': {
- 'context': 'instream'
- }
- }
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '60'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': 'e893c787c22dd',
- 'bidderRequestId': '20394420a762a2',
- 'auctionId': '140132d07b031',
- 'mediaTypes': {
- 'video': {
- 'context': 'instream'
- }
- }
- }
- ];
- const response = [
- {'bid': [{'price': 1.15, 'adm': '\n<\/Ad>\n<\/VAST>', 'auid': 58, content_type: 'video', w: 300, h: 600}], 'seat': '2'},
- {'bid': [{'price': 1.00, 'adm': '\n<\/Ad>\n<\/VAST>', 'auid': 60, content_type: 'video'}], 'seat': '2'}
- ];
- const request = spec.buildRequests(bidRequests);
- const expectedResponse = [
- {
- 'requestId': '57dfefb80eca',
- 'cpm': 1.15,
- 'creativeId': 58,
- 'dealId': undefined,
- 'width': 300,
- 'height': 600,
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'video',
- 'netRevenue': true,
- 'ttl': 360,
- 'vastXml': '\n<\/Ad>\n<\/VAST>',
- 'adResponse': {
- 'content': '\n<\/Ad>\n<\/VAST>'
- }
- }
- ];
-
- const result = spec.interpretResponse({'body': {'seatbid': response}}, request);
- expect(result).to.deep.equal(expectedResponse);
- });
-
- it('should have right renderer in the bid response', function () {
- const spySetRenderer = sinon.spy();
- const stubRenderer = {
- setRender: spySetRenderer
- };
- const spyRendererInstall = sinon.spy(function() { return stubRenderer; });
- const stubRendererConst = {
- install: spyRendererInstall
- };
- const bidRequests = [
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '58'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': 'e6e65553fc8',
- 'bidderRequestId': '1380f393215dc7',
- 'auctionId': '10b8d2f3c697e3',
- 'mediaTypes': {
- 'video': {
- 'context': 'outstream'
- }
- }
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '60'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': 'c8fdcb3f269f',
- 'bidderRequestId': '1380f393215dc7',
- 'auctionId': '10b8d2f3c697e3'
- },
- {
- 'bidder': 'converge',
- 'params': {
- 'uid': '61'
- },
- 'adUnitCode': 'adunit-code-1',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '1de036c37685',
- 'bidderRequestId': '1380f393215dc7',
- 'auctionId': '10b8d2f3c697e3',
- 'renderer': {}
- }
- ];
- const response = [
- {'bid': [{'price': 1.15, 'adm': '\n<\/Ad>\n<\/VAST>', 'auid': 58, content_type: 'video', w: 300, h: 600}], 'seat': '2'},
- {'bid': [{'price': 1.00, 'adm': '\n<\/Ad>\n<\/VAST>', 'auid': 60, content_type: 'video', w: 300, h: 250}], 'seat': '2'},
- {'bid': [{'price': 1.20, 'adm': '\n<\/Ad>\n<\/VAST>', 'auid': 61, content_type: 'video', w: 300, h: 250}], 'seat': '2'}
- ];
- const request = spec.buildRequests(bidRequests);
- const expectedResponse = [
- {
- 'requestId': 'e6e65553fc8',
- 'cpm': 1.15,
- 'creativeId': 58,
- 'dealId': undefined,
- 'width': 300,
- 'height': 600,
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'video',
- 'netRevenue': true,
- 'ttl': 360,
- 'vastXml': '\n<\/Ad>\n<\/VAST>',
- 'adResponse': {
- 'content': '\n<\/Ad>\n<\/VAST>'
- },
- 'renderer': stubRenderer
- },
- {
- 'requestId': 'c8fdcb3f269f',
- 'cpm': 1.00,
- 'creativeId': 60,
- 'dealId': undefined,
- 'width': 300,
- 'height': 250,
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'video',
- 'netRevenue': true,
- 'ttl': 360,
- 'vastXml': '\n<\/Ad>\n<\/VAST>',
- 'adResponse': {
- 'content': '\n<\/Ad>\n<\/VAST>'
- },
- 'renderer': stubRenderer
- },
- {
- 'requestId': '1de036c37685',
- 'cpm': 1.20,
- 'creativeId': 61,
- 'dealId': undefined,
- 'width': 300,
- 'height': 250,
- 'bidderCode': 'converge',
- 'currency': 'EUR',
- 'mediaType': 'video',
- 'netRevenue': true,
- 'ttl': 360,
- 'vastXml': '\n<\/Ad>\n<\/VAST>',
- 'adResponse': {
- 'content': '\n<\/Ad>\n<\/VAST>'
- }
- }
- ];
-
- const result = spec.interpretResponse({'body': {'seatbid': response}}, request, stubRendererConst);
-
- expect(spySetRenderer.calledTwice).to.equal(true);
- expect(spySetRenderer.getCall(0).args[0]).to.be.a('function');
- expect(spySetRenderer.getCall(1).args[0]).to.be.a('function');
-
- expect(spyRendererInstall.calledTwice).to.equal(true);
- expect(spyRendererInstall.getCall(0).args[0]).to.deep.equal({
- id: 'e6e65553fc8',
- url: 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js',
- loaded: false
- });
- expect(spyRendererInstall.getCall(1).args[0]).to.deep.equal({
- id: 'c8fdcb3f269f',
- url: 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js',
- loaded: false
- });
-
- expect(result).to.deep.equal(expectedResponse);
- });
-
- describe('user sync', function () {
- const syncUrl = getSyncUrl();
-
- beforeEach(function () {
- resetUserSync();
- });
-
- it('should register sync image', function () {
- let syncs = spec.getUserSyncs({
- pixelEnabled: true
- });
-
- expect(syncs).to.deep.equal({type: 'image', url: syncUrl});
- });
-
- it('should not register sync image more than once', function () {
- let syncs = spec.getUserSyncs({
- pixelEnabled: true
- });
- expect(syncs).to.deep.equal({type: 'image', url: syncUrl});
-
- // when called again, should still have only been called once
- syncs = spec.getUserSyncs();
- expect(syncs).to.equal(undefined);
- });
-
- it('should pass gdpr params if consent is true', function () {
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {
- gdprApplies: true, consentString: 'foo'
- })).to.deep.equal({
- type: 'image', url: `${syncUrl}&gdpr=1&gdpr_consent=foo`
- });
- });
-
- it('should pass gdpr params if consent is false', function () {
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {
- gdprApplies: false, consentString: 'foo'
- })).to.deep.equal({
- type: 'image', url: `${syncUrl}&gdpr=0&gdpr_consent=foo`
- });
- });
-
- it('should pass gdpr param gdpr_consent only when gdprApplies is undefined', function () {
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {
- consentString: 'foo'
- })).to.deep.equal({
- type: 'image', url: `${syncUrl}&gdpr_consent=foo`
- });
- });
-
- it('should pass no params if gdpr consentString is not defined', function () {
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {})).to.deep.equal({
- type: 'image', url: syncUrl
- });
- });
-
- it('should pass no params if gdpr consentString is a number', function () {
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {
- consentString: 0
- })).to.deep.equal({
- type: 'image', url: syncUrl
- });
- });
-
- it('should pass no params if gdpr consentString is null', function () {
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {
- consentString: null
- })).to.deep.equal({
- type: 'image', url: syncUrl
- });
- });
-
- it('should pass no params if gdpr consentString is a object', function () {
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {
- consentString: {}
- })).to.deep.equal({
- type: 'image', url: syncUrl
- });
- });
-
- it('should pass no params if gdpr is not defined', function () {
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, undefined)).to.deep.equal({
- type: 'image', url: syncUrl
- });
- });
-
- it('should pass usPrivacy param if it is available', function() {
- expect(spec.getUserSyncs({ pixelEnabled: true }, {}, {}, '1YNN')).to.deep.equal({
- type: 'image', url: `${syncUrl}&us_privacy=1YNN`
- });
- });
- });
-});
diff --git a/test/spec/modules/cosmosBidAdapter_spec.js b/test/spec/modules/cosmosBidAdapter_spec.js
deleted file mode 100644
index b33f53221e2..00000000000
--- a/test/spec/modules/cosmosBidAdapter_spec.js
+++ /dev/null
@@ -1,355 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/cosmosBidAdapter.js';
-import * as utils from 'src/utils.js';
-const constants = require('src/constants.json');
-
-describe('Cosmos adapter', function () {
- let bannerBidRequests;
- let bannerBidResponse;
- let videoBidRequests;
- let videoBidResponse;
-
- beforeEach(function () {
- bannerBidRequests = [
- {
- bidder: 'cosmos',
- mediaTypes: {
- banner: {
- sizes: [[300, 250], [300, 600]],
- }
- },
- params: {
- publisherId: '1001',
- currency: 'USD',
- geo: {
- lat: '09.5',
- lon: '21.2',
- }
- },
- bidId: '29f8bd96defe76'
- }
- ];
-
- videoBidRequests =
- [
- {
- mediaTypes: {
- video: {
- mimes: ['video/mp4', 'video/x-flv'],
- context: 'instream'
- }
- },
- bidder: 'cosmos',
- params: {
- publisherId: 1001,
- video: {
- skippable: true,
- minduration: 5,
- maxduration: 30
- }
- },
- bidId: '39f5cc6eff9b37'
- }
- ];
-
- bannerBidResponse = {
- 'body': {
- 'id': '93D3BAD6-E2E2-49FB-9D89-920B1761C865',
- 'seatbid': [{
- 'bid': [{
- 'id': '82DAAE22-FF66-4FAB-84AB-347B0C5CD02C',
- 'impid': '29f8bd96defe76',
- 'price': 1.858309,
- 'adm': 'COSMOS\"Connecting Advertisers and Publishers directly\"
',
- 'adid': 'v55jutrh',
- 'adomain': ['febreze.com'],
- 'iurl': 'https://thetradedesk-t-general.s3.amazonaws.com/AdvertiserLogos/vgl908z.png',
- 'cid': '1234',
- 'crid': 'v55jutrh',
- 'w': 300,
- 'h': 250,
- 'ext': {
- 'prebid': {
- 'type': 'banner'
- }
- }
- }],
- 'seat': 'zeta'
- }]
- }
- };
-
- videoBidResponse = {
- 'body': {
- 'id': '93D3BAD6-E2E2-49FB-9D89-920B1761C865',
- 'seatbid': [{
- 'bid': [{
- 'id': '82DAAE22-FF66-4FAB-84AB-347B0C5CD02C',
- 'impid': '39f5cc6eff9b37',
- 'price': 0.858309,
- 'adm': 'CosmosHQ VAST 2.0 Instream Test 1 VAST 2.0 Instream Test 1 https://track.cosmoshq.com/event?data=%7B%22id%22%3A%221566011421045%22%2C%22bid%22%3A%2282DAAE22-FF66-4FAB-84AB-347B0C5CD02C%22%2C%22ts%22%3A%2220190817031021%22%2C%22pid%22%3A1001%2C%22plcid%22%3A1%2C%22aid%22%3A1%2C%22did%22%3A1%2C%22cid%22%3A%2222918%22%2C%22af%22%3A3%2C%22at%22%3A1%2C%22w%22%3A300%2C%22h%22%3A250%2C%22crid%22%3A%22v55jutrh%22%2C%22pp%22%3A0.858309%2C%22cp%22%3A0.858309%2C%22mg%22%3A0%7D&type=1 https//track.dsp.impression.com/impression 00:00:60 https//sync.cosmoshq.com/static/video/SampleVideo_1280x720_10mb.mp4 ',
- 'adid': 'v55jutrh',
- 'adomain': ['febreze.com'],
- 'iurl': 'https://thetradedesk-t-general.s3.amazonaws.com/AdvertiserLogos/vgl908z.png',
- 'cid': '1234',
- 'crid': 'v55jutrh',
- 'w': 300,
- 'h': 250,
- 'ext': {
- 'prebid': {
- 'type': 'video'
- }
- }
- }],
- 'seat': 'zeta'
- }]
- }
- };
- });
-
- describe('isBidRequestValid', function () {
- describe('validate the bid object: valid bid', function () {
- it('valid bid case', function () {
- let validBid = {
- bidder: 'cosmos',
- params: {
- publisherId: 1001,
- tagId: 1
- }
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(true);
- });
-
- it('validate the bid object: nil/empty bid object', function () {
- let validBid = {
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- });
-
- it('validate the bid object: publisherId not passed', function () {
- let validBid = {
- bidder: 'cosmos',
- params: {
- tagId: 1
- }
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- });
-
- it('validate the bid object: publisherId is not number', function () {
- let validBid = {
- bidder: 'cosmos',
- params: {
- publisherId: '301',
- tagId: 1
- }
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- });
-
- it('validate the bid object: mimes absent', function () {
- let validBid = {
- bidder: 'cosmos',
- mediaTypes: {
- video: {}
- },
- params: {
- publisherId: 1001
- }
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- });
-
- it('validate the bid object: mimes present', function () {
- let validBid = {
- bidder: 'cosmos',
- mediaTypes: {
- video: {
- mimes: ['video/mp4', 'application/javascript']
- }
- },
- params: {
- publisherId: 1001
- }
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(true);
- });
-
- it('validate the bid object: tagId is not passed', function () {
- let validBid = {
- bidder: 'cosmos',
- params: {
- publisherId: 1001
- }
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(true);
- });
- });
-
- describe('buildRequests', function () {
- it('build request object: buildRequests function should not modify original bannerBidRequests object', function () {
- let originalBidRequests = utils.deepClone(bannerBidRequests);
- let request = spec.buildRequests(bannerBidRequests);
- expect(bannerBidRequests).to.deep.equal(originalBidRequests);
- });
-
- it('build request object: endpoint check', function () {
- let request = spec.buildRequests(bannerBidRequests);
- expect(request[0].url).to.equal('https://bid.cosmoshq.com/openrtb2/bids');
- expect(request[0].method).to.equal('POST');
- });
-
- it('build request object: request params check', function () {
- let request = spec.buildRequests(bannerBidRequests);
- let data = JSON.parse(request[0].data);
- expect(data.site.publisher.id).to.equal(bannerBidRequests[0].params.publisherId); // publisher Id
- expect(data.imp[0].bidfloorcur).to.equal(bannerBidRequests[0].params.currency);
- });
-
- it('build request object: request params check without tagId', function () {
- delete bannerBidRequests[0].params.tagId;
- let request = spec.buildRequests(bannerBidRequests);
- let data = JSON.parse(request[0].data);
- expect(data.site.publisher.id).to.equal(bannerBidRequests[0].params.publisherId); // publisher Id
- expect(data.imp[0].tagid).to.equal(undefined); // tagid
- expect(data.imp[0].bidfloorcur).to.equal(bannerBidRequests[0].params.currency);
- });
-
- it('build request object: request params multi size format object check', function () {
- let bidRequest = [
- {
- bidder: 'cosmos',
- mediaTypes: {
- banner: {
- sizes: [[300, 250], [300, 600]],
- }
- },
- params: {
- publisherId: 1001,
- currency: 'USD'
- }
- }
- ];
- /* case 1 - size passed in adslot */
- let request = spec.buildRequests(bidRequest);
- let data = JSON.parse(request[0].data);
- expect(data.imp[0].banner.w).to.equal(300); // width
- expect(data.imp[0].banner.h).to.equal(250); // height
-
- /* case 2 - size passed in adslot as well as in sizes array */
- bidRequest[0].sizes = [[300, 600], [300, 250]];
- bidRequest[0].mediaTypes = {
- banner: {
- sizes: [[300, 600], [300, 250]]
- }
- };
- request = spec.buildRequests(bidRequest);
- data = JSON.parse(request[0].data);
-
- expect(data.imp[0].banner.w).to.equal(300); // width
- expect(data.imp[0].banner.h).to.equal(600); // height
-
- /* case 3 - size passed in sizes but not in adslot */
- bidRequest[0].params.tagId = 1;
- bidRequest[0].sizes = [[300, 250], [300, 600]];
- bidRequest[0].mediaTypes = {
- banner: {
- sizes: [[300, 250], [300, 600]]
- }
- };
- request = spec.buildRequests(bidRequest);
- data = JSON.parse(request[0].data);
-
- expect(data.imp[0].banner.w).to.equal(300); // width
- expect(data.imp[0].banner.h).to.equal(250); // height
- expect(data.imp[0].banner.format).exist.and.to.be.an('array');
- expect(data.imp[0].banner.format[0]).exist.and.to.be.an('object');
- expect(data.imp[0].banner.format[0].w).to.equal(300); // width
- expect(data.imp[0].banner.format[0].h).to.equal(250); // height
- });
-
- it('build request object: request params currency check', function () {
- let bidRequest = [
- {
- bidder: 'cosmos',
- mediaTypes: {
- banner: {
- sizes: [[300, 250], [300, 600]],
- }
- },
- params: {
- publisherId: 1001,
- tagId: 1,
- currency: 'USD'
- },
- sizes: [[300, 250], [300, 600]]
- }
- ];
-
- /* case 1 -
- currency specified in adunits
- output: imp[0] use currency specified in bannerBidRequests[0].params.currency
-
- */
- let request = spec.buildRequests(bidRequest);
- let data = JSON.parse(request[0].data);
- expect(data.imp[0].bidfloorcur).to.equal(bidRequest[0].params.currency);
-
- /* case 2 -
- currency specified in adunit
- output: imp[0] use default currency - USD
-
- */
- delete bidRequest[0].params.currency;
- request = spec.buildRequests(bidRequest);
- data = JSON.parse(request[0].data);
- expect(data.imp[0].bidfloorcur).to.equal('USD');
- });
-
- it('build request object: request params check for video ad', function () {
- let request = spec.buildRequests(videoBidRequests);
- let data = JSON.parse(request[0].data);
- expect(data.imp[0].video).to.exist;
- expect(data.imp[0]['video']['mimes']).to.exist.and.to.be.an('array');
- expect(data.imp[0]['video']['mimes'][0]).to.equal(videoBidRequests[0].mediaTypes.video['mimes'][0]);
- expect(data.imp[0]['video']['mimes'][1]).to.equal(videoBidRequests[0].mediaTypes.video['mimes'][1]);
- expect(data.imp[0]['video']['minduration']).to.equal(videoBidRequests[0].params.video['minduration']);
- expect(data.imp[0]['video']['maxduration']).to.equal(videoBidRequests[0].params.video['maxduration']);
- });
-
- describe('interpretResponse', function () {
- it('check for banner response', function () {
- let request = spec.buildRequests(bannerBidRequests);
- let data = JSON.parse(request[0].data);
- let response = spec.interpretResponse(bannerBidResponse, request[0]);
- expect(response).to.be.an('array').with.length.above(0);
- expect(response[0].requestId).to.equal(bannerBidResponse.body.seatbid[0].bid[0].impid);
- expect(response[0].cpm).to.equal((bannerBidResponse.body.seatbid[0].bid[0].price).toFixed(2));
- expect(response[0].width).to.equal(bannerBidResponse.body.seatbid[0].bid[0].w);
- expect(response[0].height).to.equal(bannerBidResponse.body.seatbid[0].bid[0].h);
- if (bannerBidResponse.body.seatbid[0].bid[0].crid) {
- expect(response[0].creativeId).to.equal(bannerBidResponse.body.seatbid[0].bid[0].crid);
- } else {
- expect(response[0].creativeId).to.equal(bannerBidResponse.body.seatbid[0].bid[0].id);
- }
- expect(response[0].dealId).to.equal(bannerBidResponse.body.seatbid[0].bid[0].dealid);
- expect(response[0].currency).to.equal('USD');
- expect(response[0].netRevenue).to.equal(false);
- expect(response[0].ttl).to.equal(300);
- });
- it('check for video response', function () {
- let request = spec.buildRequests(videoBidRequests);
- let data = JSON.parse(request[0].data);
- let response = spec.interpretResponse(videoBidResponse, request[0]);
- });
- });
- });
- });
-});
diff --git a/test/spec/modules/cpmstarBidAdapter_spec.js b/test/spec/modules/cpmstarBidAdapter_spec.js
deleted file mode 100644
index 285fca9690a..00000000000
--- a/test/spec/modules/cpmstarBidAdapter_spec.js
+++ /dev/null
@@ -1,231 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/cpmstarBidAdapter.js';
-import { deepClone } from 'src/utils.js';
-import { config } from 'src/config.js';
-
-const valid_bid_requests = [{
- 'bidder': 'cpmstar',
- 'params': {
- 'placementId': '57'
- },
- 'sizes': [[300, 250]],
- 'bidId': 'bidId'
-}];
-
-const bidderRequest = {
- refererInfo: {
- referer: 'referer',
- reachedTop: false,
- }
-};
-
-const serverResponse = {
- body: [{
- creatives: [{
- cpm: 1,
- width: 0,
- height: 0,
- currency: 'USD',
- netRevenue: true,
- ttl: 1,
- creativeid: '1234',
- requestid: '11123',
- code: 'no idea',
- media: 'banner',
- }
- ],
- syncs: [{ type: 'image', url: 'https://server.cpmstar.com/pixel.aspx' }]
- }]
-};
-
-describe('Cpmstar Bid Adapter', function () {
- describe('isBidRequestValid', function () {
- it('should return true since the bid is valid',
- function () {
- var bid = { params: { placementId: 123456 } };
- expect(spec.isBidRequestValid(bid)).to.equal(true);
- })
-
- it('should return false since the bid is invalid', function () {
- var bid = { params: { placementId: '' } };
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- })
-
- it('should return a valid player size', function () {
- var bid = {
- mediaTypes: {
- video: {
- playerSize: [[960, 540]]
- }
- }
- }
- expect(spec.getPlayerSize(bid)[0]).to.equal(960);
- expect(spec.getPlayerSize(bid)[1]).to.equal(540);
- })
-
- it('should return a default player size', function () {
- var bid = {
- mediaTypes: {
- video: {
- playerSize: null
- }
- }
- }
- expect(spec.getPlayerSize(bid)[0]).to.equal(640);
- expect(spec.getPlayerSize(bid)[1]).to.equal(440);
- })
- });
-
- describe('buildRequests', function () {
- it('should produce a valid production request', function () {
- var requests = spec.buildRequests(valid_bid_requests, bidderRequest);
- expect(requests[0]).to.have.property('method');
- expect(requests[0]).to.have.property('url');
- expect(requests[0]).to.have.property('bidRequest');
- expect(requests[0].url).to.include('https://server.cpmstar.com/view.aspx');
- });
- it('should produce a valid staging request', function () {
- var stgReq = deepClone(valid_bid_requests);
- stgReq[0].params.endpoint = 'staging';
- var requests = spec.buildRequests(stgReq, bidderRequest);
- expect(requests[0]).to.have.property('method');
- expect(requests[0]).to.have.property('url');
- expect(requests[0]).to.have.property('bidRequest');
- expect(requests[0].url).to.include('https://staging.server.cpmstar.com/view.aspx');
- });
- it('should produce a valid dev request', function () {
- var devReq = deepClone(valid_bid_requests);
- devReq[0].params.endpoint = 'dev';
- var requests = spec.buildRequests(devReq, bidderRequest);
- expect(requests[0]).to.have.property('method');
- expect(requests[0]).to.have.property('url');
- expect(requests[0]).to.have.property('bidRequest');
- expect(requests[0].url).to.include('https://dev.server.cpmstar.com/view.aspx');
- });
- it('should produce a request with support for GDPR', function () {
- var gdpr_bidderRequest = deepClone(bidderRequest);
- gdpr_bidderRequest.gdprConsent = {
- consentString: 'consentString',
- gdprApplies: true
- };
- var requests = spec.buildRequests(valid_bid_requests, gdpr_bidderRequest);
- expect(requests[0]).to.have.property('url');
- expect(requests[0].url).to.include('gdpr_consent=consentString');
- expect(requests[0].url).to.include('gdpr=1');
- });
- it('should produce a request with support for USP', function () {
- var usp_bidderRequest = deepClone(bidderRequest);
- usp_bidderRequest.uspConsent = '1YYY';
- var requests = spec.buildRequests(valid_bid_requests, usp_bidderRequest);
- expect(requests[0]).to.have.property('url');
- expect(requests[0].url).to.include('us_privacy=1YYY');
- });
- it('should produce a request with support for COPPA', function () {
- sinon.stub(config, 'getConfig').withArgs('coppa').returns(true);
- var requests = spec.buildRequests(valid_bid_requests, bidderRequest);
- config.getConfig.restore();
- expect(requests[0]).to.have.property('url');
- expect(requests[0].url).to.include('tfcd=1');
- });
- });
-
- it('should produce a request with support for OpenRTB SupplyChain', function () {
- var reqs = deepClone(valid_bid_requests);
- reqs[0].schain = {
- 'ver': '1.0',
- 'complete': 1,
- 'nodes': [
- {
- 'asi': 'exchange1.com',
- 'sid': '1234',
- 'hp': 1
- },
- {
- 'asi': 'exchange2.com',
- 'sid': 'abcd',
- 'hp': 1
- }
- ]
- };
- var requests = spec.buildRequests(reqs, bidderRequest);
- expect(requests[0]).to.have.property('url');
- expect(requests[0].url).to.include('&schain=1.0,1!exchange1.com,1234,1,,,!exchange2.com,abcd,1,,,');
- });
-
- describe('interpretResponse', function () {
- const request = {
- bidRequest: {
- mediaType: 'BANNER'
- }
- };
-
- it('should return a valid bidresponse array', function () {
- var r = spec.interpretResponse(serverResponse, request)
- var c = serverResponse.body[0].creatives[0];
- expect(r[0].length).to.not.equal(0);
- expect(r[0].requestId).equal(c.requestid);
- expect(r[0].creativeId).equal(c.creativeid);
- expect(r[0].cpm).equal(c.cpm);
- expect(r[0].width).equal(c.width);
- expect(r[0].height).equal(c.height);
- expect(r[0].currency).equal(c.currency);
- expect(r[0].netRevenue).equal(c.netRevenue);
- expect(r[0].ttl).equal(c.ttl);
- expect(r[0].ad).equal(c.code);
- });
-
- it('should return a valid bidresponse array from a non-array-body', function () {
- var r = spec.interpretResponse({ body: serverResponse.body[0] }, request)
- var c = serverResponse.body[0].creatives[0];
- expect(r[0].length).to.not.equal(0);
- expect(r[0].requestId).equal(c.requestid);
- expect(r[0].creativeId).equal(c.creativeid);
- expect(r[0].cpm).equal(c.cpm);
- expect(r[0].width).equal(c.width);
- expect(r[0].height).equal(c.height);
- expect(r[0].currency).equal(c.currency);
- expect(r[0].netRevenue).equal(c.netRevenue);
- expect(r[0].ttl).equal(c.ttl);
- expect(r[0].ad).equal(c.code);
- });
-
- it('should return undefined due to an invalid cpm value', function () {
- var badServer = deepClone(serverResponse);
- badServer.body[0].creatives[0].cpm = 0;
- var c = spec.interpretResponse(badServer, request);
- expect(c).to.be.undefined;
- });
-
- it('should return undefined due to a bad response', function () {
- var badServer = deepClone(serverResponse);
- badServer.body[0].creatives[0].code = null;
- var c = spec.interpretResponse(badServer, request);
- expect(c).to.be.undefined;
- });
-
- it('should return a valid response with a dealId', function () {
- var dealServer = deepClone(serverResponse);
- dealServer.body[0].creatives[0].dealId = 'deal';
- expect(spec.interpretResponse(dealServer, request)[0].dealId).to.equal('deal');
- });
- });
-
- describe('getUserSyncs', function () {
- var sres = [deepClone(serverResponse)];
-
- it('should return a valid pixel sync', function () {
- var syncs = spec.getUserSyncs({ pixelEnabled: true }, sres);
- expect(syncs.length).equal(1);
- expect(syncs[0].type).equal('image');
- expect(syncs[0].url).equal('https://server.cpmstar.com/pixel.aspx');
- });
-
- it('should return a valid iframe sync', function () {
- sres[0].body[0].syncs[0].type = 'iframe';
- var syncs = spec.getUserSyncs({ iframeEnabled: true }, sres);
- expect(syncs.length).equal(1);
- expect(syncs[0].type).equal('iframe');
- expect(syncs[0].url).equal('https://server.cpmstar.com/pixel.aspx');
- });
- });
-});
diff --git a/test/spec/modules/criteoBidAdapter_spec.js b/test/spec/modules/criteoBidAdapter_spec.js
index cad1e3f8114..7ec6972e1a5 100755
--- a/test/spec/modules/criteoBidAdapter_spec.js
+++ b/test/spec/modules/criteoBidAdapter_spec.js
@@ -1,5 +1,11 @@
import { expect } from 'chai';
-import { tryGetCriteoFastBid, spec, PROFILE_ID_PUBLISHERTAG, ADAPTER_VERSION } from 'modules/criteoBidAdapter.js';
+import {
+ tryGetCriteoFastBid,
+ spec,
+ PROFILE_ID_PUBLISHERTAG,
+ ADAPTER_VERSION,
+ canFastBid, getFastBidUrl, FAST_BID_VERSION_CURRENT
+} from 'modules/criteoBidAdapter.js';
import { createBid } from 'src/bidfactory.js';
import CONSTANTS from 'src/constants.json';
import * as utils from 'src/utils.js';
@@ -66,7 +72,7 @@ describe('The Criteo bidding adapter', function () {
expect(isValid).to.equal(true);
});
- it('should return true when given a valid video bid request', function () {
+ it('should return true when given a valid video bid request using mix custom bidder video parameters', function () {
expect(spec.isBidRequestValid({
bidder: 'criteo',
mediaTypes: {
@@ -112,6 +118,30 @@ describe('The Criteo bidding adapter', function () {
})).to.equal(true);
});
+ it('should return true when given a valid video bid request using only mediaTypes.video parameters', function () {
+ expect(spec.isBidRequestValid({
+ bidder: 'criteo',
+ mediaTypes: {
+ video: {
+ context: 'instream',
+ mimes: ['video/mpeg'],
+ playerSize: [640, 480],
+ protocols: [5, 6],
+ maxduration: 30,
+ api: [1, 2],
+ skip: 1,
+ placement: 1,
+ minduration: 0,
+ playbackmethod: 1,
+ startdelay: 0
+ }
+ },
+ params: {
+ networkId: 456
+ },
+ })).to.equal(true);
+ });
+
it('should return false when given an invalid video bid request', function () {
expect(spec.isBidRequestValid({
bidder: 'criteo',
@@ -893,9 +923,11 @@ describe('The Criteo bidding adapter', function () {
impid: 'test-requestId',
cpm: 1.23,
creative: 'test-ad',
+ creativecode: 'test-crId',
width: 728,
height: 90,
dealCode: 'myDealCode',
+ adomain: ['criteo.com'],
}],
},
};
@@ -913,9 +945,11 @@ describe('The Criteo bidding adapter', function () {
expect(bids[0].requestId).to.equal('test-bidId');
expect(bids[0].cpm).to.equal(1.23);
expect(bids[0].ad).to.equal('test-ad');
+ expect(bids[0].creativeId).to.equal('test-crId');
expect(bids[0].width).to.equal(728);
expect(bids[0].height).to.equal(90);
expect(bids[0].dealId).to.equal('myDealCode');
+ expect(bids[0].meta.advertiserDomains[0]).to.equal('criteo.com');
});
it('should properly parse a bid response with a zoneId', function () {
@@ -1189,6 +1223,34 @@ describe('The Criteo bidding adapter', function () {
});
});
+ describe('canFastBid', function () {
+ it('should properly detect if can do fastbid', function () {
+ const testCasesAndExpectedResult = [['none', false], ['', true], [undefined, true], [123, true]];
+ testCasesAndExpectedResult.forEach(testCase => {
+ const result = canFastBid(testCase[0]);
+ expect(result).to.equal(testCase[1]);
+ })
+ });
+ });
+
+ describe('getFastBidUrl', function () {
+ it('should properly detect the version of fastbid', function () {
+ const testCasesAndExpectedResult = [
+ ['', 'https://static.criteo.net/js/ld/publishertag.prebid.' + FAST_BID_VERSION_CURRENT + '.js'],
+ [undefined, 'https://static.criteo.net/js/ld/publishertag.prebid.' + FAST_BID_VERSION_CURRENT + '.js'],
+ [null, 'https://static.criteo.net/js/ld/publishertag.prebid.' + FAST_BID_VERSION_CURRENT + '.js'],
+ [NaN, 'https://static.criteo.net/js/ld/publishertag.prebid.' + FAST_BID_VERSION_CURRENT + '.js'],
+ [123, 'https://static.criteo.net/js/ld/publishertag.prebid.123.js'],
+ ['123', 'https://static.criteo.net/js/ld/publishertag.prebid.123.js'],
+ ['latest', 'https://static.criteo.net/js/ld/publishertag.prebid.js']
+ ];
+ testCasesAndExpectedResult.forEach(testCase => {
+ const result = getFastBidUrl(testCase[0]);
+ expect(result).to.equal(testCase[1]);
+ })
+ });
+ });
+
describe('tryGetCriteoFastBid', function () {
const VALID_HASH = 'vBeD8Q7GU6lypFbzB07W8hLGj7NL+p7dI9ro2tCxkrmyv0F6stNuoNd75Us33iNKfEoW+cFWypelr6OJPXxki2MXWatRhJuUJZMcK4VBFnxi3Ro+3a0xEfxE4jJm4eGe98iC898M+/YFHfp+fEPEnS6pEyw124ONIFZFrcejpHU=';
const INVALID_HASH = 'invalid';
diff --git a/test/spec/modules/dailyhuntBidAdapter_spec.js b/test/spec/modules/dailyhuntBidAdapter_spec.js
deleted file mode 100644
index d571150dbee..00000000000
--- a/test/spec/modules/dailyhuntBidAdapter_spec.js
+++ /dev/null
@@ -1,400 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/dailyhuntBidAdapter.js';
-
-const PROD_PREBID_ENDPOINT_URL = 'https://pbs.dailyhunt.in/openrtb2/auction?partner=dailyhunt';
-const PROD_PREBID_TEST_ENDPOINT_URL = 'https://qa-pbs-van.dailyhunt.in/openrtb2/auction?partner=dailyhunt';
-
-const _encodeURIComponent = function (a) {
- if (!a) { return }
- let b = window.encodeURIComponent(a);
- b = b.replace(/'/g, '%27');
- return b;
-}
-
-describe('DailyhuntAdapter', function () {
- describe('isBidRequestValid', function () {
- let bid = {
- 'bidder': 'dailyhunt',
- 'params': {
- placement_id: 1,
- publisher_id: 1,
- partner_name: 'dailyhunt'
- }
- };
-
- 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() {
- let bidRequests = [
- {
- bidder: 'dailyhunt',
- params: {
- placement_id: 1,
- publisher_id: 1,
- partner_name: 'dailyhunt',
- bidfloor: 0.1,
- device: {
- ip: '47.9.247.217'
- },
- site: {
- cat: ['1', '2', '3']
- }
- },
- mediaTypes: {
- banner: {
- sizes: [[300, 250]]
- }
- },
- adUnitCode: 'adunit-code',
- sizes: [[300, 50]],
- bidId: '30b31c1838de1e',
- bidderRequestId: '22edbae2733bf6',
- auctionId: '1d1a030790a475',
- transactionId: '04f2659e-c005-4eb1-a57c-fa93145e3843'
- }
- ];
- let nativeBidRequests = [
- {
- bidder: 'dailyhunt',
- params: {
- placement_id: 1,
- publisher_id: 1,
- partner_name: 'dailyhunt',
- },
- nativeParams: {
- title: {
- required: true,
- len: 80
- },
- image: {
- required: true,
- sizes: [150, 50]
- },
- },
- mediaTypes: {
- native: {
- title: {
- required: true
- },
- }
- },
- adUnitCode: 'adunit-code',
- sizes: [[300, 250], [300, 50]],
- bidId: '30b31c1838de1e',
- bidderRequestId: '22edbae2733bf6',
- auctionId: '1d1a030790a475',
- transactionId: '04f2659e-c005-4eb1-a57c-fa93145e3843'
- }
- ];
- let videoBidRequests = [
- {
- bidder: 'dailyhunt',
- params: {
- placement_id: 1,
- publisher_id: 1,
- partner_name: 'dailyhunt'
- },
- nativeParams: {
- video: {
- context: 'instream'
- }
- },
- mediaTypes: {
- video: {
- context: 'instream'
- }
- },
- adUnitCode: 'adunit-code',
- sizes: [[300, 250], [300, 50]],
- bidId: '30b31c1838de1e',
- bidderRequestId: '22edbae2733bf6',
- auctionId: '1d1a030790a475',
- transactionId: '04f2659e-c005-4eb1-a57c-fa93145e3843'
- }
- ];
- let bidderRequest = {
- 'bidderRequestId': '22edbae2733bf6',
- 'auctionId': '1d1a030790a475',
- 'bidderCode': 'dailyhunt',
- 'bids': [
- {
- ...bidRequests[0]
- }
- ],
- 'refererInfo': {
- 'referer': 'http://m.dailyhunt.in/'
- }
- };
- let nativeBidderRequest = {
- 'bidderRequestId': '22edbae2733bf6',
- 'auctionId': '1d1a030790a475',
- 'bidderCode': 'dailyhunt',
- 'bids': [
- {
- ...nativeBidRequests[0]
- }
- ],
- 'refererInfo': {
- 'referer': 'http://m.dailyhunt.in/'
- }
- };
- let videoBidderRequest = {
- 'bidderRequestId': '22edbae2733bf6',
- 'auctionId': '1d1a030790a475',
- 'bidderCode': 'dailyhunt',
- 'bids': [
- {
- ...videoBidRequests[0]
- }
- ],
- 'refererInfo': {
- 'referer': 'http://m.dailyhunt.in/'
- }
- };
-
- it('sends display bid request to ENDPOINT via POST', function () {
- const request = spec.buildRequests(bidRequests, bidderRequest)[0];
- expect(request.url).to.equal(PROD_PREBID_ENDPOINT_URL);
- expect(request.method).to.equal('POST');
- });
-
- it('sends native bid request to ENDPOINT via POST', function () {
- const request = spec.buildRequests(nativeBidRequests, nativeBidderRequest)[0];
- expect(request.url).to.equal(PROD_PREBID_ENDPOINT_URL);
- expect(request.method).to.equal('POST');
- });
-
- it('sends video bid request to ENDPOINT via POST', function () {
- const request = spec.buildRequests(videoBidRequests, videoBidderRequest)[0];
- expect(request.url).to.equal(PROD_PREBID_ENDPOINT_URL);
- expect(request.method).to.equal('POST');
- });
- });
- describe('interpretResponse', function () {
- let bidResponses = {
- id: 'da32def7-6779-403c-ada7-0b201dbc9744',
- seatbid: [
- {
- bid: [
- {
- id: 'id1',
- impid: 'banner-impid',
- price: 1.4,
- adm: 'adm',
- adid: '66658',
- crid: 'asd5ddbf014cac993.66466212',
- dealid: 'asd5ddbf014cac993.66466212',
- w: 300,
- h: 250,
- nurl: 'winUrl',
- ext: {
- prebid: {
- type: 'banner'
- }
- }
- },
- {
- id: '5caccc1f-94a6-4230-a1f9-6186ee65da99',
- impid: 'video-impid',
- price: 1.4,
- nurl: 'winUrl',
- adm: 'adm',
- adid: '980',
- crid: '2394',
- w: 300,
- h: 250,
- ext: {
- prebid: {
- 'type': 'video'
- },
- bidder: {
- cacheKey: 'cache_key',
- vastUrl: 'vastUrl'
- }
- }
- },
- {
- id: '74973faf-cce7-4eff-abd0-b59b8e91ca87',
- impid: 'native-impid',
- price: 50,
- nurl: 'winUrl',
- adm: '{"native":{"link":{"url":"url","clicktrackers":[]},"assets":[{"id":1,"required":1,"img":{},"video":{},"data":{},"title":{"text":"TITLE"},"link":{}},{"id":1,"required":1,"img":{},"video":{},"data":{"type":2,"value":"Lorem Ipsum Lorem Ipsum Lorem Ipsum."},"title":{},"link":{}},{"id":1,"required":1,"img":{},"video":{},"data":{"type":12,"value":"Install Here"},"title":{},"link":{}},{"id":1,"required":1,"img":{"type":3,"url":"urk","w":990,"h":505},"video":{},"data":{},"title":{},"link":{}}],"imptrackers":[]}}',
- adid: '968',
- crid: '2370',
- w: 300,
- h: 250,
- ext: {
- prebid: {
- type: 'native'
- },
- bidder: null
- }
- },
- {
- id: '5caccc1f-94a6-4230-a1f9-6186ee65da99',
- impid: 'video-outstream-impid',
- price: 1.4,
- nurl: 'winUrl',
- adm: 'adm',
- adid: '980',
- crid: '2394',
- w: 300,
- h: 250,
- ext: {
- prebid: {
- 'type': 'video'
- },
- bidder: {
- cacheKey: 'cache_key',
- vastUrl: 'vastUrl'
- }
- }
- },
- ],
- seat: 'dailyhunt'
- }
- ],
- ext: {
- responsetimemillis: {
- dailyhunt: 119
- }
- }
- };
-
- it('should get correct bid response', function () {
- let expectedResponse = [
- {
- requestId: '1',
- cpm: 1.4,
- creativeId: 'asd5ddbf014cac993.66466212',
- width: 300,
- height: 250,
- ttl: 360,
- netRevenue: true,
- currency: 'USD',
- ad: 'adm',
- mediaType: 'banner',
- winUrl: 'winUrl'
- },
- {
- requestId: '2',
- cpm: 1.4,
- creativeId: '2394',
- width: 300,
- height: 250,
- ttl: 360,
- netRevenue: true,
- currency: 'USD',
- mediaType: 'video',
- winUrl: 'winUrl',
- videoCacheKey: 'cache_key',
- vastUrl: 'vastUrl',
- },
- {
- requestId: '3',
- cpm: 1.4,
- creativeId: '2370',
- width: 300,
- height: 250,
- ttl: 360,
- netRevenue: true,
- currency: 'USD',
- mediaType: 'native',
- winUrl: 'winUrl',
- native: {
- clickUrl: 'https%3A%2F%2Fmontu1996.github.io%2F',
- clickTrackers: [],
- impressionTrackers: [],
- javascriptTrackers: [],
- title: 'TITLE',
- body: 'Lorem Ipsum Lorem Ipsum Lorem Ipsum.',
- cta: 'Install Here',
- image: {
- url: 'url',
- height: 505,
- width: 990
- }
- }
- },
- {
- requestId: '4',
- cpm: 1.4,
- creativeId: '2394',
- width: 300,
- height: 250,
- ttl: 360,
- netRevenue: true,
- currency: 'USD',
- mediaType: 'video',
- winUrl: 'winUrl',
- vastXml: 'adm',
- },
- ];
- let bidderRequest = {
- bids: [
- {
- bidId: 'banner-impid',
- adUnitCode: 'code1',
- requestId: '1'
- },
- {
- bidId: 'video-impid',
- adUnitCode: 'code2',
- requestId: '2',
- mediaTypes: {
- video: {
- context: 'instream'
- }
- }
- },
- {
- bidId: 'native-impid',
- adUnitCode: 'code3',
- requestId: '3'
- },
- {
- bidId: 'video-outstream-impid',
- adUnitCode: 'code4',
- requestId: '4',
- mediaTypes: {
- video: {
- context: 'outstream'
- }
- }
- },
- ]
- }
- let result = spec.interpretResponse({ body: bidResponses }, bidderRequest);
- result.forEach((r, i) => {
- expect(Object.keys(r)).to.have.members(Object.keys(expectedResponse[i]));
- });
- });
- })
- describe('onBidWon', function () {
- it('should hit win url when bid won', function () {
- let bid = {
- requestId: '1',
- cpm: 1.4,
- creativeId: 'asd5ddbf014cac993.66466212',
- width: 300,
- height: 250,
- ttl: 360,
- netRevenue: true,
- currency: 'USD',
- ad: 'adm',
- mediaType: 'banner',
- winUrl: 'winUrl'
- };
- expect(spec.onBidWon(bid)).to.equal(undefined);
- });
- })
-})
diff --git a/test/spec/modules/datablocksBidAdapter_spec.js b/test/spec/modules/datablocksBidAdapter_spec.js
index 18b8aac7371..0ec12905430 100644
--- a/test/spec/modules/datablocksBidAdapter_spec.js
+++ b/test/spec/modules/datablocksBidAdapter_spec.js
@@ -1,12 +1,15 @@
import { expect } from 'chai';
import { spec } from '../../../modules/datablocksBidAdapter.js';
+import { BotClientTests } from '../../../modules/datablocksBidAdapter.js';
+import { getStorageManager } from '../../../src/storageManager.js';
+export let storage = getStorageManager();
-let bid = {
+const bid = {
bidId: '2dd581a2b6281d',
bidder: 'datablocks',
bidderRequestId: '145e1d6a7837c9',
params: {
- sourceId: 7560,
+ source_id: 7560,
host: 'v5demo.datablocks.net'
},
adUnitCode: '/19968336/header-bid-tag-0',
@@ -24,12 +27,12 @@ let bid = {
transactionId: '1ccbee15-f6f6-46ce-8998-58fe5542e8e1'
};
-let bid2 = {
+const bid2 = {
bidId: '2dd581a2b624324g',
bidder: 'datablocks',
bidderRequestId: '145e1d6a7837543',
params: {
- sourceId: 7560,
+ source_id: 7560,
host: 'v5demo.datablocks.net'
},
adUnitCode: '/19968336/header-bid-tag-0',
@@ -43,7 +46,7 @@ let bid2 = {
transactionId: '1ccbee15-f6f6-46ce-8998-58fe55425432'
};
-let nativeBid = {
+const nativeBid = {
adUnitCode: '/19968336/header-bid-tag-0',
auctionId: '160c78a4-f808-410f-b682-d8728f3a79ee',
bidId: '332045ee374a99',
@@ -78,41 +81,18 @@ let nativeBid = {
}
},
params: {
- sourceId: 7560,
+ source_id: 7560,
host: 'v5demo.datablocks.net'
},
transactionId: '0a4e9788-4def-4b94-bc25-564d7cac99f6'
}
-let videoBid = {
- adUnitCode: '/19968336/header-bid-tag-0',
- auctionId: '160c78a4-f808-410f-b682-d8728f3a79e1',
- bidId: '332045ee374b99',
- bidder: 'datablocks',
- bidderRequestId: '15d9012765e36d',
- mediaTypes: {
- video: {
- context: 'instream',
- playerSize: [501, 400],
- durationRangeSec: [15, 60]
- }
- },
- params: {
- sourceId: 7560,
- host: 'v5demo.datablocks.net',
- video: {
- minduration: 14
- }
- },
- transactionId: '0a4e9788-4def-4b94-bc25-564d7cac99f7'
-}
-
const bidderRequest = {
auctionId: '8bfef1be-d3ac-4d18-8859-754c7b4cf017',
auctionStart: Date.now(),
biddeCode: 'datablocks',
bidderRequestId: '10c47a5fc3c41',
- bids: [bid, bid2, nativeBid, videoBid],
+ bids: [bid, bid2, nativeBid],
refererInfo: {
numIframes: 0,
reachedTop: true,
@@ -123,208 +103,423 @@ const bidderRequest = {
timeout: 10000
};
-let resObject = {
+const res_object = {
body: {
- id: '10c47a5fc3c41',
- bidid: '166895245-28-11347-1',
- seatbid: [{
- seat: '7560',
- bid: [{
- id: '1090738570',
- impid: '2966b257c81d27',
- price: 24.000000,
- adm: ' ',
- cid: '55',
- adid: '177654',
- crid: '177656',
- cat: [],
- api: [],
- w: 300,
- h: 250
- }, {
- id: '1090738571',
- impid: '2966b257c81d28',
- price: 24.000000,
- adm: ' ',
- cid: '55',
- adid: '177654',
- crid: '177656',
- cat: [],
- api: [],
- w: 728,
- h: 90
- }, {
- id: '1090738570',
- impid: '15d9012765e36c',
- price: 24.000000,
- adm: '{"native":{"ver":"1.2","assets":[{"id":1,"required":1,"title":{"text":"Example Title"}},{"id":2,"required":1,"data":{"value":"Example Body"}},{"id":3,"required":1,"img":{"url":"https://example.image.com/"}}],"link":{"url":"https://click.example.com/c/264597/?fcid=29699699045816"},"imptrackers":["https://impression.example.com/i/264597/?fcid=29699699045816"]}}',
- cid: '132145',
- adid: '154321',
- crid: '177432',
- cat: [],
- api: []
- }, {
- id: '1090738575',
- impid: '15d9012765e36f',
- price: 25.000000,
- cid: '12345',
- adid: '12345',
- crid: '123456',
- nurl: 'https://click.v5demo.datablocks.net/m//?fcid=435235435432',
- cat: [],
- api: [],
- w: 500,
- h: 400
- }]
- }],
- cur: 'USD',
- ext: {}
+ 'id': '10c47a5fc3c41',
+ 'bidid': '217868445-30021-19053-0',
+ 'seatbid': [
+ {
+ 'id': '22621593137287',
+ 'impid': '1',
+ 'adm': 'John is great',
+ 'adomain': ['medianet.com'],
+ 'price': 0.430000,
+ 'cid': '2524568',
+ 'adid': '0',
+ 'crid': '0',
+ 'cat': [],
+ 'w': 300,
+ 'h': 250,
+ 'ext': {
+ 'type': 'CPM',
+ 'mtype': 'banner'
+ }
+ },
+ {
+ 'id': '22645215457415',
+ 'impid': '2',
+ 'adm': 'john is the best',
+ 'adomain': ['td.com'],
+ 'price': 0.580000,
+ 'cid': '2524574',
+ 'adid': '0',
+ 'crid': '0',
+ 'cat': [],
+ 'w': 728,
+ 'h': 90,
+ 'ext': {
+ 'type': 'CPM',
+ 'mtype': 'banner'
+ }
+ },
+
+ {
+ 'id': '22645215457416',
+ 'impid': '3',
+ 'adm': '{"native":{"ver":"1.2","assets":[{"id":1,"required":1,"title":{"text":"John is amazing"}},{"id":5,"required":1,"data":{"value":"Sponsored by John"}},{"id":3,"required":1,"img":{"url":"https://example.image.com/", "h":"360", "w":"360"}}],"link":{"url":"https://click.example.com/c/264597/?fcid=29699699045816"},"imptrackers":["https://impression.example.com/i/264597/?fcid=29699699045816"]}}',
+ 'adomain': ['td.com'],
+ 'price': 10.00,
+ 'cid': '2524574',
+ 'adid': '0',
+ 'crid': '0',
+ 'cat': [],
+ 'ext': {
+ 'type': 'CPM',
+ 'mtype': 'native'
+ }
+ }
+ ],
+ 'cur': 'USD',
+ 'ext': {
+ 'version': '1.2.93',
+ 'buyerid': '1234567',
+ 'syncs': [
+ {
+ 'type': 'iframe',
+ 'url': 'https://s.0cf.io'
+ },
+ {
+ 'type': 'image',
+ 'url': 'https://us.dblks.net/set_uid/'
+ }
+ ]
+ }
}
-};
-let bidRequest = {
+}
+
+let bid_request = {
method: 'POST',
- url: 'https://v5demo.datablocks.net/search/?sid=7560',
+ url: 'https://prebid.datablocks.net/openrtb/?sid=2523014',
options: {
- withCredentials: false
+ withCredentials: true
},
data: {
- device: {
- ip: 'peer',
- ua: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) Ap…ML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
- js: 1,
- language: 'en'
- },
- id: '10c47a5fc3c41',
- imp: [{
- banner: { w: 300, h: 250 },
- id: '2966b257c81d27',
- secure: false,
- tagid: '/19968336/header-bid-tag-0'
- }, {
- banner: { w: 728, h: 90 },
- id: '2966b257c81d28',
- secure: false,
- tagid: '/19968336/header-bid-tag-0'
- }, {
- id: '15d9012765e36c',
- native: {request: '{"native":{"assets":[{"id":"1","required":true,"title":{"len":140}},{"id":"2","required":true,"data":{"type":2}},{"id":"3","img":{"w":728,"h":90,"type":3}}]}}'},
- secure: false,
- tagid: '/19968336/header-bid-tag-0'
- }, {
- id: '15d9012765e36f',
- video: {w: 500, h: 400, minduration: 15, maxduration: 60},
- secure: false,
- tagid: '/19968336/header-bid-tag-0'
- }],
- site: {
- domain: '',
- id: 'blank',
- page: 'https://v5demo.datablocks.net/test'
- }
+ 'id': 'c09c6e47-8bdb-4884-a46d-93165322b368',
+ 'imp': [{
+ 'id': '1',
+ 'tagid': '/19968336/header-bid-tag-0',
+ 'placement_id': 0,
+ 'secure': true,
+ 'banner': {
+ 'w': 300,
+ 'h': 250,
+ 'format': [{
+ 'w': 300,
+ 'h': 250
+ }, {
+ 'w': 300,
+ 'h': 600
+ }]
+ }
+ }, {
+ 'id': '2',
+ 'tagid': '/19968336/header-bid-tag-1',
+ 'placement_id': 12345,
+ 'secure': true,
+ 'banner': {
+ 'w': 729,
+ 'h': 90,
+ 'format': [{
+ 'w': 729,
+ 'h': 90
+ }, {
+ 'w': 970,
+ 'h': 250
+ }]
+ }
+ }, {
+ 'id': '3',
+ 'tagid': '/19968336/prebid_multiformat_test',
+ 'placement_id': 0,
+ 'secure': true,
+ 'native': {
+ 'ver': '1.2',
+ 'request': {
+ 'assets': [{
+ 'required': 1,
+ 'id': 1,
+ 'title': {}
+ }, {
+ 'required': 1,
+ 'id': 3,
+ 'img': {
+ 'type': 3
+ }
+ }, {
+ 'required': 1,
+ 'id': 5,
+ 'data': {
+ 'type': 1
+ }
+ }],
+ 'context': 1,
+ 'plcmttype': 1,
+ 'ver': '1.2'
+ }
+ }
+ }],
+ 'site': {
+ 'domain': 'test.datablocks.net',
+ 'page': 'https://test.datablocks.net/index.html',
+ 'schain': {},
+ 'ext': {
+ 'p_domain': 'https://test.datablocks.net',
+ 'rt': true,
+ 'frames': 0,
+ 'stack': ['https://test.datablocks.net/index.html'],
+ 'timeout': 3000
+ },
+ 'keywords': 'HTML, CSS, JavaScript'
+ },
+ 'device': {
+ 'ip': 'peer',
+ 'ua': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36',
+ 'js': 1,
+ 'language': 'en',
+ 'buyerid': '1234567',
+ 'ext': {
+ 'pb_eids': [{
+ 'source': 'criteo.com',
+ 'uids': [{
+ 'id': 'test',
+ 'atype': 1
+ }]
+ }],
+ 'syncs': {
+ '1000': 'db_4044853',
+ '1001': true
+ },
+ 'coppa': 0,
+ 'gdpr': {},
+ 'usp': {},
+ 'client_info': {
+ 'wiw': 2560,
+ 'wih': 1281,
+ 'saw': 2560,
+ 'sah': 1417,
+ 'scd': 24,
+ 'sw': 2560,
+ 'sh': 1440,
+ 'whl': 4,
+ 'wxo': 0,
+ 'wyo': 0,
+ 'wpr': 2,
+ 'is_bot': false,
+ 'is_hid': false,
+ 'vs': 'hidden'
+ },
+ 'fpd': {}
+ }
+ }
}
}
describe('DatablocksAdapter', function() {
+ describe('All needed functions are available', function() {
+ it(`isBidRequestValid is present and type function`, function () {
+ expect(spec.isBidRequestValid).to.exist.and.to.be.a('function')
+ });
+
+ it(`buildRequests is present and type function`, function () {
+ expect(spec.buildRequests).to.exist.and.to.be.a('function')
+ });
+
+ it(`getUserSyncs is present and type function`, function () {
+ expect(spec.getUserSyncs).to.exist.and.to.be.a('function')
+ });
+
+ it(`onBidWon is present and type function`, function () {
+ expect(spec.onBidWon).to.exist.and.to.be.a('function')
+ });
+
+ it(`onSetTargeting is present and type function`, function () {
+ expect(spec.onSetTargeting).to.exist.and.to.be.a('function')
+ });
+
+ it(`interpretResponse is present and type function`, function () {
+ expect(spec.interpretResponse).to.exist.and.to.be.a('function')
+ });
+
+ it(`store_dbid is present and type function`, function () {
+ expect(spec.store_dbid).to.exist.and.to.be.a('function')
+ });
+
+ it(`get_dbid is present and type function`, function () {
+ expect(spec.get_dbid).to.exist.and.to.be.a('function')
+ });
+
+ it(`store_syncs is present and type function`, function () {
+ expect(spec.store_syncs).to.exist.and.to.be.a('function')
+ });
+
+ it(`get_syncs is present and type function`, function () {
+ expect(spec.get_syncs).to.exist.and.to.be.a('function')
+ });
+
+ it(`queue_metric is present and type function`, function () {
+ expect(spec.queue_metric).to.exist.and.to.be.a('function')
+ });
+
+ it(`send_metrics is present and type function`, function () {
+ expect(spec.send_metrics).to.exist.and.to.be.a('function')
+ });
+
+ it(`get_client_info is present and type function`, function () {
+ expect(spec.get_client_info).to.exist.and.to.be.a('function')
+ });
+
+ it(`get_viewability is present and type function`, function () {
+ expect(spec.get_viewability).to.exist.and.to.be.a('function')
+ });
+ });
+
+ describe('get / store dbid', function() {
+ it('Should return true / undefined', function() {
+ expect(spec.store_dbid('12345')).to.be.true;
+ expect(spec.get_dbid()).to.be.a('string');
+ });
+ })
+
+ describe('get / store syncs', function() {
+ it('Should return true / array', function() {
+ expect(spec.store_syncs([{id: 1, uid: 'test'}])).to.be.true;
+ expect(spec.get_syncs()).to.be.a('object');
+ });
+ })
+
+ describe('queue / send metrics', function() {
+ it('Should return true', function() {
+ expect(spec.queue_metric({type: 'test'})).to.be.true;
+ expect(spec.queue_metric('string')).to.be.false;
+ expect(spec.send_metrics()).to.be.true;
+ });
+ })
+
+ describe('get_viewability', function() {
+ it('Should return undefined', function() {
+ expect(spec.get_viewability()).to.equal(undefined);
+ });
+ })
+
+ describe('get client info', function() {
+ it('Should return object', function() {
+ let client_info = spec.get_client_info()
+ expect(client_info).to.be.a('object');
+ expect(client_info).to.have.all.keys('wiw', 'wih', 'saw', 'sah', 'scd', 'sw', 'sh', 'whl', 'wxo', 'wyo', 'wpr', 'is_bot', 'is_hid', 'vs');
+ });
+
+ it('bot test should return boolean', function() {
+ let bot_test = new BotClientTests();
+ expect(bot_test.doTests()).to.be.a('boolean');
+ });
+ })
+
describe('isBidRequestValid', function() {
- it('Should return true when sourceId and Host are set', function() {
+ it('Should return true when source_id and Host are set', function() {
expect(spec.isBidRequestValid(bid)).to.be.true;
});
- it('Should return false when host/sourceId is not set', function() {
+ it('Should return false when host/source_id is not set', function() {
let moddedBid = Object.assign({}, bid);
- delete moddedBid.params.sourceId;
- delete moddedBid.params.host;
- expect(spec.isBidRequestValid(bid)).to.be.false;
+ delete moddedBid.params.source_id;
+ expect(spec.isBidRequestValid(moddedBid)).to.be.false;
+ });
+
+ it('Should return true when viewability reporting is opted out', function() {
+ let moddedBid = Object.assign({}, bid);
+ moddedBid.params.vis_optout = true;
+ spec.isBidRequestValid(moddedBid);
+ expect(spec.db_obj.vis_optout).to.be.true;
+ });
+ })
+
+ describe('getUserSyncs', function() {
+ it('Should return array of syncs', function() {
+ expect(spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, [res_object], {gdprApplies: true, gdpr: 1, gdpr_consent: 'consent_string'}, {})).to.be.an('array');
+ });
+ });
+
+ describe('onSetTargeting', function() {
+ it('Should return undefined', function() {
+ expect(spec.onSetTargeting()).to.equal(undefined);
+ });
+ });
+
+ describe('onBidWon', function() {
+ it('Should return undefined', function() {
+ let won_bid = {params: [{source_id: 1}], requestId: 1, adUnitCode: 'unit', auctionId: 1, size: '300x250', cpm: 10, adserverTargeting: {hb_pb: 10}, timeToRespond: 10, ttl: 10};
+ expect(spec.onBidWon(won_bid)).to.equal(undefined);
});
});
describe('buildRequests', function() {
- let requests = spec.buildRequests([bid, bid2, nativeBid, videoBid], bidderRequest);
+ let request = spec.buildRequests([bid, bid2, nativeBid], bidderRequest);
+
+ expect(request).to.exist;
+ it('Returns POST method', function() {
+ expect(request.method).to.exist;
+ expect(request.method).to.equal('POST');
+ });
+
+ it('Returns valid URL', function() {
+ expect(request.url).to.exist;
+ expect(request.url).to.equal('https://7560.v5demo.datablocks.net/openrtb/?sid=7560');
+ });
+
it('Creates an array of request objects', function() {
- expect(requests).to.be.an('array').that.is.not.empty;
+ expect(request.data.imp).to.be.an('array').that.is.not.empty;
});
- requests.forEach(request => {
- expect(request).to.exist;
- it('Returns POST method', function() {
- expect(request.method).to.exist;
- expect(request.method).to.equal('POST');
- });
- it('Returns valid URL', function() {
- expect(request.url).to.exist;
- expect(request.url).to.equal('https://v5demo.datablocks.net/search/?sid=7560');
- });
+ it('Should be a valid openRTB request', function() {
+ let data = request.data;
- it('Should be a valid openRTB request', function() {
- let data = request.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('device', 'imp', 'site', 'id');
- expect(data.id).to.be.a('string');
-
- let imps = data['imp'];
- imps.forEach((imp, index) => {
- let curBid = bidderRequest.bids[index];
- if (imp.banner) {
- expect(imp).to.have.all.keys('banner', 'id', 'secure', 'tagid');
- expect(imp.banner).to.be.a('object');
- } else if (imp.native) {
- expect(imp).to.have.all.keys('native', 'id', 'secure', 'tagid');
- expect(imp.native).to.have.all.keys('request');
- expect(imp.native.request).to.be.a('string');
- let native = JSON.parse(imp.native.request);
- expect(native).to.be.a('object');
- } else if (imp.video) {
- expect(imp).to.have.all.keys('video', 'id', 'secure', 'tagid');
- expect(imp.video).to.have.all.keys('w', 'h', 'minduration', 'maxduration')
- } else {
- expect(true).to.equal(false);
- }
-
- expect(imp.id).to.be.a('string');
- expect(imp.id).to.equal(curBid.bidId);
- expect(imp.tagid).to.be.a('string');
- expect(imp.tagid).to.equal(curBid.adUnitCode);
- expect(imp.secure).to.equal(false);
- })
-
- expect(data.device.ip).to.equal('peer');
- });
- })
+ expect(data).to.be.an('object');
+ expect(data).to.have.all.keys('device', 'imp', 'site', 'id');
+ expect(data.id).to.be.a('string');
+ expect(data.imp).to.be.a('array');
+ expect(data.device.ip).to.equal('peer');
+
+ let imps = data['imp'];
+ imps.forEach((imp, index) => {
+ let curBid = bidderRequest.bids[index];
+ if (imp.banner) {
+ expect(imp.banner).to.be.a('object');
+ expect(imp).to.have.all.keys('banner', 'id', 'secure', 'tagid', 'placement_id', 'ortb2', 'floor');
+ } else if (imp.native) {
+ expect(imp).to.have.all.keys('native', 'id', 'secure', 'tagid', 'placement_id', 'ortb2', 'floor');
+ expect(imp.native).to.have.all.keys('request', 'ver');
+ expect(imp.native.request).to.be.a('object');
+ } else {
+ expect(true).to.equal(false);
+ }
+
+ expect(imp.id).to.be.a('string');
+ expect(imp.id).to.equal(curBid.bidId);
+ expect(imp.tagid).to.be.a('string');
+ expect(imp.tagid).to.equal(curBid.adUnitCode);
+ expect(imp.secure).to.equal(false);
+ })
+ });
it('Returns empty data if no valid requests are passed', function() {
- let request = spec.buildRequests([]);
- expect(request).to.be.an('array').that.is.empty;
+ let test_request = spec.buildRequests([]);
+ expect(test_request).to.be.an('array').that.is.empty;
});
});
+
describe('interpretResponse', function() {
- let serverResponses = spec.interpretResponse(resObject, bidRequest);
+ let response = spec.interpretResponse(res_object, bid_request);
+
it('Returns an array of valid server responses if response object is valid', function() {
- expect(serverResponses).to.be.an('array').that.is.not.empty;
- for (let i = 0; i < serverResponses.length; i++) {
- let dataItem = serverResponses[i];
- expect(Object.keys(dataItem)).to.include('cpm', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'mediaType', 'requestId');
- expect(dataItem.requestId).to.be.a('string');
- expect(dataItem.cpm).to.be.a('number');
- expect(dataItem.ttl).to.be.a('number');
- expect(dataItem.creativeId).to.be.a('string');
- expect(dataItem.netRevenue).to.be.a('boolean');
- expect(dataItem.currency).to.be.a('string');
- expect(dataItem.mediaType).to.be.a('string');
-
- if (dataItem.mediaType == 'banner') {
- expect(dataItem.ad).to.be.a('string');
- expect(dataItem.width).to.be.a('number');
- expect(dataItem.height).to.be.a('number');
- } else if (dataItem.mediaType == 'native') {
- expect(dataItem.native.title).to.be.a('string');
- expect(dataItem.native.body).to.be.a('string');
- expect(dataItem.native.clickUrl).to.be.a('string');
- } else if (dataItem.mediaType == 'video') {
- expect(dataItem.vastUrl).to.be.a('string');
- expect(dataItem.width).to.be.a('number');
- expect(dataItem.height).to.be.a('number');
+ expect(response).to.be.an('array').that.is.not.empty;
+
+ response.forEach(bid => {
+ expect(parseInt(bid.requestId)).to.be.a('number').greaterThan(0);
+ expect(bid.cpm).to.be.a('number');
+ expect(bid.creativeId).to.be.a('string');
+ expect(bid.currency).to.be.a('string');
+ expect(bid.netRevenue).to.be.a('boolean');
+ expect(bid.ttl).to.be.a('number');
+ expect(bid.mediaType).to.be.a('string');
+
+ if (bid.mediaType == 'banner') {
+ expect(bid.width).to.be.a('number');
+ expect(bid.height).to.be.a('number');
+ expect(bid.ad).to.be.a('string');
+ } else if (bid.mediaType == 'native') {
+ expect(bid.native).to.be.a('object');
}
- }
+ })
+
it('Returns an empty array if invalid response is passed', function() {
serverResponses = spec.interpretResponse('invalid_response');
expect(serverResponses).to.be.an('array').that.is.empty;
diff --git a/test/spec/modules/dgkeywordRtdProvider_spec.js b/test/spec/modules/dgkeywordRtdProvider_spec.js
new file mode 100644
index 00000000000..a145f429557
--- /dev/null
+++ b/test/spec/modules/dgkeywordRtdProvider_spec.js
@@ -0,0 +1,351 @@
+import * as dgRtd from 'modules/dgkeywordRtdProvider.js';
+import { cloneDeep } from 'lodash';
+import { server } from 'test/mocks/xhr.js';
+import { config } from 'src/config.js';
+
+const DG_GET_KEYWORDS_TIMEOUT = 1950;
+const IGNORE_SET_ORTB2 = true;
+const DEF_CONFIG = {
+ name: 'dgkeyword',
+ waitForIt: true,
+ params: {
+ timeout: DG_GET_KEYWORDS_TIMEOUT,
+ },
+};
+const DUMMY_RESPONSE_HEADER = { 'Content-Type': 'application/json' };
+const DUMMY_RESPONSE = { s: ['s1', 's2'], t: ['t1', 't2'] };
+const SUCCESS_RESULT = { opeaud: ['s1', 's2'], opectx: ['t1', 't2'] };
+const SUCCESS_ORTB2 = {
+ ortb2: {
+ site: { keywords: SUCCESS_RESULT },
+ user: { keywords: SUCCESS_RESULT },
+ },
+};
+
+describe('Digital Garage Keyword Module', function () {
+ it('should init and return always true', function () {
+ expect(dgRtd.dgkeywordSubmodule.init()).to.equal(true);
+ });
+
+ describe('dgkeyword target test', function () {
+ it('should have no target', function () {
+ const adUnits_no_target = [
+ {
+ code: 'code1',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ },
+ },
+ bids: [
+ {
+ bidder: 'dg',
+ params: {
+ placementId: 99999999,
+ },
+ },
+ {
+ bidder: 'dg2',
+ params: {
+ placementId: 99999998,
+ dgkeyword: false,
+ },
+ },
+ {
+ bidder: 'dg3',
+ params: {
+ placementId: 99999997,
+ },
+ },
+ ],
+ },
+ {
+ code: 'code2',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ },
+ },
+ bids: [
+ {
+ bidder: 'dg',
+ params: {
+ placementId: 99999996,
+ },
+ },
+ {
+ bidder: 'dg2',
+ params: {
+ placementId: 99999995,
+ },
+ },
+ {
+ bidder: 'dg3',
+ params: {
+ placementId: 99999994,
+ },
+ },
+ ],
+ },
+ ];
+ expect(dgRtd.getTargetBidderOfDgKeywords(adUnits_no_target)).an('array')
+ .that.is.empty;
+ });
+ it('should have targets', function () {
+ const adUnits_targets = [
+ {
+ code: 'code1',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ },
+ },
+ bids: [
+ {
+ bidder: 'dg',
+ params: {
+ placementId: 99999999,
+ },
+ },
+ {
+ bidder: 'dg2',
+ params: {
+ placementId: 99999998,
+ dgkeyword: true,
+ },
+ },
+ {
+ bidder: 'dg3',
+ params: {
+ placementId: 99999997,
+ dgkeyword: false,
+ },
+ },
+ ],
+ },
+ {
+ code: 'code2',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ },
+ },
+ bids: [
+ {
+ bidder: 'dg',
+ params: {
+ placementId: 99999996,
+ dgkeyword: true,
+ },
+ },
+ {
+ bidder: 'dg2',
+ params: {
+ placementId: 99999995,
+ dgkeyword: 'aa',
+ },
+ },
+ {
+ bidder: 'dg3',
+ params: {
+ placementId: 99999994,
+ dgkeyword: true,
+ },
+ },
+ ],
+ },
+ ];
+ const targets = dgRtd.getTargetBidderOfDgKeywords(adUnits_targets);
+ expect(targets[0].bidder).to.be.equal('dg2');
+ expect(targets[0].params.placementId).to.be.equal(99999998);
+ expect(targets[0].params.dgkeyword).to.be.an('undefined');
+ expect(targets[1].bidder).to.be.equal('dg');
+ expect(targets[1].params.placementId).to.be.equal(99999996);
+ expect(targets[1].params.dgkeyword).to.be.an('undefined');
+ expect(targets[2].bidder).to.be.equal('dg3');
+ expect(targets[2].params.placementId).to.be.equal(99999994);
+ expect(targets[2].params.dgkeyword).to.be.an('undefined');
+ });
+ });
+
+ describe('get profile.', function () {
+ const AD_UNITS = [
+ {
+ code: 'code1',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ },
+ },
+ bids: [
+ {
+ bidder: 'dg',
+ params: {
+ placementId: 99999999,
+ },
+ },
+ {
+ bidder: 'dg2',
+ params: {
+ placementId: 99999998,
+ dgkeyword: true,
+ },
+ },
+ {
+ bidder: 'dg3',
+ params: {
+ placementId: 99999997,
+ dgkeyword: false,
+ },
+ },
+ ],
+ },
+ {
+ code: 'code2',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ },
+ },
+ bids: [
+ {
+ bidder: 'dg',
+ params: {
+ placementId: 99999996,
+ dgkeyword: true,
+ },
+ },
+ {
+ bidder: 'dg2',
+ params: {
+ placementId: 99999995,
+ dgkeyword: 'aa',
+ },
+ },
+ {
+ bidder: 'dg3',
+ params: {
+ placementId: 99999994,
+ },
+ },
+ ],
+ },
+ ];
+ it('should get profiles error(404).', function (done) {
+ let pbjs = cloneDeep(config);
+ pbjs.adUnits = cloneDeep(AD_UNITS);
+ let moduleConfig = cloneDeep(DEF_CONFIG);
+ dgRtd.getDgKeywordsAndSet(
+ pbjs,
+ () => {
+ let targets = pbjs.adUnits[0].bids;
+ expect(targets[1].bidder).to.be.equal('dg2');
+ expect(targets[1].params.placementId).to.be.equal(99999998);
+ expect(targets[1].params.dgkeyword).to.be.an('undefined');
+ expect(targets[1].params.keywords).to.be.an('undefined');
+ targets = pbjs.adUnits[1].bids;
+ expect(targets[0].bidder).to.be.equal('dg');
+ expect(targets[0].params.placementId).to.be.equal(99999996);
+ expect(targets[0].params.dgkeyword).to.be.an('undefined');
+ expect(targets[0].params.keywords).to.be.an('undefined');
+ expect(targets[2].bidder).to.be.equal('dg3');
+ expect(targets[2].params.placementId).to.be.equal(99999994);
+ expect(targets[2].params.dgkeyword).to.be.an('undefined');
+ expect(targets[2].params.keywords).to.be.an('undefined');
+
+ expect(pbjs.getBidderConfig()).to.be.deep.equal({});
+
+ done();
+ },
+ moduleConfig,
+ null
+ );
+ const request = server.requests[0];
+ request.respond(404);
+ });
+ it('should get profiles timeout.', function (done) {
+ let pbjs = cloneDeep(config);
+ pbjs.adUnits = cloneDeep(AD_UNITS);
+ let moduleConfig = cloneDeep(DEF_CONFIG);
+ moduleConfig.params.timeout = 10;
+ dgRtd.getDgKeywordsAndSet(
+ pbjs,
+ () => {
+ let targets = pbjs.adUnits[0].bids;
+ expect(targets[1].bidder).to.be.equal('dg2');
+ expect(targets[1].params.placementId).to.be.equal(99999998);
+ expect(targets[1].params.dgkeyword).to.be.an('undefined');
+ expect(targets[1].params.keywords).to.be.an('undefined');
+ targets = pbjs.adUnits[1].bids;
+ expect(targets[0].bidder).to.be.equal('dg');
+ expect(targets[0].params.placementId).to.be.equal(99999996);
+ expect(targets[0].params.dgkeyword).to.be.an('undefined');
+ expect(targets[0].params.keywords).to.be.an('undefined');
+ expect(targets[2].bidder).to.be.equal('dg3');
+ expect(targets[2].params.placementId).to.be.equal(99999994);
+ expect(targets[2].params.dgkeyword).to.be.an('undefined');
+ expect(targets[2].params.keywords).to.be.an('undefined');
+
+ expect(pbjs.getBidderConfig()).to.be.deep.equal({});
+
+ done();
+ },
+ moduleConfig,
+ null
+ );
+ setTimeout(() => {
+ const request = server.requests[0];
+ if (request) {
+ request.respond(
+ 200,
+ DUMMY_RESPONSE_HEADER,
+ JSON.stringify(DUMMY_RESPONSE)
+ );
+ }
+ }, 1000);
+ });
+ it('should get profiles ok(200).', function (done) {
+ let pbjs = cloneDeep(config);
+ pbjs.adUnits = cloneDeep(AD_UNITS);
+ if (IGNORE_SET_ORTB2) {
+ pbjs._ignoreSetOrtb2 = true;
+ }
+ let moduleConfig = cloneDeep(DEF_CONFIG);
+ dgRtd.getDgKeywordsAndSet(
+ pbjs,
+ () => {
+ let targets = pbjs.adUnits[0].bids;
+ expect(targets[1].bidder).to.be.equal('dg2');
+ expect(targets[1].params.placementId).to.be.equal(99999998);
+ expect(targets[1].params.dgkeyword).to.be.an('undefined');
+ expect(targets[1].params.keywords).to.be.deep.equal(SUCCESS_RESULT);
+ targets = pbjs.adUnits[1].bids;
+ expect(targets[0].bidder).to.be.equal('dg');
+ expect(targets[0].params.placementId).to.be.equal(99999996);
+ expect(targets[0].params.dgkeyword).to.be.an('undefined');
+ expect(targets[0].params.keywords).to.be.deep.equal(SUCCESS_RESULT);
+ expect(targets[2].bidder).to.be.equal('dg3');
+ expect(targets[2].params.placementId).to.be.equal(99999994);
+ expect(targets[2].params.dgkeyword).to.be.an('undefined');
+ expect(targets[2].params.keywords).to.be.an('undefined');
+
+ if (!IGNORE_SET_ORTB2) {
+ expect(pbjs.getBidderConfig()).to.be.deep.equal({
+ dg2: SUCCESS_ORTB2,
+ dg: SUCCESS_ORTB2,
+ });
+ }
+ done();
+ },
+ moduleConfig,
+ null
+ );
+ const request = server.requests[0];
+ request.respond(
+ 200,
+ DUMMY_RESPONSE_HEADER,
+ JSON.stringify(DUMMY_RESPONSE)
+ );
+ });
+ });
+});
diff --git a/test/spec/modules/districtmDmxBidAdapter_spec.js b/test/spec/modules/districtmDmxBidAdapter_spec.js
index 90c18c6a84f..4c060b1f5a4 100644
--- a/test/spec/modules/districtmDmxBidAdapter_spec.js
+++ b/test/spec/modules/districtmDmxBidAdapter_spec.js
@@ -114,7 +114,6 @@ const bidRequest = [{
lotamePanoramaId: {},
parrableId: {},
netId: {},
- sharedid: {},
lipb: {
lipbid: {}
},
diff --git a/test/spec/modules/djaxBidAdapter_spec.js b/test/spec/modules/djaxBidAdapter_spec.js
deleted file mode 100644
index bef2b1fddc5..00000000000
--- a/test/spec/modules/djaxBidAdapter_spec.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/djaxBidAdapter.js';
-
-const ENDPOINT = 'https://demo.reviveadservermod.com/headerbidding_adminshare/www/admin/plugins/Prebid/getAd.php';
-
-describe('The Djax bidding adapter', function () {
- describe('isBidRequestValid', function () {
- it('should return false when given an invalid bid', function () {
- const bid = {
- bidder: 'djax',
- };
- const isValid = spec.isBidRequestValid(bid);
- expect(isValid).to.equal(false);
- });
-
- it('should return true when given a publisherId in bid', function () {
- const bid = {
- bidder: 'djax',
- params: {
- publisherId: 2
- },
- };
- const isValid = spec.isBidRequestValid(bid);
- expect(isValid).to.equal(true);
- });
- });
-
- describe('buildRequests', function () {
- const bidRequests = [{
- 'bidder': 'djax',
- 'params': {
- 'publisherId': 2
- },
- 'adUnitCode': 'adunit-code',
- 'sizes': [
- [300, 250],
- [300, 600]
- ]
- }];
-
- const request = spec.buildRequests(bidRequests);
-
- it('sends bid request to our endpoint via POST', function () {
- expect(request.method).to.equal('POST');
- });
-
- it('check endpoint url', function () {
- expect(request.url).to.equal(ENDPOINT)
- });
-
- it('sets the proper banner object', function () {
- expect(bidRequests[0].params.publisherId).to.equal(2);
- })
- });
- const response = {
- body: [
- {
- 'requestId': '2ee937f15015c6',
- 'cpm': '0.2000',
- 'width': 300,
- 'height': 600,
- 'creativeId': '4',
- 'currency': 'USD',
- 'netRevenue': true,
- 'ad': 'ads.html',
- 'mediaType': 'banner'
- },
- {
- 'requestId': '3e1af92622bdc',
- 'cpm': '0.2000',
- 'creativeId': '4',
- 'context': 'outstream',
- 'currency': 'USD',
- 'netRevenue': true,
- 'vastUrl': 'tezt.xml',
- 'width': 640,
- 'height': 480,
- 'mediaType': 'video'
- }]
- };
-
- const request = [
- {
- 'bidder': 'djax',
- 'params': {
- 'publisherId': 2
- },
- 'mediaTypes': {
- 'banner': {
- 'sizes': [
- [300, 600]
- ]
- }
- },
- 'bidId': '2ee937f15015c6',
- 'src': 'client',
- },
- {
- 'bidder': 'djax',
- 'params': {
- 'publisherId': 2
- },
- 'mediaTypes': {
- 'video': {
- 'context': 'outstream',
- 'playerSize': [
- [640, 480]
- ]
- }
- },
- 'bidId': '3e1af92622bdc',
- 'src': 'client',
- }
- ];
-
- describe('interpretResponse', function () {
- it('return empty array when no ad found', function () {
- const response = {};
- const request = { bidRequests: [] };
- const bids = spec.interpretResponse(response, request);
- expect(bids).to.have.lengthOf(0);
- });
-
- it('check response for banner and video', function () {
- const bids = spec.interpretResponse(response, request);
- expect(bids).to.have.lengthOf(2);
- expect(bids[0].requestId).to.equal('2ee937f15015c6');
- expect(bids[0].cpm).to.equal('0.2000');
- expect(bids[1].cpm).to.equal('0.2000');
- expect(bids[0].width).to.equal(300);
- expect(bids[0].height).to.equal(600);
- expect(bids[1].vastUrl).to.not.equal('');
- expect(bids[0].ad).to.not.equal('');
- expect(bids[1].adResponse).to.not.equal('');
- expect(bids[1].renderer).not.to.be.an('undefined');
- });
- });
-
- describe('On winning bid', function () {
- const bids = spec.interpretResponse(response, request);
- spec.onBidWon(bids);
- });
-
- describe('On bid Time out', function () {
- const bids = spec.interpretResponse(response, request);
- spec.onTimeout(bids);
- });
-
- describe('user sync', function () {
- it('to check the user sync iframe', function () {
- let syncs = spec.getUserSyncs({
- iframeEnabled: true
- });
- expect(syncs).to.not.be.an('undefined');
- expect(syncs).to.have.lengthOf(1);
- expect(syncs[0].type).to.equal('iframe');
- });
- });
-});
diff --git a/test/spec/modules/dmdIdSystem_spec.js b/test/spec/modules/dmdIdSystem_spec.js
index 9c603eebbd5..3096a8e55f5 100644
--- a/test/spec/modules/dmdIdSystem_spec.js
+++ b/test/spec/modules/dmdIdSystem_spec.js
@@ -1,9 +1,15 @@
import * as utils from '../../../src/utils.js';
+import { server } from 'test/mocks/xhr.js';
+import { dmdIdSubmodule } from 'modules/dmdIdSystem.js';
-import {dmdIdSubmodule} from 'modules/dmdIdSystem.js';
-
-describe('Dmd ID System', function() {
+describe('Dmd ID System', function () {
let logErrorStub;
+ const config = {
+ params: {
+ api_key: '33344ffjddk22k22k222k22234k',
+ api_url: 'https://aix.hcn.health/api/v1/auths'
+ }
+ };
beforeEach(function () {
logErrorStub = sinon.stub(utils, 'logError');
@@ -45,4 +51,46 @@ describe('Dmd ID System', function() {
let data = { 'dmdId': 'U12345' };
expect(dmdIdSubmodule.decode('U12345')).to.deep.equal(data);
});
+
+ it('should return cacheObj if cacheObj is passed into getId', function () {
+ let data = { 'dmdId': 'U12345' };
+ expect(dmdIdSubmodule.getId(config, {}, { cookie: 'dmd-dgid' })).to.deep.equal({ cookie: 'dmd-dgid' });
+ expect(server.requests.length).to.eq(0);
+ });
+
+ it('Should invoke callback with response from API call', function () {
+ const callbackSpy = sinon.spy();
+ const domain = utils.getWindowLocation()
+ const callback = dmdIdSubmodule.getId(config).callback;
+ callback(callbackSpy);
+ const request = server.requests[0];
+ expect(request.method).to.eq('GET');
+ expect(request.requestHeaders['x-domain']).to.be.eq(domain);
+ expect(request.url).to.eq(config.params.api_url);
+ request.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({ dgid: 'U12345' }));
+ expect(callbackSpy.lastCall.lastArg).to.deep.equal('U12345');
+ });
+
+ it('Should log error if API response is not valid', function () {
+ const callbackSpy = sinon.spy();
+ const domain = utils.getWindowLocation()
+ const callback = dmdIdSubmodule.getId(config).callback;
+ callback(callbackSpy);
+ const request = server.requests[0];
+ expect(request.method).to.eq('GET');
+ expect(request.requestHeaders['x-domain']).to.be.eq(domain);
+ expect(request.url).to.eq(config.params.api_url);
+ request.respond(400, { 'Content-Type': 'application/json' }, undefined);
+ expect(logErrorStub.calledOnce).to.be.true;
+ });
+
+ it('Should log error if API call throws error', function () {
+ const callbackSpy = sinon.spy();
+ const callback = dmdIdSubmodule.getId(config).callback;
+ callback(callbackSpy);
+ const request = server.requests[0];
+ expect(request.url).to.eq(config.params.api_url);
+ request.error();
+ expect(logErrorStub.calledOnce).to.be.true;
+ });
});
diff --git a/test/spec/modules/dspxBidAdapter_spec.js b/test/spec/modules/dspxBidAdapter_spec.js
index 87752f7747a..09f40895ec9 100644
--- a/test/spec/modules/dspxBidAdapter_spec.js
+++ b/test/spec/modules/dspxBidAdapter_spec.js
@@ -61,7 +61,11 @@ describe('dspxAdapter', function () {
],
'bidId': '30b31c1838de1e1',
'bidderRequestId': '22edbae2733bf61',
- 'auctionId': '1d1a030790a475'
+ 'auctionId': '1d1a030790a475',
+ 'userId': {
+ 'netId': '123',
+ 'uid2': '456'
+ }
},
{
'bidder': 'dspx',
@@ -102,9 +106,18 @@ describe('dspxAdapter', function () {
'placement': '101',
'devMode': true
},
- 'sizes': [
- [300, 250]
- ],
+ 'mediaTypes': {
+ 'video': {
+ 'playerSize': [640, 480],
+ 'context': 'instream'
+ },
+ 'banner': {
+ 'sizes': [
+ [300, 250]
+ ]
+ }
+ },
+
'bidId': '30b31c1838de1e4',
'bidderRequestId': '22edbae2733bf67',
'auctionId': '1d1a030790a478'
@@ -145,7 +158,7 @@ describe('dspxAdapter', function () {
expect(request1.method).to.equal('GET');
expect(request1.url).to.equal(ENDPOINT_URL);
let data = request1.data.replace(/rnd=\d+\&/g, '').replace(/ref=.*\&bid/g, 'bid');
- expect(data).to.equal('_f=html&alternative=prebid_js&inventory_item_id=6682&srw=300&srh=250&idt=100&bid_id=30b31c1838de1e1&pfilter%5Bfloorprice%5D=1000000&pfilter%5Bprivate_auction%5D=0&pfilter%5Bgeo%5D%5Bcountry%5D=DE&pfilter%5Bgdpr_consent%5D=BOJ%2FP2HOJ%2FP2HABABMAAAAAZ%2BA%3D%3D&pfilter%5Bgdpr%5D=true&bcat=IAB2%2CIAB4&dvt=desktop');
+ expect(data).to.equal('_f=html&alternative=prebid_js&inventory_item_id=6682&srw=300&srh=250&idt=100&bid_id=30b31c1838de1e1&pfilter%5Bfloorprice%5D=1000000&pfilter%5Bprivate_auction%5D=0&pfilter%5Bgeo%5D%5Bcountry%5D=DE&pfilter%5Bgdpr_consent%5D=BOJ%2FP2HOJ%2FP2HABABMAAAAAZ%2BA%3D%3D&pfilter%5Bgdpr%5D=true&bcat=IAB2%2CIAB4&dvt=desktop&did_netid=123&did_uid2=456');
});
var request2 = spec.buildRequests([bidRequests[1]], bidderRequest)[0];
@@ -199,7 +212,8 @@ describe('dspxAdapter', function () {
'currency': 'EUR',
'ttl': 60,
'netRevenue': true,
- 'zone': '6682'
+ 'zone': '6682',
+ 'adomain': ['bdomain']
}
};
let serverVideoResponse = {
@@ -229,7 +243,8 @@ describe('dspxAdapter', function () {
netRevenue: true,
ttl: 300,
type: 'sspHTML',
- ad: ''
+ ad: '',
+ meta: {advertiserDomains: ['bdomain']}
}, {
requestId: '23beaa6af6cdde',
cpm: 0.5,
@@ -242,7 +257,8 @@ describe('dspxAdapter', function () {
ttl: 300,
type: 'vast2',
vastXml: '{"reason":7001,"status":"accepted"}',
- mediaType: 'video'
+ mediaType: 'video',
+ meta: {advertiserDomains: []}
}];
it('should get the correct bid response by display ad', function () {
@@ -255,6 +271,8 @@ describe('dspxAdapter', function () {
}];
let result = spec.interpretResponse(serverResponse, bidRequest[0]);
expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
+ expect(result[0].meta.advertiserDomains.length).to.equal(1);
+ expect(result[0].meta.advertiserDomains[0]).to.equal(expectedResponse[0].meta.advertiserDomains[0]);
});
it('should get the correct dspx video bid response by display ad', function () {
@@ -273,6 +291,7 @@ describe('dspxAdapter', function () {
}];
let result = spec.interpretResponse(serverVideoResponse, bidRequest[0]);
expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[1]));
+ expect(result[0].meta.advertiserDomains.length).to.equal(0);
});
it('handles empty bid response', function () {
@@ -339,4 +358,27 @@ describe('dspxAdapter', function () {
expect(userSync[2].type).to.be.equal('image');
});
});
+
+ describe(`getUserSyncs test usage in passback response`, function () {
+ let serverResponses;
+
+ beforeEach(function () {
+ serverResponses = [{
+ body: {
+ reason: 8002,
+ status: 'error',
+ msg: 'passback',
+ }
+ }];
+ });
+
+ it(`check for zero array when iframeEnabled`, function () {
+ expect(spec.getUserSyncs({ iframeEnabled: true })).to.be.an('array');
+ expect(spec.getUserSyncs({ iframeEnabled: true }, serverResponses).length).to.be.equal(0);
+ });
+ it(`check for zero array when iframeEnabled`, function () {
+ expect(spec.getUserSyncs({ pixelEnabled: true })).to.be.an('array');
+ expect(spec.getUserSyncs({ pixelEnabled: true }, serverResponses).length).to.be.equal(0);
+ });
+ });
});
diff --git a/test/spec/modules/e_volutionBidAdapter_spec.js b/test/spec/modules/e_volutionBidAdapter_spec.js
deleted file mode 100644
index 447420616d1..00000000000
--- a/test/spec/modules/e_volutionBidAdapter_spec.js
+++ /dev/null
@@ -1,235 +0,0 @@
-import {expect} from 'chai';
-import {spec} from '../../../modules/e_volutionBidAdapter.js';
-
-describe('EvolutionTechBidAdapter', function () {
- let bid = {
- bidId: '23fhj33i987f',
- bidder: 'e_volution',
- params: {
- placementId: 0,
- traffic: 'banner'
- }
- };
-
- describe('isBidRequestValid', function () {
- it('Should return true if there are bidId, params and placementId parameters present', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
- });
- it('Should return false if at least one of parameters is not present', function () {
- delete bid.params.placementId;
- expect(spec.isBidRequestValid(bid)).to.be.false;
- });
- });
-
- describe('buildRequests', function () {
- let serverRequest = spec.buildRequests([bid]);
- it('Creates a ServerRequest object with method, URL and data', function () {
- expect(serverRequest).to.exist;
- expect(serverRequest.method).to.exist;
- expect(serverRequest.url).to.exist;
- expect(serverRequest.data).to.exist;
- });
- it('Returns POST method', function () {
- expect(serverRequest.method).to.equal('POST');
- });
- it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://service.e-volution.ai/?c=o&m=multi');
- });
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'secure', 'host', 'page', 'placements');
- expect(data.deviceWidth).to.be.a('number');
- expect(data.deviceHeight).to.be.a('number');
- expect(data.language).to.be.a('string');
- expect(data.secure).to.be.within(0, 1);
- expect(data.host).to.be.a('string');
- expect(data.page).to.be.a('string');
- let placement = data['placements'][0];
- expect(placement).to.have.keys('placementId', 'bidId', 'traffic', 'sizes');
- expect(placement.placementId).to.equal(0);
- expect(placement.bidId).to.equal('23fhj33i987f');
- expect(placement.traffic).to.equal('banner');
- });
- it('Returns empty data if no valid requests are passed', function () {
- serverRequest = spec.buildRequests([]);
- let data = serverRequest.data;
- expect(data.placements).to.be.an('array').that.is.empty;
- });
- });
- describe('interpretResponse', function () {
- it('Should interpret banner response', function () {
- const banner = {
- body: [{
- mediaType: 'banner',
- width: 300,
- height: 250,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let bannerResponses = spec.interpretResponse(banner);
- expect(bannerResponses).to.be.an('array').that.is.not.empty;
- let dataItem = bannerResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.width).to.equal(300);
- expect(dataItem.height).to.equal(250);
- expect(dataItem.ad).to.equal('Test');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret video response', function () {
- const video = {
- body: [{
- vastUrl: 'test.com',
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let videoResponses = spec.interpretResponse(video);
- expect(videoResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = videoResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.5);
- expect(dataItem.vastUrl).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret native response', function () {
- const native = {
- body: [{
- mediaType: 'native',
- native: {
- clickUrl: 'test.com',
- title: 'Test',
- image: 'test.com',
- impressionTrackers: ['test.com'],
- },
- ttl: 120,
- cpm: 0.4,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let nativeResponses = spec.interpretResponse(native);
- expect(nativeResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = nativeResponses[0];
- expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native');
- expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.native.clickUrl).to.equal('test.com');
- expect(dataItem.native.title).to.equal('Test');
- expect(dataItem.native.image).to.equal('test.com');
- expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
- expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should return an empty array if invalid banner response is passed', function () {
- const invBanner = {
- body: [{
- width: 300,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
-
- let serverResponses = spec.interpretResponse(invBanner);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid video response is passed', function () {
- const invVideo = {
- body: [{
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invVideo);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid native response is passed', function () {
- const invNative = {
- body: [{
- mediaType: 'native',
- clickUrl: 'test.com',
- title: 'Test',
- impressionTrackers: ['test.com'],
- ttl: 120,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let serverResponses = spec.interpretResponse(invNative);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid response is passed', function () {
- const invalid = {
- body: [{
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invalid);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- });
- describe('getUserSyncs', function () {
- let userSync = spec.getUserSyncs();
- it('Returns valid URL and type', function () {
- if (spec.noSync) {
- expect(userSync).to.be.equal(false);
- } else {
- expect(userSync).to.be.an('array').with.lengthOf(1);
- expect(userSync[0].type).to.exist;
- expect(userSync[0].url).to.exist;
- expect(userSync[0].type).to.be.equal('image');
- expect(userSync[0].url).to.be.equal('https://service.e-volution.ai/?c=o&m=sync');
- }
- });
- });
-});
diff --git a/test/spec/modules/ebdrBidAdapter_spec.js b/test/spec/modules/ebdrBidAdapter_spec.js
index ba1cad475da..1c46381500f 100644
--- a/test/spec/modules/ebdrBidAdapter_spec.js
+++ b/test/spec/modules/ebdrBidAdapter_spec.js
@@ -160,7 +160,12 @@ describe('ebdrBidAdapter', function () {
currency: 'USD',
netRevenue: true,
ttl: 3600,
- vastUrl: serverResponse.seatbid[0].bid[0].nurl
+ vastUrl: serverResponse.seatbid[0].bid[0].nurl,
+ meta: {
+ advertiserDomains: [
+ 'advertiserdomain.com'
+ ]
+ }
});
});
});
@@ -201,7 +206,12 @@ describe('ebdrBidAdapter', function () {
height: serverResponse.seatbid[0].bid[0].h,
currency: 'USD',
netRevenue: true,
- ttl: 3600
+ ttl: 3600,
+ meta: {
+ advertiserDomains: [
+ 'advertiserdomain.com'
+ ]
+ },
});
});
});
diff --git a/test/spec/modules/edgequeryxBidAdapter_spec.js b/test/spec/modules/edgequeryxBidAdapter_spec.js
deleted file mode 100644
index a66c546bd7c..00000000000
--- a/test/spec/modules/edgequeryxBidAdapter_spec.js
+++ /dev/null
@@ -1,116 +0,0 @@
-import {
- expect
-} from 'chai';
-import {
- spec
-} from 'modules/edgequeryxBidAdapter.js';
-import {
- newBidder
-} from 'src/adapters/bidderFactory.js';
-import {
- config
-} from 'src/config.js';
-import * as utils from 'src/utils.js';
-import { requestBidsHook } from 'modules/consentManagement.js';
-
-// Default params with optional ones
-describe('Edge Query X bid adapter tests', function () {
- var DEFAULT_PARAMS = [{
- bidId: 'abcd1234',
- mediaTypes: {
- banner: {
- sizes: [
- [1, 1]
- ]
- }
- },
- bidder: 'edgequeryx',
- params: {
- accountId: 'test',
- widgetId: 'test'
- },
- requestId: 'efgh5678',
- transactionId: 'zsfgzzg'
- }];
- var BID_RESPONSE = {
- body: {
- requestId: 'abcd1234',
- cpm: 22,
- width: 1,
- height: 1,
- creativeId: 'EQXTest',
- currency: 'EUR',
- netRevenue: true,
- ttl: 360,
- ad: '< --- awesome script --- >'
- }
- };
-
- it('Verify build request', function () {
- config.setConfig({
- 'currency': {
- 'adServerCurrency': 'EUR'
- }
- });
- const request = spec.buildRequests(DEFAULT_PARAMS);
- expect(request[0]).to.have.property('url').and.to.equal('https://deep.edgequery.io/prebid/x');
- expect(request[0]).to.have.property('method').and.to.equal('POST');
- const requestContent = JSON.parse(request[0].data);
-
- expect(requestContent).to.have.property('accountId').and.to.equal('test');
- expect(requestContent).to.have.property('widgetId').and.to.equal('test');
- expect(requestContent).to.have.property('sizes');
- expect(requestContent.sizes[0]).to.have.property('w').and.to.equal(1);
- expect(requestContent.sizes[0]).to.have.property('h').and.to.equal(1);
- });
-
- it('Verify parse response', function () {
- const request = spec.buildRequests(DEFAULT_PARAMS);
- const bids = spec.interpretResponse(BID_RESPONSE, request[0]);
- expect(bids).to.have.lengthOf(1);
- const bid = bids[0];
- expect(bid.cpm).to.equal(22);
- expect(bid.ad).to.equal('< --- awesome script --- >');
- expect(bid.width).to.equal(1);
- expect(bid.height).to.equal(1);
- expect(bid.creativeId).to.equal('EQXTest');
- expect(bid.currency).to.equal('EUR');
- expect(bid.netRevenue).to.equal(true);
- expect(bid.ttl).to.equal(360);
- expect(bid.requestId).to.equal(DEFAULT_PARAMS[0].bidId);
-
- expect(function () {
- spec.interpretResponse(BID_RESPONSE, {
- data: 'invalid Json'
- })
- }).to.not.throw();
- });
-
- it('Verifies bidder code', function () {
- expect(spec.code).to.equal('edgequeryx');
- });
-
- it('Verifies bidder aliases', function () {
- expect(spec.aliases).to.have.lengthOf(1);
- expect(spec.aliases[0]).to.equal('eqx');
- });
-
- it('Verifies if bid request valid', function () {
- expect(spec.isBidRequestValid(DEFAULT_PARAMS[0])).to.equal(true);
- expect(spec.isBidRequestValid({})).to.equal(false);
- expect(spec.isBidRequestValid({
- params: {}
- })).to.equal(false);
- expect(spec.isBidRequestValid({
- params: {
- widgetyId: 'abcdef'
- }
- })).to.equal(false);
- expect(spec.isBidRequestValid({
- params: {
- widgetId: 'test',
- accountId: 'test'
- }
- })).to.equal(true);
- });
-});
diff --git a/test/spec/modules/eids_spec.js b/test/spec/modules/eids_spec.js
index 1ccaab2b302..d22225d191e 100644
--- a/test/spec/modules/eids_spec.js
+++ b/test/spec/modules/eids_spec.js
@@ -224,42 +224,6 @@ describe('eids array generation for known sub-modules', function() {
uids: [{id: 'some-random-id-value', atype: 1}]
});
});
- it('Sharedid', function() {
- const userId = {
- sharedid: {
- id: 'test_sharedId',
- third: 'test_sharedId'
- }
- };
- const newEids = createEidsArray(userId);
- expect(newEids.length).to.equal(1);
- expect(newEids[0]).to.deep.equal({
- source: 'sharedid.org',
- uids: [{
- id: 'test_sharedId',
- atype: 1,
- ext: {
- third: 'test_sharedId'
- }
- }]
- });
- });
- it('Sharedid: Not Synched', function() {
- const userId = {
- sharedid: {
- id: 'test_sharedId'
- }
- };
- const newEids = createEidsArray(userId);
- expect(newEids.length).to.equal(1);
- expect(newEids[0]).to.deep.equal({
- source: 'sharedid.org',
- uids: [{
- id: 'test_sharedId',
- atype: 1
- }]
- });
- });
it('zeotapIdPlus', function() {
const userId = {
@@ -354,6 +318,22 @@ describe('eids array generation for known sub-modules', function() {
}]
});
});
+
+ it('amxId', () => {
+ const id = 'c4bcadb0-124f-4468-a91a-d3d44cf311c5'
+ const userId = {
+ amxId: id
+ };
+
+ const [eid] = createEidsArray(userId);
+ expect(eid).to.deep.equal({
+ source: 'amxrtb.com',
+ uids: [{
+ atype: 1,
+ id,
+ }]
+ });
+ });
});
describe('Negative case', function() {
it('eids array generation for UN-known sub-module', function() {
diff --git a/test/spec/modules/emoteevBidAdapter_spec.js b/test/spec/modules/emoteevBidAdapter_spec.js
deleted file mode 100644
index 43ae62f1eb9..00000000000
--- a/test/spec/modules/emoteevBidAdapter_spec.js
+++ /dev/null
@@ -1,876 +0,0 @@
-import {
- assert, expect
-} from 'chai';
-import {
- ADAPTER_VERSION,
- DOMAIN,
- DOMAIN_DEVELOPMENT,
- DOMAIN_STAGING,
- domain,
- BIDDER_PATH,
- bidderUrl,
- buildRequests,
- conformBidRequest,
- DEFAULT_ENV,
- DEVELOPMENT,
- EVENTS_PATH,
- eventsUrl,
- FOOTER,
- gdprConsent,
- getDeviceDimensions,
- getDeviceInfo,
- getDocumentDimensions,
- getUserSyncs,
- getViewDimensions,
- IN_CONTENT,
- interpretResponse,
- isBidRequestValid,
- ON_ADAPTER_CALLED,
- ON_BID_WON,
- ON_BIDDER_TIMEOUT,
- onBidWon,
- onAdapterCalled,
- onTimeout,
- OVERLAY,
- PRODUCTION,
- requestsPayload,
- resolveDebug,
- resolveEnv,
- spec,
- STAGING,
- USER_SYNC_IFRAME_PATH,
- USER_SYNC_IMAGE_PATH,
- userSyncIframeUrl,
- userSyncImageUrl,
- validateSizes,
- validateContext,
- validateExternalId,
- VENDOR_ID,
- WALLPAPER,
- storage
-} from 'modules/emoteevBidAdapter.js';
-import * as utils from '../../../src/utils.js';
-import {config} from '../../../src/config.js';
-
-const cannedValidBidRequests = [{
- adUnitCode: '/19968336/header-bid-tag-1',
- auctionId: 'fcbf2b27-a951-496f-b5bb-1324ce7c0558',
- bidId: '2b8de6572e8193',
- bidRequestsCount: 1,
- bidder: 'emoteev',
- bidderRequestId: '1203b39fecc6a5',
- crumbs: {pubcid: 'f3371d16-4e8b-42b5-a770-7e5be1fdf03d'},
- params: {
- adSpaceId: 5084,
- context: IN_CONTENT,
- externalId: 42
- },
- sizes: [[300, 250], [250, 300], [300, 600]],
- transactionId: '58dbd732-7a39-45f1-b23e-1c24051a941c',
-}];
-const cannedBidderRequest = {
- auctionId: 'fcbf2b27-a951-496f-b5bb-1324ce7c0558',
- auctionStart: 1544200122837,
- bidderCode: 'emoteev',
- bidderRequestId: '1203b39fecc6a5',
- doneCbCallCount: 0,
- refererInfo: {
- canonicalUrl: undefined,
- numIframes: 0,
- reachedTop: true,
- referer: 'https://localhost:9999/integrationExamples/gpt/hello_world_emoteev.html',
- stack: ['https://localhost:9999/integrationExamples/gpt/hello_world_emoteev.html']
- },
- start: 1544200012839,
- timeout: 3000,
- gdprConsent: {
- gdprApplies: true,
- vendorData: {vendorConsents: {[VENDOR_ID]: true}},
- }
-};
-const serverResponse =
- {
- body: [
- {
- requestId: cannedValidBidRequests[0].bidId,
- cpm: 1,
- width: cannedValidBidRequests[0].sizes[0][0],
- height: cannedValidBidRequests[0].sizes[0][1],
- ad: '
',
- ttl: 360,
- creativeId: 123,
- netRevenue: false,
- currency: 'EUR',
- }
- ]
- };
-
-describe('emoteevBidAdapter', function () {
- describe('isBidRequestValid', function () {
- it('should return true when valid', function () {
- const validBid = {
- bidder: 'emoteev',
- bidId: '23a45b4e3',
- params: {
- adSpaceId: 12345,
- context: IN_CONTENT,
- externalId: 42
- },
- mediaTypes: {
- banner: {
- sizes: [[750, 200]]
- }
- },
- };
- expect(isBidRequestValid(validBid)).to.equal(true);
-
- expect(spec.isBidRequestValid(validBid)).to.exist.and.to.be.a('boolean');
- expect(spec.isBidRequestValid({})).to.exist.and.to.be.a('boolean');
- });
-
- it('should return false when required params are invalid', function () {
- expect(isBidRequestValid({
- bidder: '', // invalid bidder
- params: {
- adSpaceId: 12345,
- context: IN_CONTENT,
- externalId: 42
- },
- mediaTypes: {
- banner: {
- sizes: [[750, 200]]
- }
- },
- })).to.equal(false);
- expect(isBidRequestValid({
- 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: {
- sizes: [[750, 200]]
- }
- },
- })).to.equal(false);
- expect(isBidRequestValid({
- 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: {
- sizes: [[750]] // invalid size
- }
- },
- })).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- const
- env = DEFAULT_ENV,
- debug = true,
- currency = 'EUR',
- request = buildRequests(env, debug, currency, cannedValidBidRequests, cannedBidderRequest);
-
- expect(request).to.exist.and.have.all.keys(
- 'method',
- 'url',
- 'data',
- );
-
- expect(request.method).to.equal('POST');
- expect(request.url).to.equal(bidderUrl(env));
-
- expect(spec.buildRequests(cannedValidBidRequests, cannedBidderRequest)).to.exist.and.to.be.an('object');
- });
-
- describe('interpretResponse', function () {
- it('bid objects from response', function () {
- const bidResponses = interpretResponse(serverResponse);
- expect(bidResponses).to.be.an('array').that.is.not.empty;
- expect(bidResponses[0]).to.have.property('requestId', cannedValidBidRequests[0].bidId);
- expect(bidResponses[0]).to.have.property('cpm', serverResponse.body[0].cpm);
- expect(bidResponses[0]).to.have.property('width', serverResponse.body[0].width);
- expect(bidResponses[0]).to.have.property('height', serverResponse.body[0].height);
- expect(bidResponses[0]).to.have.property('ad', serverResponse.body[0].ad);
- expect(bidResponses[0]).to.have.property('ttl', serverResponse.body[0].ttl);
- expect(bidResponses[0]).to.have.property('creativeId', serverResponse.body[0].creativeId);
- expect(bidResponses[0]).to.have.property('netRevenue', serverResponse.body[0].netRevenue);
- expect(bidResponses[0]).to.have.property('currency', serverResponse.body[0].currency);
- });
- });
-
- describe('onAdapterCalled', function () {
- const
- bidRequest = cannedValidBidRequests[0],
- url = onAdapterCalled(DEFAULT_ENV, bidRequest);
-
- expect(url).to.have.property('protocol');
- expect(url).to.have.property('hostname');
- expect(url).to.have.property('pathname', EVENTS_PATH);
- expect(url).to.have.nested.property('search.eventName', ON_ADAPTER_CALLED);
- expect(url).to.have.nested.property('search.pubcId', bidRequest.crumbs.pubcid);
- expect(url).to.have.nested.property('search.bidId', bidRequest.bidId);
- expect(url).to.have.nested.property('search.adSpaceId', bidRequest.params.adSpaceId);
- expect(url).to.have.nested.property('search.cache_buster');
- });
-
- describe('onBidWon', function () {
- const
- pubcId = cannedValidBidRequests[0].crumbs.pubcid,
- bidObject = serverResponse.body[0],
- url = onBidWon(DEFAULT_ENV, pubcId, bidObject);
-
- expect(url).to.have.property('protocol');
- expect(url).to.have.property('hostname');
- expect(url).to.have.property('pathname', EVENTS_PATH);
- expect(url).to.have.nested.property('search.eventName', ON_BID_WON);
- expect(url).to.have.nested.property('search.pubcId', pubcId);
- expect(url).to.have.nested.property('search.bidId', bidObject.requestId);
- expect(url).to.have.nested.property('search.cache_buster');
- });
-
- describe('onTimeout', function () {
- const
- data = {
- ...cannedValidBidRequests[0],
- timeout: 123,
- },
- url = onTimeout(DEFAULT_ENV, data);
-
- expect(url).to.have.property('protocol');
- expect(url).to.have.property('hostname');
- expect(url).to.have.property('pathname', EVENTS_PATH);
- expect(url).to.have.nested.property('search.eventName', ON_BIDDER_TIMEOUT);
- expect(url).to.have.nested.property('search.bidId', data.bidId);
- expect(url).to.have.nested.property('search.pubcId', data.crumbs.pubcid);
- expect(url).to.have.nested.property('search.adSpaceId', data.params.adSpaceId);
- expect(url).to.have.nested.property('search.timeout', data.timeout);
- expect(url).to.have.nested.property('search.cache_buster');
- });
-
- describe('getUserSyncs', function () {
- expect(getUserSyncs(
- DEFAULT_ENV,
- {
- iframeEnabled: false,
- pixelEnabled: false
- })).to.deep.equal([]);
- expect(getUserSyncs(
- PRODUCTION,
- {
- iframeEnabled: false,
- pixelEnabled: true
- })).to.deep.equal([{
- type: 'image',
- url: userSyncImageUrl(PRODUCTION)
- }]);
- expect(getUserSyncs(
- STAGING,
- {
- iframeEnabled: true,
- pixelEnabled: false
- })).to.deep.equal([{
- type: 'iframe',
- url: userSyncIframeUrl(STAGING)
- }]);
- expect(getUserSyncs(
- DEVELOPMENT,
- {
- iframeEnabled: true,
- pixelEnabled: true
- })).to.deep.equal([{
- type: 'image',
- url: userSyncImageUrl(DEVELOPMENT)
- }, {
- type: 'iframe',
- url: userSyncIframeUrl(DEVELOPMENT)
- }]);
- });
-
- describe('domain', function () {
- expect(domain(null)).to.deep.equal(DOMAIN);
- expect(domain('anything')).to.deep.equal(DOMAIN);
- expect(domain(PRODUCTION)).to.deep.equal(DOMAIN);
- expect(domain(STAGING)).to.deep.equal(DOMAIN_STAGING);
- expect(domain(DEVELOPMENT)).to.deep.equal(DOMAIN_DEVELOPMENT);
- });
-
- describe('eventsUrl', function () {
- expect(eventsUrl(null)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(DEFAULT_ENV),
- pathname: EVENTS_PATH
- }));
- expect(eventsUrl('anything')).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(DEFAULT_ENV),
- pathname: EVENTS_PATH
- }));
- expect(eventsUrl(PRODUCTION)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(PRODUCTION),
- pathname: EVENTS_PATH
- }));
- expect(eventsUrl(STAGING)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(STAGING),
- pathname: EVENTS_PATH
- }));
- expect(eventsUrl(DEVELOPMENT)).to.deep.equal(utils.buildUrl({
- hostname: domain(DEVELOPMENT),
- pathname: EVENTS_PATH
- }));
- });
-
- describe('bidderUrl', function () {
- expect(bidderUrl(null)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(DEFAULT_ENV),
- pathname: BIDDER_PATH
- }));
- expect(bidderUrl('anything')).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(DEFAULT_ENV),
- pathname: BIDDER_PATH
- }));
- expect(bidderUrl(PRODUCTION)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(PRODUCTION),
- pathname: BIDDER_PATH
- }));
- expect(bidderUrl(STAGING)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(STAGING),
- pathname: BIDDER_PATH
- }));
- expect(bidderUrl(DEVELOPMENT)).to.deep.equal(utils.buildUrl({
- hostname: domain(DEVELOPMENT),
- pathname: BIDDER_PATH
- }));
- });
-
- describe('userSyncIframeUrl', function () {
- expect(userSyncIframeUrl(null)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(DEFAULT_ENV),
- pathname: USER_SYNC_IFRAME_PATH
- }));
- expect(userSyncIframeUrl('anything')).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(DEFAULT_ENV),
- pathname: USER_SYNC_IFRAME_PATH
- }));
- expect(userSyncIframeUrl(PRODUCTION)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(PRODUCTION),
- pathname: USER_SYNC_IFRAME_PATH
- }));
- expect(userSyncIframeUrl(STAGING)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(STAGING),
- pathname: USER_SYNC_IFRAME_PATH
- }));
- expect(userSyncIframeUrl(DEVELOPMENT)).to.deep.equal(utils.buildUrl({
- hostname: domain(DEVELOPMENT),
- pathname: USER_SYNC_IFRAME_PATH
- }));
- });
-
- describe('userSyncImageUrl', function () {
- expect(userSyncImageUrl(null)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(DEFAULT_ENV),
- pathname: USER_SYNC_IMAGE_PATH
- }));
- expect(userSyncImageUrl('anything')).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(DEFAULT_ENV),
- pathname: USER_SYNC_IMAGE_PATH
- }));
- expect(userSyncImageUrl(PRODUCTION)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(PRODUCTION),
- pathname: USER_SYNC_IMAGE_PATH
- }));
- expect(userSyncImageUrl(STAGING)).to.deep.equal(utils.buildUrl({
- protocol: 'https',
- hostname: domain(STAGING),
- pathname: USER_SYNC_IMAGE_PATH
- }));
- expect(userSyncImageUrl(DEVELOPMENT)).to.deep.equal(utils.buildUrl({
- hostname: domain(DEVELOPMENT),
- pathname: USER_SYNC_IMAGE_PATH
- }));
- });
-
- describe('conformBidRequest', function () {
- expect(conformBidRequest(cannedValidBidRequests[0])).to.deep.equal({
- params: cannedValidBidRequests[0].params,
- crumbs: cannedValidBidRequests[0].crumbs,
- sizes: cannedValidBidRequests[0].sizes,
- bidId: cannedValidBidRequests[0].bidId,
- bidderRequestId: cannedValidBidRequests[0].bidderRequestId,
- });
- });
-
- 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',
- debug = true;
-
- const payload = requestsPayload(debug, currency, cannedValidBidRequests, cannedBidderRequest);
-
- expect(payload).to.exist.and.have.all.keys(
- 'akPbjsVersion',
- 'bidRequests',
- 'currency',
- 'debug',
- 'language',
- 'refererInfo',
- 'deviceInfo',
- 'userAgent',
- 'gdprApplies',
- 'gdprConsent',
- );
-
- expect(payload.bidRequests[0]).to.exist.and.have.all.keys(
- 'params',
- 'crumbs',
- 'sizes',
- 'bidId',
- 'bidderRequestId',
- );
-
- expect(payload.akPbjsVersion).to.deep.equal(ADAPTER_VERSION);
- expect(payload.bidRequests[0].params).to.deep.equal(cannedValidBidRequests[0].params);
- expect(payload.bidRequests[0].crumbs).to.deep.equal(cannedValidBidRequests[0].crumbs);
- expect(payload.bidRequests[0].mediaTypes).to.deep.equal(cannedValidBidRequests[0].mediaTypes);
- expect(payload.bidRequests[0].bidId).to.deep.equal(cannedValidBidRequests[0].bidId);
- expect(payload.bidRequests[0].bidderRequestId).to.deep.equal(cannedValidBidRequests[0].bidderRequestId);
- expect(payload.currency).to.deep.equal(currency);
- expect(payload.debug).to.deep.equal(debug);
- expect(payload.language).to.deep.equal(navigator.language);
- expect(payload.deviceInfo).to.exist.and.have.all.keys(
- 'browserWidth',
- 'browserHeight',
- 'deviceWidth',
- 'deviceHeight',
- 'documentWidth',
- 'documentHeight',
- 'webGL',
- );
- expect(payload.userAgent).to.deep.equal(navigator.userAgent);
- expect(payload.gdprApplies).to.deep.equal(cannedBidderRequest.gdprConsent.gdprApplies);
- });
-
- describe('getViewDimensions', function () {
- const window = {
- innerWidth: 1024,
- innerHeight: 768
- };
- const documentWithElement = {
- documentElement:
- {
- clientWidth: 512,
- clientHeight: 384
- }
- };
- const documentWithBody = {
- body:
- {
- clientWidth: 512,
- clientHeight: 384
- }
- };
- expect(getViewDimensions(window, documentWithElement)).to.deep.equal({
- width: 1024,
- height: 768
- });
- expect(getViewDimensions(window, documentWithBody)).to.deep.equal({width: 1024, height: 768});
- expect(getViewDimensions(window, documentWithElement)).to.deep.equal({
- width: 1024,
- height: 768
- });
- expect(getViewDimensions(window, documentWithBody)).to.deep.equal({width: 1024, height: 768});
- expect(getViewDimensions({}, documentWithElement)).to.deep.equal({width: 512, height: 384});
- expect(getViewDimensions({}, documentWithBody)).to.deep.equal({width: 512, height: 384});
- });
-
- describe('getDeviceDimensions', function () {
- const window = {screen: {width: 1024, height: 768}};
- expect(getDeviceDimensions(window)).to.deep.equal({width: 1024, height: 768});
- expect(getDeviceDimensions({})).to.deep.equal({width: '', height: ''});
- });
-
- describe('getDocumentDimensions', function () {
- expect(getDocumentDimensions({
- documentElement: {
- clientWidth: 1,
- clientHeight: 1,
- offsetWidth: 0,
- offsetHeight: 0,
- scrollWidth: 0,
- scrollHeight: 0,
- },
- })).to.deep.equal({width: 1, height: 1});
-
- expect(getDocumentDimensions({
- documentElement: {
- clientWidth: 1,
- clientHeight: 1,
- offsetWidth: 0,
- offsetHeight: 0,
- scrollWidth: 0,
- scrollHeight: 0,
- },
- body: {
- scrollHeight: 0,
- offsetHeight: 0,
- }
- })).to.deep.equal({width: 1, height: 1});
-
- expect(getDocumentDimensions({
- documentElement: {
- clientWidth: 0,
- clientHeight: 0,
- offsetWidth: 1,
- offsetHeight: 1,
- scrollWidth: 0,
- scrollHeight: 0,
- },
- body: {
- scrollHeight: 0,
- offsetHeight: 0,
- }
- })).to.deep.equal({width: 1, height: 1});
-
- expect(getDocumentDimensions({
- documentElement: {
- clientWidth: 0,
- clientHeight: 0,
- offsetWidth: 0,
- offsetHeight: 0,
- scrollWidth: 1,
- scrollHeight: 1,
- },
- body: {
- scrollHeight: 0,
- offsetHeight: 0,
- }
- })).to.deep.equal({width: 1, height: 1});
-
- expect(getDocumentDimensions({
- documentElement: {
- clientWidth: undefined,
- clientHeight: undefined,
- offsetWidth: undefined,
- offsetHeight: undefined,
- scrollWidth: undefined,
- scrollHeight: undefined,
- },
- body: {
- scrollHeight: undefined,
- offsetHeight: undefined,
- }
- })).to.deep.equal({width: '', height: ''});
- });
-
- // describe('isWebGLEnabled', function () {
- // it('handles no webgl', function () {
- // const
- // document = new Document(),
- // canvas = sinon.createStubInstance(HTMLCanvasElement);
- // sinon.stub(document, 'createElement').withArgs('canvas').returns(canvas);
- // canvas.getContext.withArgs('webgl').returns(undefined);
- // canvas.getContext.withArgs('experimental-webgl').returns(undefined);
- // expect(isWebGLEnabled(document)).to.equal(false);
- // });
- //
- // it('handles webgl exception', function () {
- // const
- // document = new Document(),
- // canvas = sinon.createStubInstance(HTMLCanvasElement);
- // sinon.stub(document, 'createElement').withArgs('canvas').returns(canvas);
- // canvas.getContext.withArgs('webgl').throws(DOMException);
- // expect(isWebGLEnabled(document)).to.equal(false);
- // });
- //
- // it('handles experimental webgl', function () {
- // const
- // document = new Document(),
- // canvas = sinon.createStubInstance(HTMLCanvasElement);
- // sinon.stub(document, 'createElement').withArgs('canvas').returns(canvas);
- // canvas.getContext.withArgs('webgl').returns(undefined);
- // canvas.getContext.withArgs('experimental-webgl').returns(true);
- // expect(isWebGLEnabled(document)).to.equal(true);
- // });
- //
- // it('handles experimental webgl exception', function () {
- // const
- // document = new Document(),
- // canvas = sinon.createStubInstance(HTMLCanvasElement);
- // sinon.stub(document, 'createElement').withArgs('canvas').returns(canvas);
- // canvas.getContext.withArgs('webgl').returns(undefined);
- // canvas.getContext.withArgs('experimental-webgl').throws(DOMException);
- // expect(isWebGLEnabled(document)).to.equal(false);
- // });
- //
- // it('handles webgl', function () {
- // const
- // document = new Document(),
- // canvas = sinon.createStubInstance(HTMLCanvasElement);
- // sinon.stub(document, 'createElement').withArgs('canvas').returns(canvas);
- // canvas.getContext.withArgs('webgl').returns(true);
- // expect(isWebGLEnabled(document)).to.equal(true);
- // });
- // });
-
- describe('getDeviceInfo', function () {
- expect(getDeviceInfo(
- {width: 1, height: 2},
- {width: 3, height: 4},
- {width: 5, height: 6},
- true
- )).to.deep.equal({
- deviceWidth: 1,
- deviceHeight: 2,
- browserWidth: 3,
- browserHeight: 4,
- documentWidth: 5,
- documentHeight: 6,
- webGL: true
- });
- });
-
- describe('resolveEnv', function () {
- it('defaults to production', function () {
- expect(resolveEnv({}, null)).to.deep.equal(DEFAULT_ENV);
- });
- expect(resolveEnv({}, PRODUCTION)).to.deep.equal(PRODUCTION);
- expect(resolveEnv({}, STAGING)).to.deep.equal(STAGING);
- expect(resolveEnv({}, DEVELOPMENT)).to.deep.equal(DEVELOPMENT);
- expect(resolveEnv({emoteev: {env: PRODUCTION}}, null)).to.deep.equal(PRODUCTION);
- expect(resolveEnv({emoteev: {env: STAGING}}, null)).to.deep.equal(STAGING);
- expect(resolveEnv({emoteev: {env: DEVELOPMENT}}, null)).to.deep.equal(DEVELOPMENT);
- it('prioritizes parameter over configuration', function () {
- expect(resolveEnv({emoteev: {env: STAGING}}, DEVELOPMENT)).to.deep.equal(DEVELOPMENT);
- });
- });
-
- describe('resolveDebug', function () {
- it('defaults to production', function () {
- expect(resolveDebug({}, null)).to.deep.equal(false);
- });
- expect(resolveDebug({}, 'false')).to.deep.equal(false);
- expect(resolveDebug({}, 'true')).to.deep.equal(true);
- expect(resolveDebug({debug: true}, null)).to.deep.equal(true);
- it('prioritizes parameter over configuration', function () {
- expect(resolveDebug({debug: true}, 'false')).to.deep.equal(false);
- });
- });
-
- describe('side effects', function () {
- let triggerPixelStub;
- let getCookieSpy;
- let getConfigSpy;
- let getParameterByNameSpy;
-
- before(function() {
- config.resetConfig();
- });
- after(function() {
- config.resetConfig();
- });
- beforeEach(function () {
- triggerPixelStub = sinon.stub(utils, 'triggerPixel');
- getCookieSpy = sinon.spy(storage, 'getCookie');
- getConfigSpy = sinon.spy(config, 'getConfig');
- getParameterByNameSpy = sinon.spy(utils, 'getParameterByName');
- });
- afterEach(function () {
- triggerPixelStub.restore();
- getCookieSpy.restore();
- getConfigSpy.restore();
- getParameterByNameSpy.restore();
- });
-
- describe('isBidRequestValid', function () {
- it('has intended side-effects', function () {
- const validBidRequest = {
- bidder: 'emoteev',
- bidId: '23a45b4e3',
- params: {
- adSpaceId: 12345,
- },
- mediaTypes: {
- banner: {
- sizes: [[750, 200]]
- }
- },
- };
- spec.isBidRequestValid(validBidRequest);
- sinon.assert.notCalled(utils.triggerPixel);
- sinon.assert.notCalled(storage.getCookie);
- // sinon.assert.notCalled(config.getConfig);
- sinon.assert.notCalled(utils.getParameterByName);
- });
- });
- describe('isBidRequestValid empty request', function() {
- it('has intended side-effects empty request', function () {
- const invalidBidRequest = {};
- spec.isBidRequestValid(invalidBidRequest);
- sinon.assert.notCalled(utils.triggerPixel);
- sinon.assert.notCalled(storage.getCookie);
- // disabling these getConfig tests as they have been flaky in browserstack testing
- // sinon.assert.notCalled(config.getConfig);
- sinon.assert.notCalled(utils.getParameterByName);
- });
- });
- describe('buildRequests', function () {
- it('has intended side-effects', function () {
- spec.buildRequests(cannedValidBidRequests, cannedBidderRequest);
- sinon.assert.notCalled(utils.triggerPixel);
- sinon.assert.notCalled(storage.getCookie);
- // sinon.assert.callCount(config.getConfig, 3);
- sinon.assert.callCount(utils.getParameterByName, 2);
- });
- });
- describe('interpretResponse', function () {
- it('has intended side-effects', function () {
- spec.interpretResponse(serverResponse);
- sinon.assert.notCalled(utils.triggerPixel);
- sinon.assert.notCalled(storage.getCookie);
- // sinon.assert.notCalled(config.getConfig);
- sinon.assert.notCalled(utils.getParameterByName);
- });
- });
- describe('onBidWon', function () {
- it('has intended side-effects', function () {
- const bidObject = serverResponse.body[0];
- spec.onBidWon(bidObject);
- sinon.assert.calledOnce(utils.triggerPixel);
- sinon.assert.calledOnce(storage.getCookie);
- // sinon.assert.calledOnce(config.getConfig);
- sinon.assert.calledOnce(utils.getParameterByName);
- });
- });
- describe('onTimeout', function () {
- it('has intended side-effects', function () {
- spec.onTimeout(cannedValidBidRequests[0]);
- sinon.assert.calledOnce(utils.triggerPixel);
- sinon.assert.notCalled(storage.getCookie);
- // sinon.assert.calledOnce(config.getConfig);
- sinon.assert.calledOnce(utils.getParameterByName);
- });
- });
- describe('getUserSyncs', function () {
- it('has intended side-effects', function () {
- spec.getUserSyncs({});
- sinon.assert.notCalled(utils.triggerPixel);
- sinon.assert.notCalled(storage.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);
- });
- });
-});
diff --git a/test/spec/modules/emx_digitalBidAdapter_spec.js b/test/spec/modules/emx_digitalBidAdapter_spec.js
index 0f82122b9c1..5831a8506c1 100644
--- a/test/spec/modules/emx_digitalBidAdapter_spec.js
+++ b/test/spec/modules/emx_digitalBidAdapter_spec.js
@@ -414,6 +414,40 @@ describe('emx_digital Adapter', function () {
expect(request.source.ext.schain).to.have.property('ver', '1.0');
expect(request.source.ext.schain.nodes[0].asi).to.equal(schainBidderRequest.bids[0].schain.nodes[0].asi);
});
+
+ it('should add liveramp identitylink id to request', () => {
+ const idl_env = '123';
+ const bidRequestWithID = utils.deepClone(bidderRequest);
+ bidRequestWithID.userId = { idl_env };
+ let requestWithID = spec.buildRequests(bidRequestWithID.bids, bidRequestWithID);
+ requestWithID = JSON.parse(requestWithID.data);
+ expect(requestWithID.user.ext.eids[0]).to.deep.equal({
+ source: 'liveramp.com',
+ uids: [{
+ id: idl_env,
+ ext: {
+ rtiPartner: 'idl'
+ }
+ }]
+ });
+ });
+
+ it('should add UID 2.0 to request', () => {
+ const uid2 = { id: '456' };
+ const bidRequestWithUID = utils.deepClone(bidderRequest);
+ bidRequestWithUID.userId = { uid2 };
+ let requestWithUID = spec.buildRequests(bidRequestWithUID.bids, bidRequestWithUID);
+ requestWithUID = JSON.parse(requestWithUID.data);
+ expect(requestWithUID.user.ext.eids[0]).to.deep.equal({
+ source: 'uidapi.com',
+ uids: [{
+ id: uid2.id,
+ ext: {
+ rtiPartner: 'UID2'
+ }
+ }]
+ });
+ });
});
describe('interpretResponse', function () {
diff --git a/test/spec/modules/engageyaBidAdapter_spec.js b/test/spec/modules/engageyaBidAdapter_spec.js
deleted file mode 100644
index ad411fc9350..00000000000
--- a/test/spec/modules/engageyaBidAdapter_spec.js
+++ /dev/null
@@ -1,161 +0,0 @@
-import {expect} from 'chai';
-import {spec} from 'modules/engageyaBidAdapter.js';
-import * as utils from 'src/utils.js';
-
-const ENDPOINT_URL = 'https://recs.engageya.com/rec-api/getrecs.json';
-
-export const _getUrlVars = function(url) {
- var hash;
- var myJson = {};
- var hashes = url.slice(url.indexOf('?') + 1).split('&');
- for (var i = 0; i < hashes.length; i++) {
- hash = hashes[i].split('=');
- myJson[hash[0]] = hash[1];
- }
- return myJson;
-}
-
-describe('engageya adapter', function() {
- let bidRequests;
- let nativeBidRequests;
-
- beforeEach(function() {
- bidRequests = [
- {
- bidder: 'engageya',
- params: {
- widgetId: 85610,
- websiteId: 91140,
- pageUrl: '[PAGE_URL]'
- }
- }
- ]
-
- nativeBidRequests = [
- {
- bidder: 'engageya',
- params: {
- widgetId: 85610,
- websiteId: 91140,
- pageUrl: '[PAGE_URL]'
- },
- nativeParams: {
- title: {
- required: true,
- len: 80
- },
- image: {
- required: true,
- sizes: [150, 50]
- },
- sponsoredBy: {
- required: true
- }
- }
- }
- ]
- })
- describe('isBidRequestValid', function () {
- it('valid bid case', function () {
- let validBid = {
- bidder: 'engageya',
- params: {
- widgetId: 85610,
- websiteId: 91140,
- pageUrl: '[PAGE_URL]'
- }
- }
- let isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(true);
- });
-
- it('invalid bid case: widgetId and websiteId is not passed', function() {
- let validBid = {
- bidder: 'engageya',
- params: {
- }
- }
- let isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- })
-
- it('invalid bid case: widget id must be number', function() {
- let invalidBid = {
- bidder: 'engageya',
- params: {
- widgetId: '157746a',
- websiteId: 91140,
- pageUrl: '[PAGE_URL]'
- }
- }
- let isValid = spec.isBidRequestValid(invalidBid);
- expect(isValid).to.equal(false);
- })
- })
-
- describe('buildRequests', function () {
- it('sends bid request to ENDPOINT via GET', function () {
- const request = spec.buildRequests(bidRequests)[0];
- expect(request.url).to.include(ENDPOINT_URL);
- expect(request.method).to.equal('GET');
- });
-
- it('buildRequests function should not modify original bidRequests object', function () {
- let originalBidRequests = utils.deepClone(bidRequests);
- let request = spec.buildRequests(bidRequests);
- expect(bidRequests).to.deep.equal(originalBidRequests);
- });
-
- it('buildRequests function should not modify original nativeBidRequests object', function () {
- let originalBidRequests = utils.deepClone(nativeBidRequests);
- let request = spec.buildRequests(nativeBidRequests);
- expect(nativeBidRequests).to.deep.equal(originalBidRequests);
- });
-
- it('Request params check', function() {
- let request = spec.buildRequests(bidRequests)[0];
- const data = _getUrlVars(request.url)
- expect(parseInt(data.wid)).to.exist.and.to.equal(bidRequests[0].params.widgetId);
- expect(parseInt(data.webid)).to.exist.and.to.equal(bidRequests[0].params.websiteId);
- })
- })
-
- describe('interpretResponse', function () {
- let response = {recs: [
- {
- 'ecpm': 0.0920,
- 'postId': '',
- 'ad': '',
- 'thumbnail_path': 'https://engageya.live/wp-content/uploads/2019/05/images.png'
- }
- ],
- imageWidth: 300,
- imageHeight: 250,
- ireqId: '1d236f7890b',
- pbtypeId: 2};
-
- it('should get correct bid response', function () {
- let expectedResponse = [
- {
- 'requestId': '1d236f7890b',
- 'cpm': 0.0920,
- 'width': 300,
- 'height': 250,
- 'netRevenue': false,
- 'currency': 'USD',
- 'creativeId': '',
- 'ttl': 700,
- 'ad': ''
- }
- ];
- let request = spec.buildRequests(bidRequests)[0];
- let result = spec.interpretResponse({body: response}, request);
- expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
- expect(result[0].cpm).to.not.equal(null);
- expect(result[0].creativeId).to.not.equal(null);
- expect(result[0].ad).to.not.equal(null);
- expect(result[0].currency).to.equal('USD');
- expect(result[0].netRevenue).to.equal(false);
- });
- })
-})
diff --git a/test/spec/modules/envivoBidAdapter_spec.js b/test/spec/modules/envivoBidAdapter_spec.js
deleted file mode 100644
index 7bd1dd1ccf1..00000000000
--- a/test/spec/modules/envivoBidAdapter_spec.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/envivoBidAdapter.js';
-
-const ENDPOINT = 'https://ad.nvivo.tv/ads/www/admin/plugins/Prebid/getAd.php';
-
-describe('The Envivo bidding adapter', function () {
- describe('isBidRequestValid', function () {
- it('should return false when given an invalid bid', function () {
- const bid = {
- bidder: 'envivo',
- };
- const isValid = spec.isBidRequestValid(bid);
- expect(isValid).to.equal(false);
- });
-
- it('should return true when given a publisherId in bid', function () {
- const bid = {
- bidder: 'envivo',
- params: {
- publisherId: 14
- },
- };
- const isValid = spec.isBidRequestValid(bid);
- expect(isValid).to.equal(true);
- });
- });
-
- describe('buildRequests', function () {
- const bidRequests = [{
- 'bidder': 'envivo',
- 'params': {
- 'publisherId': 14
- },
- 'adUnitCode': 'adunit-code',
- 'sizes': [
- [300, 250],
- [300, 600]
- ]
- }];
-
- const request = spec.buildRequests(bidRequests);
-
- it('sends bid request to our endpoint via POST', function () {
- expect(request.method).to.equal('POST');
- });
-
- it('check endpoint url', function () {
- expect(request.url).to.equal(ENDPOINT)
- });
-
- it('sets the proper banner object', function () {
- expect(bidRequests[0].params.publisherId).to.equal(14);
- })
- });
- const response = {
- body: [
- {
- 'requestId': '2ee937f15015c6',
- 'cpm': '0.2000',
- 'width': 300,
- 'height': 600,
- 'creativeId': '4',
- 'currency': 'USD',
- 'netRevenue': true,
- 'ad': 'ads.html',
- 'mediaType': 'banner'
- },
- {
- 'requestId': '3e1af92622bdc',
- 'cpm': '0.2000',
- 'creativeId': '4',
- 'context': 'outstream',
- 'currency': 'USD',
- 'netRevenue': true,
- 'vastUrl': 'tezt.xml',
- 'width': 640,
- 'height': 480,
- 'mediaType': 'video'
- }]
- };
-
- const request = [
- {
- 'bidder': 'envivo',
- 'params': {
- 'publisherId': 14
- },
- 'mediaTypes': {
- 'banner': {
- 'sizes': [
- [300, 600]
- ]
- }
- },
- 'bidId': '2ee937f15015c6',
- 'src': 'client',
- },
- {
- 'bidder': 'envivo',
- 'params': {
- 'publisherId': 14
- },
- 'mediaTypes': {
- 'video': {
- 'context': 'outstream',
- 'playerSize': [
- [640, 480]
- ]
- }
- },
- 'bidId': '3e1af92622bdc',
- 'src': 'client',
- }
- ];
-
- describe('interpretResponse', function () {
- it('return empty array when no ad found', function () {
- const response = {};
- const request = { bidRequests: [] };
- const bids = spec.interpretResponse(response, request);
- expect(bids).to.have.lengthOf(0);
- });
-
- it('check response for banner and video', function () {
- const bids = spec.interpretResponse(response, request);
- expect(bids).to.have.lengthOf(2);
- expect(bids[0].requestId).to.equal('2ee937f15015c6');
- expect(bids[0].cpm).to.equal('0.2000');
- expect(bids[1].cpm).to.equal('0.2000');
- expect(bids[0].width).to.equal(300);
- expect(bids[0].height).to.equal(600);
- expect(bids[1].vastUrl).to.not.equal('');
- expect(bids[0].ad).to.not.equal('');
- expect(bids[1].adResponse).to.not.equal('');
- expect(bids[1].renderer).not.to.be.an('undefined');
- });
- });
-
- describe('On winning bid', function () {
- const bids = spec.interpretResponse(response, request);
- spec.onBidWon(bids);
- });
-
- describe('On bid Time out', function () {
- const bids = spec.interpretResponse(response, request);
- spec.onTimeout(bids);
- });
-
- describe('user sync', function () {
- it('to check the user sync iframe', function () {
- let syncs = spec.getUserSyncs({
- iframeEnabled: true
- });
- expect(syncs).to.not.be.an('undefined');
- expect(syncs).to.have.lengthOf(1);
- expect(syncs[0].type).to.equal('iframe');
- });
- });
-});
diff --git a/test/spec/modules/fidelityBidAdapter_spec.js b/test/spec/modules/fidelityBidAdapter_spec.js
deleted file mode 100644
index 304a98675b3..00000000000
--- a/test/spec/modules/fidelityBidAdapter_spec.js
+++ /dev/null
@@ -1,233 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/fidelityBidAdapter.js';
-import { newBidder } from 'src/adapters/bidderFactory.js';
-
-describe('FidelityAdapter', 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': 'fidelity',
- 'params': {
- 'zoneid': '27248',
- 'floor': '0.05',
- 'server': 'x.fidelity-media.com',
- },
- 'adUnitCode': 'adunit-code',
- '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 true when required params found', function () {
- let bid = Object.assign({}, bid);
- delete bid.params;
- bid.params = {
- 'zoneid': '27248',
- };
- 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 = {
- 'zoneid': 0,
- };
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- let bidderRequest = {
- bidderCode: 'fidelity',
- requestId: 'c45dd708-a418-42ec-b8a7-b70a6c6fab0a',
- bidderRequestId: '178e34bad3658f',
- bids: [
- {
- bidder: 'fidelity',
- params: {
- zoneid: '27248',
- floor: '0.05',
- server: 'x.fidelity-media.com',
- },
- placementCode: '/19968336/header-bid-tag-0',
- sizes: [[300, 250], [320, 50]],
- bidId: '2ffb201a808da7',
- bidderRequestId: '178e34bad3658f',
- requestId: 'c45dd708-a418-42ec-b8a7-b70a6c6fab0a',
- transactionId: 'd45dd707-a418-42ec-b8a7-b70a6c6fab0b',
- schain: {
- ver: '1.0',
- complete: 1,
- nodes: [{
- asi: 'exchange1.com',
- sid: '1234',
- hp: 1,
- rid: 'bid-request-1',
- name: 'publisher',
- domain: 'publisher.com'
- }]
- }
- }
- ],
- start: 1472239426002,
- auctionStart: 1472239426000,
- timeout: 5000,
- refererInfo: {
- referer: 'http://test.com/index.html'
- }
- };
-
- it('should add params to the request', function () {
- let schainString = '1.0,1!exchange1.com,1234,1,bid-request-1,publisher,publisher.com';
- const [request] = spec.buildRequests(bidderRequest.bids, bidderRequest);
- const payload = request.data;
- expect(payload.from).to.exist;
- expect(payload.v).to.exist;
- expect(payload.requestid).to.exist;
- expect(payload.impid).to.exist;
- expect(payload.zoneid).to.exist;
- expect(payload.floor).to.exist;
- expect(payload.charset).to.exist;
- expect(payload.subid).to.exist;
- expect(payload.flashver).to.exist;
- expect(payload.tmax).to.exist;
- expect(payload.defloc).to.exist;
- expect(payload.schain).to.exist.and.to.be.a('string');
- expect(payload.schain).to.equal(schainString);
- });
-
- it('should add consent information to the request - TCF v1', function () {
- let consentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
- let uspConsentString = '1YN-';
- bidderRequest.gdprConsent = {
- gdprApplies: true,
- allowAuctionWithoutConsent: true,
- consentString: consentString,
- vendorData: {
- vendorConsents: {
- '408': true
- },
- },
- apiVersion: 1
- };
- bidderRequest.uspConsent = uspConsentString;
- const [request] = spec.buildRequests(bidderRequest.bids, bidderRequest);
- const payload = request.data;
- expect(payload.gdpr).to.exist.and.to.be.a('number');
- expect(payload.gdpr).to.equal(1);
- expect(payload.consent_str).to.exist.and.to.be.a('string');
- expect(payload.consent_str).to.equal(consentString);
- expect(payload.consent_given).to.exist.and.to.be.a('number');
- expect(payload.consent_given).to.equal(1);
- expect(payload.us_privacy).to.exist.and.to.be.a('string');
- expect(payload.us_privacy).to.equal(uspConsentString);
- });
-
- it('should add consent information to the request - TCF v2', function () {
- let consentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
- let uspConsentString = '1YN-';
- bidderRequest.gdprConsent = {
- gdprApplies: true,
- allowAuctionWithoutConsent: true,
- consentString: consentString,
- vendorData: {
- vendor: {
- consents: {
- '408': true
- }
- },
- },
- apiVersion: 2
- };
- bidderRequest.uspConsent = uspConsentString;
- const [request] = spec.buildRequests(bidderRequest.bids, bidderRequest);
- const payload = request.data;
- expect(payload.gdpr).to.exist.and.to.be.a('number');
- expect(payload.gdpr).to.equal(1);
- expect(payload.consent_str).to.exist.and.to.be.a('string');
- expect(payload.consent_str).to.equal(consentString);
- expect(payload.consent_given).to.exist.and.to.be.a('number');
- expect(payload.consent_given).to.equal(1);
- expect(payload.us_privacy).to.exist.and.to.be.a('string');
- expect(payload.us_privacy).to.equal(uspConsentString);
- });
-
- it('sends bid request to ENDPOINT via GET', function () {
- const [request] = spec.buildRequests(bidderRequest.bids, bidderRequest);
- expect(request.url).to.equal('https://x.fidelity-media.com/delivery/hb.php');
- expect(request.method).to.equal('GET');
- });
- })
-
- describe('interpretResponse', function () {
- let response = {
- 'id': '543210',
- 'seatbid': [ {
- 'bid': [ {
- 'id': '1111111',
- 'impid': 'bidId-123456-1',
- 'price': 0.09,
- 'adm': '',
- 'width': 728,
- 'height': 90,
- } ]
- } ]
- };
-
- it('should get correct bid response', function () {
- let expectedResponse = [
- {
- requestId: 'bidId-123456-1',
- creativeId: 'bidId-123456-1',
- cpm: 0.09,
- width: 728,
- height: 90,
- ad: '',
- netRevenue: true,
- currency: 'USD',
- ttl: 360,
- }
- ];
-
- let result = spec.interpretResponse({ body: response });
- expect(Object.keys(result[0])).to.deep.equal(Object.keys(expectedResponse[0]));
- });
-
- it('handles nobid responses', function () {
- let response = {
- 'id': '543210',
- 'seatbid': [ ]
- };
-
- let result = spec.interpretResponse({ body: response });
- expect(result.length).to.equal(0);
- });
- });
-
- describe('user sync', function () {
- const syncUrl = 'https://x.fidelity-media.com/delivery/matches.php?type=iframe';
-
- it('should register the sync iframe', function () {
- expect(spec.getUserSyncs({})).to.be.undefined;
- expect(spec.getUserSyncs({iframeEnabled: false})).to.be.undefined;
- const options = spec.getUserSyncs({iframeEnabled: true});
- expect(options).to.not.be.undefined;
- expect(options).to.have.lengthOf(1);
- expect(options[0].type).to.equal('iframe');
- expect(options[0].url).to.equal(syncUrl);
- });
- });
-});
diff --git a/test/spec/modules/fluctBidAdapter_spec.js b/test/spec/modules/fluctBidAdapter_spec.js
deleted file mode 100644
index 6530a3c36cf..00000000000
--- a/test/spec/modules/fluctBidAdapter_spec.js
+++ /dev/null
@@ -1,201 +0,0 @@
-import {expect} from 'chai';
-import {spec} from 'modules/fluctBidAdapter.js';
-import {newBidder} from 'src/adapters/bidderFactory.js';
-import {config} from 'src/config.js';
-
-describe('fluctAdapter', 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 () {
- const bid = {
- bidder: 'fluct',
- params: {
- dfpUnitCode: '/1000/dfp_unit_code',
- tagId: '10000:100000001',
- groupId: '1000000002',
- }
- };
- 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);
- });
-
- it('should return true when dfpUnitCode is not passed', function () {
- let bid = Object.assign({}, bid);
- delete bid.params;
- bid.params = {
- tagId: '10000:100000001',
- groupId: '1000000002',
- };
- expect(spec.isBidRequestValid(bid)).to.equal(true);
- });
-
- it('should return false when groupId is not passed', function () {
- let bid = Object.assign({}, bid);
- delete bid.params;
- bid.params = {
- dfpUnitCode: '/1000/dfp_unit_code',
- tagId: '10000:100000001',
- };
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- const bidRequests = [{
- bidder: 'fluct',
- params: {
- dfpUnitCode: '/100000/unit_code',
- tagId: '10000:100000001',
- groupId: '1000000002',
- },
- adUnitCode: '/10000/unit_code',
- sizes: [[300, 250], [336, 280]],
- bidId: '237f4d1a293f99',
- bidderRequestId: '1a857fa34c1c96',
- auctionId: 'a297d1aa-7900-4ce4-a0aa-caa8d46c4af7',
- transactionId: '00b2896c-2731-4f01-83e4-7a3ad5da13b6',
- }];
- const bidderRequest = {
- refererInfo: {
- referer: 'http://example.com'
- }
- };
-
- it('sends bid request to ENDPOINT via POST', function () {
- const request = spec.buildRequests(bidRequests, bidderRequest)[0];
- expect(request.method).to.equal('POST');
- });
- });
-
- describe('interpretResponse', function() {
- const callBeaconSnippet = '';
-
- it('should get correct bid response', function() {
- const bidRequest = {
- bidder: 'fluct',
- params: {
- dfpUnitCode: '/10000/unit_code',
- tagid: '10000:100000001',
- groupId: '1000000002',
- },
- adUnitCode: '/10000/unit_code',
- sizes: [[300, 250], [336, 280]],
- bidId: '237f4d1a293f99',
- bidderRequestId: '1a857fa34c1c96',
- auctionId: 'a297d1aa-7900-4ce4-a0aa-caa8d46c4af7',
- transactionId: '00b2896c-2731-4f01-83e4-7a3ad5da13b6',
- };
-
- const serverResponse = {
- body: {
- id: '237f4d1a293f99',
- cur: 'JPY',
- seatbid: [{
- bid: [{
- price: 100,
- w: 300,
- h: 250,
- adm: '',
- burl: 'https://i.adingo.jp/?test=1&et=hb&bidid=237f4d1a293f99',
- crid: 'test_creative',
- }]
- }]
- }
- };
-
- const expectedResponse = [
- {
- bidderCode: 'fluct',
- requestId: '237f4d1a293f99',
- currency: 'JPY',
- cpm: 100,
- netRevenue: true,
- width: 300,
- height: 250,
- creativeId: 'test_creative',
- ttl: 300,
- ad: '' + callBeaconSnippet,
- }
- ];
-
- const result = spec.interpretResponse(serverResponse, bidRequest);
- expect(result).to.have.lengthOf(1);
- expect(result).to.deep.have.same.members(expectedResponse);
- });
-
- it('should get correct bid response with dealId', function() {
- const bidRequest = {
- bidder: 'fluct',
- params: {
- dfpUnitCode: '/10000/unit_code',
- tagid: '10000:100000001',
- groupId: '1000000002'
- },
- adUnitCode: '/10000/unit_code',
- sizes: [[300, 250], [336, 280]],
- bidId: '237f4d1a293f99',
- bidderRequestId: '1a857fa34c1c96',
- auctionId: 'a297d1aa-7900-4ce4-a0aa-caa8d46c4af7',
- transactionId: '00b2896c-2731-4f01-83e4-7a3ad5da13b6',
- };
-
- const serverResponse = {
- body: {
- id: '237f4d1a293f99',
- cur: 'JPY',
- seatbid: [{
- bid: [{
- price: 100,
- w: 300,
- h: 250,
- adm: '',
- burl: 'https://i.adingo.jp/?test=1&et=hb&bidid=237f4d1a293f99',
- crid: 'test_creative',
- dealid: 'test_deal',
- }]
- }]
- }
- };
-
- const expectedResponse = [
- {
- bidderCode: 'fluct',
- requestId: '237f4d1a293f99',
- currency: 'JPY',
- cpm: 100,
- netRevenue: true,
- width: 300,
- height: 250,
- creativeId: 'test_creative',
- ttl: 300,
- ad: '' + callBeaconSnippet,
- dealId: 'test_deal',
- }
- ];
-
- const result = spec.interpretResponse(serverResponse, bidRequest);
- expect(result).to.have.lengthOf(1);
- expect(result).to.deep.have.same.members(expectedResponse);
- });
-
- it('should get empty response when bid server returns 204', function() {
- expect(spec.interpretResponse({})).to.be.empty;
- });
- });
-});
diff --git a/test/spec/modules/freewheel-sspBidAdapter_spec.js b/test/spec/modules/freewheel-sspBidAdapter_spec.js
index e416bd1c26b..a5b4bd2a03f 100644
--- a/test/spec/modules/freewheel-sspBidAdapter_spec.js
+++ b/test/spec/modules/freewheel-sspBidAdapter_spec.js
@@ -368,7 +368,7 @@ describe('freewheelSSP BidAdapter Test', () => {
];
let result = spec.interpretResponse(response, request[0]);
- expect(Object.keys(result[0])).to.deep.equal(Object.keys(expectedResponse[0]));
+ expect(result[0].meta.advertiserDomains).to.deep.equal([]);
expect(result[0].dealId).to.equal('NRJ-PRO-00008');
expect(result[0].campaignId).to.equal('SMF-WOW-55555');
expect(result[0].bannerId).to.equal('12345');
@@ -395,7 +395,7 @@ describe('freewheelSSP BidAdapter Test', () => {
];
let result = spec.interpretResponse(response, request[0]);
- expect(Object.keys(result[0])).to.deep.equal(Object.keys(expectedResponse[0]));
+ expect(result[0].meta.advertiserDomains).to.deep.equal([]);
expect(result[0].dealId).to.equal('NRJ-PRO-00008');
expect(result[0].campaignId).to.equal('SMF-WOW-55555');
expect(result[0].bannerId).to.equal('12345');
@@ -522,7 +522,7 @@ describe('freewheelSSP BidAdapter Test', () => {
];
let result = spec.interpretResponse(response, request[0]);
- expect(Object.keys(result[0])).to.deep.equal(Object.keys(expectedResponse[0]));
+ expect(result[0].meta.advertiserDomains).to.deep.equal([]);
expect(result[0].dealId).to.equal('NRJ-PRO-00008');
expect(result[0].campaignId).to.equal('SMF-WOW-55555');
expect(result[0].bannerId).to.equal('12345');
@@ -551,7 +551,7 @@ describe('freewheelSSP BidAdapter Test', () => {
];
let result = spec.interpretResponse(response, request[0]);
- expect(Object.keys(result[0])).to.deep.equal(Object.keys(expectedResponse[0]));
+ expect(result[0].meta.advertiserDomains).to.deep.equal([]);
expect(result[0].dealId).to.equal('NRJ-PRO-00008');
expect(result[0].campaignId).to.equal('SMF-WOW-55555');
expect(result[0].bannerId).to.equal('12345');
diff --git a/test/spec/modules/gammaBidAdapter_spec.js b/test/spec/modules/gammaBidAdapter_spec.js
index cdaa1b5448a..35394df7d11 100644
--- a/test/spec/modules/gammaBidAdapter_spec.js
+++ b/test/spec/modules/gammaBidAdapter_spec.js
@@ -69,7 +69,8 @@ describe('gammaBidAdapter', function() {
'adid': '1515999070',
'dealid': 'gax-paj2qarjf2g',
'h': 250,
- 'w': 300
+ 'w': 300,
+ 'adomain': ['testdomain.com']
}]
}]
}
@@ -87,7 +88,8 @@ describe('gammaBidAdapter', function() {
'currency': 'USD',
'netRevenue': true,
'ttl': 300,
- 'ad': ''
+ 'ad': '',
+ 'meta': {'advertiserDomains': ['testdomain.com']}
}];
let result = spec.interpretResponse(serverResponse);
expect(Object.keys(result)).to.deep.equal(Object.keys(expectedResponse));
diff --git a/test/spec/modules/gamoshiBidAdapter_spec.js b/test/spec/modules/gamoshiBidAdapter_spec.js
index 2996b853046..8d63a32ef4d 100644
--- a/test/spec/modules/gamoshiBidAdapter_spec.js
+++ b/test/spec/modules/gamoshiBidAdapter_spec.js
@@ -2,6 +2,7 @@ import {expect} from 'chai';
import {spec, helper} from 'modules/gamoshiBidAdapter.js';
import * as utils from 'src/utils.js';
import {newBidder} from '../../../src/adapters/bidderFactory.js';
+import {deepClone} from 'src/utils';
const supplyPartnerId = '123';
const adapter = newBidder(spec);
@@ -240,6 +241,40 @@ describe('GamoshiAdapter', () => {
expect(spec.isBidRequestValid({params: {supplyPartnerId: '123'}})).to.equal(true); // bidfloor has a default
expect(spec.isBidRequestValid({params: {supplyPartnerId: '123', bidfloor: '123'}})).to.equal(false);
expect(spec.isBidRequestValid({params: {supplyPartnerId: '123', bidfloor: 0.1}})).to.equal(true);
+
+ const getFloorResponse = {currency: 'USD', floor: 5};
+ let testBidRequest = deepClone(bidRequest);
+ let request = spec.buildRequests([testBidRequest], bidRequest)[0];
+
+ // 1. getBidFloor not exist AND bidfloor not exist - return 0
+ let payload = request.data;
+ expect(payload.imp[0].bidfloor).to.exist.and.equal(0);
+
+ // 2. getBidFloor not exist AND bidfloor exist - use bidfloor property
+ testBidRequest = deepClone(bidRequest);
+ testBidRequest.params = {
+ 'bidfloor': 0.3
+ };
+ request = spec.buildRequests([testBidRequest], bidRequest)[0];
+ payload = request.data;
+ expect(payload.imp[0].bidfloor).to.exist.and.to.equal(0.3)
+
+ // 3. getBidFloor exist AND bidfloor not exist - use getFloor method
+ testBidRequest = deepClone(bidRequest);
+ testBidRequest.getFloor = () => getFloorResponse;
+ request = spec.buildRequests([testBidRequest], bidRequest)[0];
+ payload = request.data;
+ expect(payload.imp[0].bidfloor).to.exist.and.to.equal(5)
+
+ // 4. getBidFloor exist AND bidfloor exist -> use getFloor method
+ testBidRequest = deepClone(bidRequest);
+ testBidRequest.getFloor = () => getFloorResponse;
+ testBidRequest.params = {
+ 'bidfloor': 0.3
+ };
+ request = spec.buildRequests([testBidRequest], bidRequest)[0];
+ payload = request.data;
+ expect(payload.imp[0].bidfloor).to.exist.and.to.equal(5)
});
it('should validate adpos', () => {
@@ -339,19 +374,42 @@ describe('GamoshiAdapter', () => {
it('builds request video object correctly', () => {
let response;
const bidRequestWithVideo = utils.deepClone(bidRequest);
+
+ bidRequestWithVideo.params.video = {
+ placement: 1,
+ minduration: 1,
+ }
+
bidRequestWithVideo.mediaTypes = {
video: {
- playerSize: [[302, 252]]
+ playerSize: [[302, 252]],
+ mimes: ['video/mpeg'],
+ playbackmethod: 1,
+ startdelay: 1,
}
};
response = spec.buildRequests([bidRequestWithVideo], bidRequest)[0];
expect(response.data.imp[0].video.w).to.equal(bidRequestWithVideo.mediaTypes.video.playerSize[0][0]);
expect(response.data.imp[0].video.h).to.equal(bidRequestWithVideo.mediaTypes.video.playerSize[0][1]);
expect(response.data.imp[0].video.pos).to.equal(0);
+
+ expect(response.data.imp[0].video.mimes).to.equal(bidRequestWithVideo.mediaTypes.video.mimes);
+ expect(response.data.imp[0].video.skip).to.not.exist;
+ expect(response.data.imp[0].video.placement).to.equal(1);
+ expect(response.data.imp[0].video.minduration).to.equal(1);
+ expect(response.data.imp[0].video.playbackmethod).to.equal(1);
+ expect(response.data.imp[0].video.startdelay).to.equal(1);
+
bidRequestWithVideo.mediaTypes = {
video: {
- playerSize: [302, 252]
- }
+ playerSize: [302, 252],
+ mimes: ['video/mpeg'],
+ skip: 1,
+ placement: 1,
+ minduration: 1,
+ playbackmethod: 1,
+ startdelay: 1,
+ },
};
const bidRequestWithPosEquals1 = utils.deepClone(bidRequestWithVideo);
@@ -367,7 +425,13 @@ describe('GamoshiAdapter', () => {
const bidRequestWithVideo = utils.deepClone(bidRequest);
bidRequestWithVideo.mediaTypes = {
video: {
- context: 'instream'
+ context: 'instream',
+ mimes: ['video/mpeg'],
+ skip: 1,
+ placement: 1,
+ minduration: 1,
+ playbackmethod: 1,
+ startdelay: 1,
}
};
let response = spec.buildRequests([bidRequestWithVideo], bidRequest)[0];
@@ -390,7 +454,13 @@ describe('GamoshiAdapter', () => {
const bidRequestWithVideo = utils.deepClone(bidRequest);
bidRequestWithVideo.mediaTypes.video = {
playerSize: [[304, 254], [305, 255]],
- context: 'instream'
+ context: 'instream',
+ mimes: ['video/mpeg'],
+ skip: 1,
+ placement: 1,
+ minduration: 1,
+ playbackmethod: 1,
+ startdelay: 1,
};
response = spec.buildRequests([bidRequestWithVideo], bidRequest)[0];
@@ -480,6 +550,7 @@ describe('GamoshiAdapter', () => {
expect(ad0.ad).to.equal(rtbResponse.seatbid[1].bid[0].adm);
expect(ad0.vastXml).to.be.an('undefined');
expect(ad0.vastUrl).to.be.an('undefined');
+ expect(ad0.meta.advertiserDomains).to.be.equal(rtbResponse.seatbid[1].bid[0].adomain);
});
it('aggregates video bids from all seat bids', () => {
diff --git a/test/spec/modules/getintentBidAdapter_spec.js b/test/spec/modules/getintentBidAdapter_spec.js
index 1959bda5c39..bb0b5ba826c 100644
--- a/test/spec/modules/getintentBidAdapter_spec.js
+++ b/test/spec/modules/getintentBidAdapter_spec.js
@@ -1,5 +1,6 @@
import { expect } from 'chai'
import { spec } from 'modules/getintentBidAdapter.js'
+import {deepClone} from 'src/utils';
describe('GetIntent Adapter Tests:', function () {
const bidRequests = [{
@@ -17,8 +18,41 @@ describe('GetIntent Adapter Tests:', function () {
tid: 't1000'
},
sizes: [[50, 50], [100, 100]]
- }]
+ }];
const videoBidRequest = {
+ mediaTypes: {
+ video: {
+ protocols: [1, 2, 3],
+ mimes: ['video/mp4'],
+ minduration: 5,
+ maxduration: 30,
+ minbitrate: 500,
+ maxbitrate: 1000,
+ api: [2],
+ skip: 1
+ }
+ },
+ bidId: 'bid789',
+ params: {
+ pid: 'p1001',
+ tid: 't1001',
+ },
+ sizes: [300, 250],
+ mediaType: 'video'
+ };
+ const videoBidRequestWithVideoParams = {
+ mediaTypes: {
+ video: {
+ protocols: [1, 2, 3],
+ mimes: ['video/mp4'],
+ minduration: 5,
+ maxduration: 30,
+ minbitrate: 500,
+ maxbitrate: 1000,
+ api: [2],
+ skip: 0
+ }
+ },
bidId: 'bid789',
params: {
pid: 'p1001',
@@ -27,7 +61,7 @@ describe('GetIntent Adapter Tests:', function () {
mimes: ['video/mp4', 'application/javascript'],
max_dur: 20,
api: [1, 2],
- skippable: true
+ skippable: 'ALLOW'
}
},
sizes: [300, 250],
@@ -58,10 +92,54 @@ describe('GetIntent Adapter Tests:', function () {
expect(serverRequest.data.tid).to.equal('t1001');
expect(serverRequest.data.size).to.equal('300x250');
expect(serverRequest.data.is_video).to.equal(true);
+ expect(serverRequest.data.protocols).to.equal('1,2,3');
+ expect(serverRequest.data.mimes).to.equal('video/mp4');
+ expect(serverRequest.data.min_dur).to.equal(5);
+ expect(serverRequest.data.max_dur).to.equal(30);
+ expect(serverRequest.data.min_btr).to.equal(500);
+ expect(serverRequest.data.max_btr).to.equal(1000);
+ expect(serverRequest.data.api).to.equal('2');
+ expect(serverRequest.data.skippable).to.equal('ALLOW');
+ });
+
+ it('Verify build video request with video params', function () {
+ const serverRequests = spec.buildRequests([videoBidRequestWithVideoParams]);
+ let serverRequest = serverRequests[0];
+ expect(serverRequest.url).to.equal('https://px.adhigh.net/rtb/direct_vast');
+ expect(serverRequest.method).to.equal('GET');
+ expect(serverRequest.data.bid_id).to.equal('bid789');
+ expect(serverRequest.data.pid).to.equal('p1001');
+ expect(serverRequest.data.tid).to.equal('t1001');
+ expect(serverRequest.data.size).to.equal('300x250');
+ expect(serverRequest.data.is_video).to.equal(true);
expect(serverRequest.data.mimes).to.equal('video/mp4,application/javascript');
expect(serverRequest.data.max_dur).to.equal(20);
expect(serverRequest.data.api).to.equal('1,2');
- expect(serverRequest.data.skippable).to.equal(true);
+ expect(serverRequest.data.skippable).to.equal('ALLOW');
+ });
+
+ it('Verify bid floor without price floors module', function() {
+ const bidRequestWithFloor = deepClone(bidRequests[0]);
+ bidRequestWithFloor.params.floor = 10
+ bidRequestWithFloor.params.cur = 'USD'
+
+ const serverRequests = spec.buildRequests([bidRequestWithFloor]);
+ let serverRequest = serverRequests[0];
+ expect(serverRequest.data.cur).to.equal('USD');
+ expect(serverRequest.data.floor).to.equal(10);
+ });
+
+ it('Verify bid floor with price floors module', function() {
+ const bidRequestWithFloor = deepClone(bidRequests[0]);
+ bidRequestWithFloor.params.floor = 10
+ bidRequestWithFloor.params.cur = 'USD'
+ const getFloorResponse = {floor: 5, currency: 'EUR'};
+ bidRequestWithFloor.getFloor = () => getFloorResponse;
+
+ const serverRequests = spec.buildRequests([bidRequestWithFloor]);
+ let serverRequest = serverRequests[0];
+ expect(serverRequest.data.cur).to.equal('EUR');
+ expect(serverRequest.data.floor).to.equal(5);
});
it('Verify parse response', function () {
diff --git a/test/spec/modules/glimpseBidAdapter_spec.js b/test/spec/modules/glimpseBidAdapter_spec.js
index cc11efcb2af..336f606309e 100644
--- a/test/spec/modules/glimpseBidAdapter_spec.js
+++ b/test/spec/modules/glimpseBidAdapter_spec.js
@@ -61,7 +61,10 @@ const templateBidResponse = {
};
const copyBidResponse = () => ({ ...templateBidResponse });
-const copyBidderRequest = () => ({ ...templateBidderRequest, bids: copyBidRequests() });
+const copyBidderRequest = () => ({
+ ...templateBidderRequest,
+ bids: copyBidRequests(),
+});
const copyBidRequest = () => ({ ...templateBidRequest });
const copyBidRequests = () => [copyBidRequest()];
@@ -139,7 +142,9 @@ describe('GlimpseProtocolAdapter', function () {
expect(payload.gdprConsent).to.exist;
const { gdprConsent } = payload;
expect(gdprConsent.gdprApplies).to.be.true;
- expect(gdprConsent.consentString).to.equal(bidderRequest.gdprConsent.consentString);
+ expect(gdprConsent.consentString).to.equal(
+ bidderRequest.gdprConsent.consentString
+ );
});
it('should add referer info', function () {
@@ -147,7 +152,9 @@ describe('GlimpseProtocolAdapter', function () {
const request = spec.buildRequests(bidRequests, bidderRequest);
const payload = JSON.parse(request.data);
- expect(payload.refererInfo.referer).to.equal(templateBidderRequest.refererInfo.referer);
+ expect(payload.refererInfo.referer).to.equal(
+ templateBidderRequest.refererInfo.referer
+ );
});
});
@@ -175,5 +182,26 @@ describe('GlimpseProtocolAdapter', function () {
const bids = spec.interpretResponse(response);
expect(bids).to.have.length(0);
});
+
+ it('should include advertiserDomains field in the response', function () {
+ const response = copyBidResponses();
+
+ const bids = spec.interpretResponse(response);
+ expect(bids[0].meta.advertiserDomains).to.be.an('array').that.is.empty;
+ });
+
+ it('should reflect the value of the OpenRTB adomain field', function () {
+ const advertiserDomainsMock = ['http://example.com'];
+ let response = copyBidResponses();
+ response.body = response.body.map((bid) => {
+ return {
+ ...bid,
+ adomain: advertiserDomainsMock,
+ };
+ });
+
+ const bids = spec.interpretResponse(response);
+ expect(bids[0].meta.advertiserDomains).to.equal(advertiserDomainsMock);
+ });
});
});
diff --git a/test/spec/modules/glomexBidAdapter_spec.js b/test/spec/modules/glomexBidAdapter_spec.js
index b43623928f7..6e5765c31f5 100644
--- a/test/spec/modules/glomexBidAdapter_spec.js
+++ b/test/spec/modules/glomexBidAdapter_spec.js
@@ -41,7 +41,8 @@ const RESPONSE = {
currency: 'EUR',
netRevenue: true,
ttl: 300,
- ad: ' '
+ ad: ' ',
+ adomain: ['glomex.com']
}
]
}
@@ -128,6 +129,7 @@ describe('glomexBidAdapter', function () {
expect(result[0].netRevenue).to.equal(true)
expect(result[0].ttl).to.equal(300)
expect(result[0].ad).to.equal(' ')
+ expect(result[0].meta.advertiserDomains).to.deep.equal(['glomex.com'])
})
})
})
diff --git a/test/spec/modules/gmosspBidAdapter_spec.js b/test/spec/modules/gmosspBidAdapter_spec.js
index d29e27554c2..c22badb9b4c 100644
--- a/test/spec/modules/gmosspBidAdapter_spec.js
+++ b/test/spec/modules/gmosspBidAdapter_spec.js
@@ -1,6 +1,7 @@
import { expect } from 'chai';
import { spec } from 'modules/gmosspBidAdapter.js';
import { newBidder } from 'src/adapters/bidderFactory.js';
+import {getStorageManager} from 'src/storageManager';
import * as utils from 'src/utils.js';
const ENDPOINT = 'https://sp.gmossp-sp.jp/hb/prebid/query.ad';
@@ -35,6 +36,7 @@ describe('GmosspAdapter', function () {
});
describe('buildRequests', function () {
+ const storage = getStorageManager();
const bidRequests = [
{
bidder: 'gmossp',
@@ -60,19 +62,21 @@ describe('GmosspAdapter', function () {
referer: 'https://hoge.com'
}
};
+ storage.setCookie('_im_uid.1000283', 'h.0a4749e7ffe09fa6');
const requests = spec.buildRequests(bidRequests, bidderRequest);
expect(requests[0].url).to.equal(ENDPOINT);
expect(requests[0].method).to.equal('GET');
- expect(requests[0].data).to.equal('tid=791e9d84-af92-4903-94da-24c7426d9d0c&bid=2b84475b5b636e&ver=$prebid.version$&sid=123456&url=https%3A%2F%2Fhoge.com&cur=JPY&dnt=0&');
+ expect(requests[0].data).to.equal('tid=791e9d84-af92-4903-94da-24c7426d9d0c&bid=2b84475b5b636e&ver=$prebid.version$&sid=123456&im_uid=h.0a4749e7ffe09fa6&url=https%3A%2F%2Fhoge.com&cur=JPY&dnt=0&');
});
- it('should use fallback if refererInfo.referer in bid request is empty', function () {
+ it('should use fallback if refererInfo.referer in bid request is empty and _im_uid.1000283 cookie is empty', function () {
const bidderRequest = {
refererInfo: {
referer: ''
}
};
+ storage.setCookie('_im_uid.1000283', '');
const requests = spec.buildRequests(bidRequests, bidderRequest);
const result = 'tid=791e9d84-af92-4903-94da-24c7426d9d0c&bid=2b84475b5b636e&ver=$prebid.version$&sid=123456&url=' + encodeURIComponent(window.top.location.href) + '&cur=JPY&dnt=0&';
diff --git a/test/spec/modules/gnetBidAdapter_spec.js b/test/spec/modules/gnetBidAdapter_spec.js
index 40f8ad50d78..eeb33418a82 100644
--- a/test/spec/modules/gnetBidAdapter_spec.js
+++ b/test/spec/modules/gnetBidAdapter_spec.js
@@ -23,8 +23,7 @@ describe('gnetAdapter', function () {
let bid = {
bidder: 'gnet',
params: {
- websiteId: '4',
- externalId: '4d52cccf30309282256012cf30309282'
+ websiteId: '4'
}
};
@@ -44,8 +43,7 @@ describe('gnetAdapter', function () {
const bidRequests = [{
bidder: 'gnet',
params: {
- websiteId: '4',
- externalId: '4d52cccf30309282256012cf30309282'
+ websiteId: '4'
},
adUnitCode: '/150790500/4_ZONA_IAB_300x250_5',
sizes: [
@@ -74,8 +72,7 @@ describe('gnetAdapter', function () {
'transactionId': '894bdff6-61ec-4bec-a5a9-f36a5bfccef5',
'sizes': ['300x250'],
'params': {
- 'websiteId': '4',
- 'externalId': '4d52cccf30309282256012cf30309282'
+ 'websiteId': '4'
}
}));
});
@@ -121,6 +118,9 @@ describe('gnetAdapter', function () {
height: 250,
ad: 'I am an ad ',
ttl: 300,
+ meta: {
+ advertiserDomains: []
+ },
creativeId: '173560700',
netRevenue: true
}
diff --git a/test/spec/modules/gridBidAdapter_spec.js b/test/spec/modules/gridBidAdapter_spec.js
index e161d82fdd6..1044139a507 100644
--- a/test/spec/modules/gridBidAdapter_spec.js
+++ b/test/spec/modules/gridBidAdapter_spec.js
@@ -402,11 +402,75 @@ describe('TheMediaGrid Adapter', function () {
it('should contain the keyword values if it present in ortb2.(site/user)', function () {
const getConfigStub = sinon.stub(config, 'getConfig').callsFake(
- arg => arg === 'ortb2.user' ? {'keywords': 'foo'} : (arg === 'ortb2.site' ? {'keywords': 'bar'} : null));
- const request = spec.buildRequests([bidRequests[0]], bidderRequest);
+ arg => arg === 'ortb2.user' ? {'keywords': 'foo,any'} : (arg === 'ortb2.site' ? {'keywords': 'bar'} : null));
+ const keywords = {
+ 'site': {
+ 'somePublisher': [
+ {
+ 'name': 'someName',
+ 'brandsafety': ['disaster'],
+ 'topic': ['stress', 'fear']
+ }
+ ]
+ },
+ 'user': {
+ 'formatedPublisher': [
+ {
+ 'name': 'fomatedName',
+ 'segments': [
+ { 'name': 'segName1', 'value': 'segVal1' },
+ { 'name': 'segName2', 'value': 'segVal2' }
+ ]
+ }
+ ]
+ }
+ };
+ const bidRequestWithKW = { ...bidRequests[0], params: { ...bidRequests[0].params, keywords } }
+ const request = spec.buildRequests([bidRequestWithKW], bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
- expect(payload.ext.keywords).to.deep.equal([{'key': 'user', 'value': ['foo']}, {'key': 'context', 'value': ['bar']}]);
+ expect(payload.ext.keywords).to.deep.equal({
+ 'site': {
+ 'somePublisher': [
+ {
+ 'name': 'someName',
+ 'segments': [
+ { 'name': 'brandsafety', 'value': 'disaster' },
+ { 'name': 'topic', 'value': 'stress' },
+ { 'name': 'topic', 'value': 'fear' }
+ ]
+ }
+ ],
+ 'ortb2': [
+ {
+ 'name': 'keywords',
+ 'segments': [
+ { 'name': 'keywords', 'value': 'bar' }
+ ]
+ }
+ ]
+ },
+ 'user': {
+ 'formatedPublisher': [
+ {
+ 'name': 'fomatedName',
+ 'segments': [
+ { 'name': 'segName1', 'value': 'segVal1' },
+ { 'name': 'segName2', 'value': 'segVal2' }
+ ]
+ }
+ ],
+ 'ortb2': [
+ {
+ 'name': 'keywords',
+ 'segments': [
+ { 'name': 'keywords', 'value': 'foo' },
+ { 'name': 'keywords', 'value': 'any' }
+ ]
+ }
+ ]
+ }
+ });
getConfigStub.restore();
});
@@ -555,7 +619,7 @@ describe('TheMediaGrid Adapter', function () {
'ad': 'test content 1
',
'currency': 'USD',
'mediaType': 'banner',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'meta': {
advertiserDomains: []
@@ -615,7 +679,7 @@ describe('TheMediaGrid Adapter', function () {
'ad': 'test content 1
',
'currency': 'USD',
'mediaType': 'banner',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'meta': {
advertiserDomains: []
@@ -631,7 +695,7 @@ describe('TheMediaGrid Adapter', function () {
'ad': 'test content 2
',
'currency': 'USD',
'mediaType': 'banner',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'meta': {
advertiserDomains: []
@@ -647,7 +711,7 @@ describe('TheMediaGrid Adapter', function () {
'ad': 'test content 3
',
'currency': 'USD',
'mediaType': 'banner',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'meta': {
advertiserDomains: []
@@ -709,7 +773,7 @@ describe('TheMediaGrid Adapter', function () {
'height': 600,
'currency': 'USD',
'mediaType': 'video',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'meta': {
advertiserDomains: []
@@ -728,7 +792,7 @@ describe('TheMediaGrid Adapter', function () {
'height': undefined,
'currency': 'USD',
'mediaType': 'video',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'meta': {
advertiserDomains: []
@@ -862,7 +926,7 @@ describe('TheMediaGrid Adapter', function () {
'ad': 'test content 1
',
'currency': 'USD',
'mediaType': 'banner',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'meta': {
advertiserDomains: []
@@ -878,7 +942,7 @@ describe('TheMediaGrid Adapter', function () {
'ad': 'test content 2
',
'currency': 'USD',
'mediaType': 'banner',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'meta': {
advertiserDomains: []
@@ -894,7 +958,7 @@ describe('TheMediaGrid Adapter', function () {
'ad': 'test content 3
',
'currency': 'USD',
'mediaType': 'banner',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'meta': {
advertiserDomains: []
@@ -910,7 +974,7 @@ describe('TheMediaGrid Adapter', function () {
'ad': 'test content 4
',
'currency': 'USD',
'mediaType': 'banner',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'meta': {
advertiserDomains: []
@@ -921,6 +985,69 @@ describe('TheMediaGrid Adapter', function () {
const result = spec.interpretResponse({'body': {'seatbid': fullResponse}}, request);
expect(result).to.deep.equal(expectedResponse);
});
+
+ it('response with ext.bidder.grid.demandSource', function () {
+ const bidRequests = [
+ {
+ 'bidder': 'grid',
+ 'params': {
+ 'uid': '1'
+ },
+ 'adUnitCode': 'adunit-code-1',
+ 'sizes': [[300, 250], [300, 600]],
+ 'bidId': '26d6f897b516',
+ 'bidderRequestId': '5f2009617a7c0a',
+ 'auctionId': '1cbd2feafe5e8b',
+ }
+ ];
+ const serverResponse = {
+ 'bid': [
+ {
+ 'impid': '26d6f897b516',
+ 'price': 1.15,
+ 'adm': 'test content 1
',
+ 'auid': 1,
+ 'h': 250,
+ 'w': 300,
+ 'dealid': 11,
+ 'ext': {
+ 'bidder': {
+ 'grid': {
+ 'demandSource': 'someValue'
+ }
+ }
+ }
+ }
+ ],
+ 'seat': '1'
+ };
+ const request = spec.buildRequests(bidRequests);
+ const expectedResponse = [
+ {
+ 'requestId': '26d6f897b516',
+ 'cpm': 1.15,
+ 'creativeId': 1,
+ 'dealId': 11,
+ 'width': 300,
+ 'height': 250,
+ 'ad': 'test content 1
',
+ 'currency': 'USD',
+ 'mediaType': 'banner',
+ 'netRevenue': true,
+ 'ttl': 360,
+ 'meta': {
+ advertiserDomains: [],
+ demandSource: 'someValue'
+ },
+ 'adserverTargeting': {
+ 'hb_ds': 'someValue'
+ }
+ }
+ ];
+
+ const result = spec.interpretResponse({'body': {'seatbid': [serverResponse]}}, request);
+ expect(result).to.deep.equal(expectedResponse);
+ });
});
describe('user sync', function () {
diff --git a/test/spec/modules/gridNMBidAdapter_spec.js b/test/spec/modules/gridNMBidAdapter_spec.js
index 2aec9713000..6d3a607c0c5 100644
--- a/test/spec/modules/gridNMBidAdapter_spec.js
+++ b/test/spec/modules/gridNMBidAdapter_spec.js
@@ -132,6 +132,43 @@ describe('TheMediaGridNM Adapter', function () {
expect(spec.isBidRequestValid(invalidBid)).to.equal(false);
});
});
+
+ it('should return true when required params is absent, but available in mediaTypes', function () {
+ const paramsList = [
+ {
+ 'source': 'jwp',
+ 'secid': '11',
+ 'pubid': '22',
+ 'video': {
+ 'protocols': [1, 2, 3, 4, 5, 6]
+ }
+ },
+ {
+ 'source': 'jwp',
+ 'secid': '11',
+ 'pubid': '22',
+ 'video': {
+ 'mimes': ['video/mp4', 'video/x-ms-wmv'],
+ }
+ }
+ ];
+
+ const mediaTypes = {
+ video: {
+ mimes: ['video/mp4', 'video/x-ms-wmv'],
+ playerSize: [200, 300],
+ protocols: [1, 2, 3, 4, 5, 6]
+ }
+ };
+
+ paramsList.forEach((params) => {
+ const validBid = Object.assign({}, bid);
+ delete validBid.params;
+ validBid.params = params;
+ validBid.mediaTypes = mediaTypes;
+ expect(spec.isBidRequestValid(validBid)).to.equal(true);
+ });
+ });
});
describe('buildRequests', function () {
@@ -198,6 +235,39 @@ describe('TheMediaGridNM Adapter', function () {
});
});
+ it('should attach valid params from mediaTypes', function () {
+ const mediaTypes = {
+ video: {
+ skipafter: 10,
+ minduration: 10,
+ maxduration: 100,
+ protocols: [1, 3, 4],
+ playerSize: [300, 250]
+ }
+ };
+ const bidRequest = Object.assign({ mediaTypes }, bidRequests[0]);
+ const req = spec.buildRequests([bidRequest], bidderRequest)[0];
+ const expectedVideo = {
+ 'skipafter': 10,
+ 'mind': 10,
+ 'maxd': 100,
+ 'mimes': ['video/mp4', 'video/x-ms-wmv'],
+ 'protocols': [1, 2, 3, 4, 5, 6],
+ 'size': '300x250'
+ };
+ const expectedParams = Object.assign({}, bidRequest.params);
+ expectedParams.video = Object.assign(expectedParams.video, expectedVideo);
+
+ expect(req.url).to.be.an('string');
+ const payload = parseRequestUrl(req.url);
+ expect(payload).to.have.property('u', referrer);
+ expect(payload).to.have.property('r', '22edbae2733bf6');
+ expect(payload).to.have.property('wrapperType', 'Prebid_js');
+ expect(payload).to.have.property('wrapperVersion', '$prebid.version$');
+ expect(payload).to.have.property('sizes', '300x250,300x600');
+ expect(req.data).to.deep.equal(expectedParams);
+ });
+
it('if gdprConsent is present payload must have gdpr params', function () {
const [request] = spec.buildRequests([bidRequests[0]], {gdprConsent: {consentString: 'AAA', gdprApplies: true}, refererInfo: bidderRequest.refererInfo});
expect(request.url).to.be.an('string');
@@ -235,7 +305,7 @@ describe('TheMediaGridNM Adapter', function () {
describe('interpretResponse', function () {
const responses = [
{'bid': [{'price': 1.15, 'adm': '\n<\/Ad>\n<\/VAST>', 'content_type': 'video', 'h': 250, 'w': 300, 'dealid': 11}], 'seat': '2'},
- {'bid': [{'price': 0.5, 'adm': '\n<\/Ad>\n<\/VAST>', 'content_type': 'video', 'h': 600, 'w': 300}], 'seat': '2'},
+ {'bid': [{'price': 0.5, 'adm': '\n<\/Ad>\n<\/VAST>', 'content_type': 'video', 'h': 600, 'w': 300, adomain: ['my_domain.ru']}], 'seat': '2'},
{'bid': [{'price': 0, 'h': 250, 'w': 300}], 'seat': '2'},
{'bid': [{'price': 0, 'adm': '\n<\/Ad>\n<\/VAST>', 'h': 250, 'w': 300}], 'seat': '2'},
undefined,
@@ -302,9 +372,12 @@ describe('TheMediaGridNM Adapter', function () {
'height': 250,
'currency': 'USD',
'mediaType': 'video',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'vastXml': '\n<\/Ad>\n<\/VAST>',
+ 'meta': {
+ 'advertiserDomains': []
+ },
'adResponse': {
'content': '\n<\/Ad>\n<\/VAST>'
}
@@ -318,9 +391,12 @@ describe('TheMediaGridNM Adapter', function () {
'height': 600,
'currency': 'USD',
'mediaType': 'video',
- 'netRevenue': false,
+ 'netRevenue': true,
'ttl': 360,
'vastXml': '\n<\/Ad>\n<\/VAST>',
+ 'meta': {
+ 'advertiserDomains': ['my_domain.ru']
+ },
'adResponse': {
'content': '\n<\/Ad>\n<\/VAST>'
}
@@ -352,6 +428,9 @@ describe('TheMediaGridNM Adapter', function () {
'bidId': '2bc598e42b6a',
'bidderRequestId': '39d74f5b71464',
'auctionId': '1cbd2feafe5e8b',
+ 'meta': {
+ 'advertiserDomains': []
+ },
'mediaTypes': {
'video': {
'context': 'instream'
diff --git a/test/spec/modules/growadvertisingBidAdapter_spec.js b/test/spec/modules/growadvertisingBidAdapter_spec.js
new file mode 100644
index 00000000000..55eea06cca8
--- /dev/null
+++ b/test/spec/modules/growadvertisingBidAdapter_spec.js
@@ -0,0 +1,228 @@
+import { expect } from 'chai';
+import { spec } from 'modules/growadvertisingBidAdapter.js';
+import * as utils from '../../../src/utils.js';
+import {BANNER, NATIVE} from '../../../src/mediaTypes.js';
+
+describe('GrowAdvertising Adapter', function() {
+ const ZONE_ID = 'unique-zone-id';
+ const serverResponseBanner = {
+ body: {
+ status: 'success',
+ width: 300,
+ height: 250,
+ creativeId: 'ULqaukILu0RnMa0FyidOtkji4Po3qbgQ9ceRVGlhjLLKnrrLAATmGNCwtE99Ems8',
+ ad: ' ',
+ cpm: 1,
+ ttl: 180,
+ currency: 'USD',
+ type: BANNER,
+ }
+ };
+ const serverResponseNative = {
+ body: {
+ status: 'success',
+ width: 400,
+ height: 300,
+ creativeId: 'ULqaukILu0RnMa0FyidOtkji4Po3qbgQ9ceRVGlhjLLKnrrLAATmGNCwtE99Ems9',
+ cpm: 2,
+ ttl: 180,
+ currency: 'USD',
+ native: {
+ title: 'Test title',
+ body: 'Test body',
+ body2: null,
+ sponsoredBy: 'Sponsored by',
+ cta: null,
+ clickUrl: 'https://example.org',
+ image: {
+ width: 400,
+ height: 300,
+ url: 'https://image.source.com/img',
+ }
+ },
+ type: NATIVE
+ }
+ };
+ let bidRequests = [];
+
+ beforeEach(function () {
+ bidRequests = [
+ {
+ bidder: 'growads',
+ params: {
+ zoneId: ZONE_ID,
+ maxCPM: 5,
+ minCPM: 1
+ },
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250], [300, 600]],
+ },
+ },
+ },
+ {
+ bidder: 'growads',
+ params: {
+ zoneId: ZONE_ID,
+ },
+ mediaTypes: {
+ native: {
+ title: {
+ required: true
+ },
+ image: {
+ required: true
+ },
+ sponsoredBy: {
+ required: true
+ }
+ },
+ },
+ }
+ ];
+ });
+
+ describe('implementation', function () {
+ describe('for requests', function () {
+ it('should accept valid bid', function () {
+ let validBid = {
+ bidder: 'growads',
+ params: {
+ zoneId: ZONE_ID
+ }
+ };
+
+ let isValid = spec.isBidRequestValid(validBid);
+ expect(isValid).to.equal(true);
+ });
+
+ it('should reject null zoneId bid', function () {
+ let zoneNullBid = {
+ bidder: 'growads',
+ params: {
+ zoneId: null
+ }
+ };
+
+ let isValid = spec.isBidRequestValid(zoneNullBid);
+ expect(isValid).to.equal(false);
+ });
+
+ it('should reject absent zoneId bid', function () {
+ let absentZoneBid = {
+ bidder: 'growads',
+ params: {
+ param: ZONE_ID
+ }
+ };
+
+ let isValid = spec.isBidRequestValid(absentZoneBid);
+ expect(isValid).to.equal(false);
+ });
+
+ it('should use custom domain', function () {
+ let validBid = {
+ bidder: 'growads',
+ params: {
+ zoneId: ZONE_ID,
+ domain: 'test.subdomain.growadvertising.com',
+ },
+ };
+
+ let requests = spec.buildRequests([validBid]);
+ expect(requests[0].url).to.have.string('test.subdomain.');
+ });
+
+ it('should use default domain', function () {
+ let validBid = {
+ bidder: 'growads',
+ params: {
+ zoneId: ZONE_ID,
+ },
+ };
+
+ let requests = spec.buildRequests([validBid]);
+ expect(requests[0].url).to.have.string('portal.growadvertising.com');
+ });
+
+ it('should increment zone index', function () {
+ let validBids = [
+ {
+ bidder: 'growads',
+ params: {
+ zoneId: ZONE_ID,
+ },
+ },
+ {
+ bidder: 'growads',
+ params: {
+ zoneId: ZONE_ID,
+ },
+ }
+ ];
+
+ let requests = spec.buildRequests(validBids);
+ expect(requests[0].data).to.include({i: 0});
+ expect(requests[1].data).to.include({i: 1});
+ });
+ });
+
+ describe('bid responses', function () {
+ describe(BANNER, function () {
+ it('should return complete bid response banner', function () {
+ let bids = spec.interpretResponse(serverResponseBanner, {bidRequest: bidRequests[0]});
+
+ expect(bids).to.be.lengthOf(1);
+ expect(bids[0].bidderCode).to.equal('growads');
+ expect(bids[0].cpm).to.equal(1);
+ expect(bids[0].width).to.equal(300);
+ expect(bids[0].height).to.equal(250);
+ expect(bids[0].creativeId).to.have.length.above(1);
+ expect(bids[0].ad).to.have.length.above(1);
+ expect(bids[0].mediaType).to.equal(BANNER);
+ });
+
+ it('should return empty bid on incorrect size', function () {
+ let response = utils.mergeDeep(serverResponseBanner, {
+ body: {
+ width: 150,
+ height: 150
+ }
+ });
+
+ let bids = spec.interpretResponse(response, {bidRequest: bidRequests[0]});
+ expect([]).to.be.lengthOf(0);
+ });
+
+ it('should return empty bid on incorrect CPM', function () {
+ let response = utils.mergeDeep(serverResponseBanner, {
+ body: {
+ cpm: 10
+ }
+ });
+
+ let bids = spec.interpretResponse(response, {bidRequest: bidRequests[0]});
+ expect([]).to.be.lengthOf(0);
+ });
+ });
+
+ describe(NATIVE, function () {
+ it('should return complete bid response banner', function () {
+ let bids = spec.interpretResponse(serverResponseNative, {bidRequest: bidRequests[1]});
+
+ expect(bids).to.be.lengthOf(1);
+ expect(bids[0].bidderCode).to.equal('growads');
+ expect(bids[0].cpm).to.equal(2);
+ expect(bids[0].width).to.equal(400);
+ expect(bids[0].height).to.equal(300);
+ expect(bids[0].creativeId).to.have.length.above(1);
+ expect(bids[0]).property('native');
+ expect(bids[0].native.title).to.have.length.above(1);
+ expect(bids[0].native.body).to.have.length.above(1);
+ expect(bids[0].native).property('image');
+ expect(bids[0].mediaType).to.equal(NATIVE);
+ });
+ });
+ });
+ });
+});
diff --git a/test/spec/modules/gumgumBidAdapter_spec.js b/test/spec/modules/gumgumBidAdapter_spec.js
index a7b18a16173..75a9c5c975a 100644
--- a/test/spec/modules/gumgumBidAdapter_spec.js
+++ b/test/spec/modules/gumgumBidAdapter_spec.js
@@ -189,6 +189,20 @@ describe('gumgumAdapter', function () {
expect(bidRequest.data).to.not.have.property('irisid');
});
+ it('should set the global placement id (gpid)', function () {
+ const req = { ...bidRequests[0], ortb2Imp: { ext: { data: { adserver: { name: 'test', adslot: 123456 } } } } }
+ const bidRequest = spec.buildRequests([req])[0];
+ expect(bidRequest).to.have.property('gpid');
+ expect(bidRequest.gpid).to.equal(123456);
+ });
+
+ it('should set the bid floor if getFloor module is not present but static bid floor is defined', function () {
+ const req = { ...bidRequests[0], params: { bidfloor: 42 } }
+ const bidRequest = spec.buildRequests([req])[0];
+ expect(bidRequest.data).to.have.property('fp');
+ expect(bidRequest.data.fp).to.equal(42);
+ });
+
describe('product id', function () {
it('should set the correct pi param if native param is found', function () {
const request = { ...bidRequests[0], params: { ...zoneParam, native: 2 } };
@@ -433,6 +447,20 @@ describe('gumgumAdapter', function () {
const request = spec.buildRequests(bidRequests)[0];
expect(request.data).to.not.include.any.keys('tdid');
});
+ it('should send IDL envelope ID if available', function () {
+ const idl_env = 'abc123';
+ const request = { ...bidRequests[0], userId: { idl_env } };
+ const bidRequest = spec.buildRequests([request])[0];
+
+ expect(bidRequest.data).to.have.property('idl_env');
+ expect(bidRequest.data.idl_env).to.equal(idl_env);
+ });
+ it('should not send IDL envelope if not available', function () {
+ const request = { ...bidRequests[0] };
+ const bidRequest = spec.buildRequests([request])[0];
+
+ expect(bidRequest.data).to.not.have.property('idl_env');
+ });
it('should send schain parameter in serialized form', function () {
const serializedForm = '1.0,1!exchange1.com,1234,1,bid-request-1,publisher,publisher.com!exchange2.com,abcd,1,bid-request-2,intermediary,intermediary.com'
const request = spec.buildRequests(bidRequests)[0];
diff --git a/test/spec/modules/haloIdSystem_spec.js b/test/spec/modules/haloIdSystem_spec.js
index 8b6a67adee1..0b8fff12abe 100644
--- a/test/spec/modules/haloIdSystem_spec.js
+++ b/test/spec/modules/haloIdSystem_spec.js
@@ -38,5 +38,20 @@ describe('HaloIdSystem', function () {
callback(callbackSpy);
expect(callbackSpy.lastCall.lastArg).to.deep.equal({haloId: 'tstCachedHaloId1'});
});
+
+ it('allows configurable id url', function() {
+ const config = {
+ params: {
+ url: 'https://haloid.publync.com'
+ }
+ };
+ const callbackSpy = sinon.spy();
+ const callback = haloIdSubmodule.getId(config).callback;
+ callback(callbackSpy);
+ const request = server.requests[0];
+ expect(request.url).to.eq('https://haloid.publync.com');
+ request.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({ haloId: 'testHaloId1' }));
+ expect(callbackSpy.lastCall.lastArg).to.deep.equal({haloId: 'testHaloId1'});
+ });
});
});
diff --git a/test/spec/modules/haloRtdProvider_spec.js b/test/spec/modules/haloRtdProvider_spec.js
index 3052441a00d..32c0338b87f 100644
--- a/test/spec/modules/haloRtdProvider_spec.js
+++ b/test/spec/modules/haloRtdProvider_spec.js
@@ -114,7 +114,6 @@ describe('haloRtdProvider', function() {
}
};
- let pbConfig = config.getConfig();
addRealTimeData(bidConfig, rtd, rtdConfig);
let ortb2Config = config.getConfig().ortb2;
@@ -123,6 +122,395 @@ describe('haloRtdProvider', function() {
expect(ortb2Config.site.content.data).to.deep.include.members([setConfigSiteObj1, rtdSiteObj1]);
});
+ it('merges ortb2 data without duplication', function() {
+ let rtdConfig = {};
+ let bidConfig = {};
+
+ const userObj1 = {
+ name: 'www.dataprovider1.com',
+ ext: { taxonomyname: 'iab_audience_taxonomy' },
+ segment: [{
+ id: '1776'
+ }]
+ };
+
+ const userObj2 = {
+ name: 'www.dataprovider2.com',
+ ext: { taxonomyname: 'iab_audience_taxonomy' },
+ segment: [{
+ id: '1914'
+ }]
+ };
+
+ const siteObj1 = {
+ name: 'www.dataprovider3.com',
+ ext: {
+ taxonomyname: 'iab_audience_taxonomy'
+ },
+ segment: [
+ {
+ id: '1812'
+ },
+ {
+ id: '1955'
+ }
+ ]
+ }
+
+ config.setConfig({
+ ortb2: {
+ user: {
+ data: [userObj1, userObj2]
+ },
+ site: {
+ content: {
+ data: [siteObj1]
+ }
+ }
+ }
+ });
+
+ const rtd = {
+ ortb2: {
+ user: {
+ data: [userObj1]
+ },
+ site: {
+ content: {
+ data: [siteObj1]
+ }
+ }
+ }
+ };
+
+ addRealTimeData(bidConfig, rtd, rtdConfig);
+
+ let ortb2Config = config.getConfig().ortb2;
+
+ expect(ortb2Config.user.data).to.deep.include.members([userObj1, userObj2]);
+ expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1]);
+ expect(ortb2Config.user.data).to.have.lengthOf(2);
+ expect(ortb2Config.site.content.data).to.have.lengthOf(1);
+ });
+
+ it('merges bidder-specific ortb2 data', function() {
+ let rtdConfig = {};
+ let bidConfig = {};
+
+ const configUserObj1 = {
+ name: 'www.dataprovider1.com',
+ ext: { segtax: 3 },
+ segment: [{
+ id: '1776'
+ }]
+ };
+
+ const configUserObj2 = {
+ name: 'www.dataprovider2.com',
+ ext: { segtax: 3 },
+ segment: [{
+ id: '1914'
+ }]
+ };
+
+ const configUserObj3 = {
+ name: 'www.dataprovider1.com',
+ ext: { segtax: 3 },
+ segment: [{
+ id: '2003'
+ }]
+ };
+
+ const configSiteObj1 = {
+ name: 'www.dataprovider3.com',
+ ext: {
+ segtax: 1
+ },
+ segment: [
+ {
+ id: '1812'
+ },
+ {
+ id: '1955'
+ }
+ ]
+ };
+
+ const configSiteObj2 = {
+ name: 'www.dataprovider3.com',
+ ext: {
+ segtax: 1
+ },
+ segment: [
+ {
+ id: '1812'
+ }
+ ]
+ };
+
+ config.setBidderConfig({
+ bidders: ['adbuzz'],
+ config: {
+ ortb2: {
+ user: {
+ data: [configUserObj1, configUserObj2]
+ },
+ site: {
+ content: {
+ data: [configSiteObj1]
+ }
+ }
+ }
+ }
+ });
+
+ config.setBidderConfig({
+ bidders: ['pubvisage'],
+ config: {
+ ortb2: {
+ user: {
+ data: [configUserObj3]
+ },
+ site: {
+ content: {
+ data: [configSiteObj2]
+ }
+ }
+ }
+ }
+ });
+
+ const rtdUserObj1 = {
+ name: 'www.dataprovider4.com',
+ ext: {
+ segtax: 501
+ },
+ segment: [
+ {
+ id: '1918'
+ },
+ {
+ id: '1939'
+ }
+ ]
+ };
+
+ const rtdUserObj2 = {
+ name: 'www.dataprovider2.com',
+ ext: {
+ segtax: 502
+ },
+ segment: [
+ {
+ id: '1939'
+ }
+ ]
+ };
+
+ const rtdSiteObj1 = {
+ name: 'www.dataprovider5.com',
+ ext: {
+ segtax: 1
+ },
+ segment: [
+ {
+ id: '441'
+ },
+ {
+ id: '442'
+ }
+ ]
+ };
+
+ const rtdSiteObj2 = {
+ name: 'www.dataprovider6.com',
+ ext: {
+ segtax: 2
+ },
+ segment: [
+ {
+ id: '676'
+ }
+ ]
+ };
+
+ const rtd = {
+ ortb2b: {
+ adbuzz: {
+ ortb2: {
+ user: {
+ data: [rtdUserObj1]
+ },
+ site: {
+ content: {
+ data: [rtdSiteObj1]
+ }
+ }
+ }
+ },
+ pubvisage: {
+ ortb2: {
+ user: {
+ data: [rtdUserObj2]
+ },
+ site: {
+ content: {
+ data: [rtdSiteObj2]
+ }
+ }
+ }
+ }
+ }
+ };
+
+ addRealTimeData(bidConfig, rtd, rtdConfig);
+
+ let ortb2Config = config.getBidderConfig().adbuzz.ortb2;
+
+ expect(ortb2Config.user.data).to.deep.include.members([configUserObj1, configUserObj2, rtdUserObj1]);
+ expect(ortb2Config.site.content.data).to.deep.include.members([configSiteObj1, rtdSiteObj1]);
+
+ ortb2Config = config.getBidderConfig().pubvisage.ortb2;
+
+ expect(ortb2Config.user.data).to.deep.include.members([configUserObj3, rtdUserObj2]);
+ expect(ortb2Config.site.content.data).to.deep.include.members([configSiteObj2, rtdSiteObj2]);
+ });
+
+ it('merges bidder-specific ortb2 data without duplication', function() {
+ let rtdConfig = {};
+ let bidConfig = {};
+
+ const userObj1 = {
+ name: 'www.dataprovider1.com',
+ ext: { segtax: 3 },
+ segment: [{
+ id: '1776'
+ }]
+ };
+
+ const userObj2 = {
+ name: 'www.dataprovider2.com',
+ ext: { segtax: 3 },
+ segment: [{
+ id: '1914'
+ }]
+ };
+
+ const userObj3 = {
+ name: 'www.dataprovider1.com',
+ ext: { segtax: 3 },
+ segment: [{
+ id: '2003'
+ }]
+ };
+
+ const siteObj1 = {
+ name: 'www.dataprovider3.com',
+ ext: {
+ segtax: 1
+ },
+ segment: [
+ {
+ id: '1812'
+ },
+ {
+ id: '1955'
+ }
+ ]
+ };
+
+ const siteObj2 = {
+ name: 'www.dataprovider3.com',
+ ext: {
+ segtax: 1
+ },
+ segment: [
+ {
+ id: '1812'
+ }
+ ]
+ };
+
+ config.setBidderConfig({
+ bidders: ['adbuzz'],
+ config: {
+ ortb2: {
+ user: {
+ data: [userObj1, userObj2]
+ },
+ site: {
+ content: {
+ data: [siteObj1]
+ }
+ }
+ }
+ }
+ });
+
+ config.setBidderConfig({
+ bidders: ['pubvisage'],
+ config: {
+ ortb2: {
+ user: {
+ data: [userObj3]
+ },
+ site: {
+ content: {
+ data: [siteObj2]
+ }
+ }
+ }
+ }
+ });
+
+ const rtd = {
+ ortb2b: {
+ adbuzz: {
+ ortb2: {
+ user: {
+ data: [userObj1]
+ },
+ site: {
+ content: {
+ data: [siteObj1]
+ }
+ }
+ }
+ },
+ pubvisage: {
+ ortb2: {
+ user: {
+ data: [userObj2, userObj3]
+ },
+ site: {
+ content: {
+ data: [siteObj1, siteObj2]
+ }
+ }
+ }
+ }
+ }
+ };
+
+ addRealTimeData(bidConfig, rtd, rtdConfig);
+
+ let ortb2Config = config.getBidderConfig().adbuzz.ortb2;
+
+ expect(ortb2Config.user.data).to.deep.include.members([userObj1]);
+ expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1]);
+
+ expect(ortb2Config.user.data).to.have.lengthOf(2);
+ expect(ortb2Config.site.content.data).to.have.lengthOf(1);
+
+ ortb2Config = config.getBidderConfig().pubvisage.ortb2;
+
+ expect(ortb2Config.user.data).to.deep.include.members([userObj3, userObj3]);
+ expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1, siteObj2]);
+
+ expect(ortb2Config.user.data).to.have.lengthOf(2);
+ expect(ortb2Config.site.content.data).to.have.lengthOf(2);
+ });
+
it('allows publisher defined rtd ortb2 logic', function() {
const rtdConfig = {
params: {
diff --git a/test/spec/modules/haxmediaBidAdapter_spec.js b/test/spec/modules/haxmediaBidAdapter_spec.js
deleted file mode 100644
index 2e39d771bdf..00000000000
--- a/test/spec/modules/haxmediaBidAdapter_spec.js
+++ /dev/null
@@ -1,304 +0,0 @@
-import {expect} from 'chai';
-import {spec} from '../../../modules/haxmediaBidAdapter.js';
-import { BANNER, VIDEO, NATIVE } from '../../../src/mediaTypes.js';
-
-describe('haxmediaBidAdapter', function () {
- const bid = {
- bidId: '23fhj33i987f',
- bidder: 'haxmedia',
- mediaTypes: {
- [BANNER]: {
- sizes: [[300, 250]]
- }
- },
- params: {
- placementId: 783,
- traffic: BANNER
- }
- };
-
- const bidderRequest = {
- refererInfo: {
- referer: 'test.com'
- }
- };
-
- describe('isBidRequestValid', function () {
- it('Should return true if there are bidId, params and key parameters present', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
- });
- it('Should return false if at least one of parameters is not present', function () {
- delete bid.params.placementId;
- expect(spec.isBidRequestValid(bid)).to.be.false;
- });
- });
-
- describe('buildRequests', function () {
- let serverRequest = spec.buildRequests([bid], bidderRequest);
- it('Creates a ServerRequest object with method, URL and data', function () {
- expect(serverRequest).to.exist;
- expect(serverRequest.method).to.exist;
- expect(serverRequest.url).to.exist;
- expect(serverRequest.data).to.exist;
- });
- it('Returns POST method', function () {
- expect(serverRequest.method).to.equal('POST');
- });
- it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://balancer.haxmedia.io/?c=o&m=multi');
- });
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'secure', 'host', 'page', 'placements');
- expect(data.deviceWidth).to.be.a('number');
- expect(data.deviceHeight).to.be.a('number');
- expect(data.language).to.be.a('string');
- expect(data.secure).to.be.within(0, 1);
- expect(data.host).to.be.a('string');
- expect(data.page).to.be.a('string');
- expect(data.gdpr).to.not.exist;
- expect(data.ccpa).to.not.exist;
- let placement = data['placements'][0];
- expect(placement).to.have.keys('placementId', 'bidId', 'traffic', 'sizes', 'schain');
- expect(placement.placementId).to.equal(783);
- expect(placement.bidId).to.equal('23fhj33i987f');
- expect(placement.traffic).to.equal(BANNER);
- expect(placement.schain).to.be.an('object');
- expect(placement.sizes).to.be.an('array');
- });
-
- it('Returns valid data for mediatype video', function () {
- const playerSize = [300, 300];
- bid.mediaTypes = {};
- bid.params.traffic = VIDEO;
- bid.mediaTypes[VIDEO] = {
- playerSize
- };
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- let placement = data['placements'][0];
- expect(placement).to.be.an('object');
- expect(placement).to.have.keys('placementId', 'bidId', 'traffic', 'wPlayer', 'hPlayer', 'schain');
- expect(placement.traffic).to.equal(VIDEO);
- expect(placement.wPlayer).to.equal(playerSize[0]);
- expect(placement.hPlayer).to.equal(playerSize[1]);
- });
-
- it('Returns valid data for mediatype native', function () {
- const native = {
- title: {
- required: true
- },
- body: {
- required: true
- },
- icon: {
- required: true,
- size: [64, 64]
- }
- };
-
- bid.mediaTypes = {};
- bid.params.traffic = NATIVE;
- bid.mediaTypes[NATIVE] = native;
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- let placement = data['placements'][0];
- expect(placement).to.be.an('object');
- expect(placement).to.have.keys('placementId', 'bidId', 'traffic', 'native', 'schain');
- expect(placement.traffic).to.equal(NATIVE);
- expect(placement.native).to.equal(native);
- });
-
- it('Returns data with gdprConsent and without uspConsent', function () {
- bidderRequest.gdprConsent = 'test';
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data.gdpr).to.exist;
- expect(data.gdpr).to.be.a('string');
- expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
- expect(data.ccpa).to.not.exist;
- delete bidderRequest.gdprConsent;
- });
-
- it('Returns data with uspConsent and without gdprConsent', function () {
- bidderRequest.uspConsent = 'test';
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data.ccpa).to.exist;
- expect(data.ccpa).to.be.a('string');
- expect(data.ccpa).to.equal(bidderRequest.uspConsent);
- expect(data.gdpr).to.not.exist;
- });
-
- it('Returns empty data if no valid requests are passed', function () {
- serverRequest = spec.buildRequests([]);
- let data = serverRequest.data;
- expect(data.placements).to.be.an('array').that.is.empty;
- });
- });
- describe('interpretResponse', function () {
- it('Should interpret banner response', function () {
- const banner = {
- body: [{
- mediaType: 'banner',
- width: 300,
- height: 250,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let bannerResponses = spec.interpretResponse(banner);
- expect(bannerResponses).to.be.an('array').that.is.not.empty;
- let dataItem = bannerResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.width).to.equal(300);
- expect(dataItem.height).to.equal(250);
- expect(dataItem.ad).to.equal('Test');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret video response', function () {
- const video = {
- body: [{
- vastUrl: 'test.com',
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let videoResponses = spec.interpretResponse(video);
- expect(videoResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = videoResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.5);
- expect(dataItem.vastUrl).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret native response', function () {
- const native = {
- body: [{
- mediaType: 'native',
- native: {
- clickUrl: 'test.com',
- title: 'Test',
- image: 'test.com',
- impressionTrackers: ['test.com'],
- },
- ttl: 120,
- cpm: 0.4,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let nativeResponses = spec.interpretResponse(native);
- expect(nativeResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = nativeResponses[0];
- expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native');
- expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.native.clickUrl).to.equal('test.com');
- expect(dataItem.native.title).to.equal('Test');
- expect(dataItem.native.image).to.equal('test.com');
- expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
- expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should return an empty array if invalid banner response is passed', function () {
- const invBanner = {
- body: [{
- width: 300,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
-
- let serverResponses = spec.interpretResponse(invBanner);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid video response is passed', function () {
- const invVideo = {
- body: [{
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invVideo);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid native response is passed', function () {
- const invNative = {
- body: [{
- mediaType: 'native',
- clickUrl: 'test.com',
- title: 'Test',
- impressionTrackers: ['test.com'],
- ttl: 120,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let serverResponses = spec.interpretResponse(invNative);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid response is passed', function () {
- const invalid = {
- body: [{
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invalid);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- });
-});
diff --git a/test/spec/modules/hpmdnetworkBidAdapter_spec.js b/test/spec/modules/hpmdnetworkBidAdapter_spec.js
deleted file mode 100644
index 9023fb248e9..00000000000
--- a/test/spec/modules/hpmdnetworkBidAdapter_spec.js
+++ /dev/null
@@ -1,148 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/hpmdnetworkBidAdapter.js';
-
-describe('HPMDNetwork Adapter', function() {
- describe('isBidRequestValid', function () {
- it('should return true when required params found', function () {
- const validBid = {
- bidder: 'hpmdnetwork',
- params: {
- placementId: '1'
- }
- };
-
- expect(spec.isBidRequestValid(validBid)).to.equal(true);
- });
-
- it('should return false for when required params are not passed', function () {
- const invalidBid = {
- bidder: 'hpmdnetwork',
- params: {}
- };
-
- expect(spec.isBidRequestValid(invalidBid)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- const bidRequests = [
- {
- bidId: 'bid1',
- bidder: 'hpmdnetwork',
- params: {
- placementId: '1'
- }
- },
- {
- bidId: 'bid2',
- bidder: 'hpmdnetwork',
- params: {
- placementId: '2',
- }
- }
- ];
- const bidderRequest = {
- refererInfo: {
- referer: 'https://example.com?foo=bar'
- }
- };
-
- const bidRequest = spec.buildRequests(bidRequests, bidderRequest);
-
- it('should build single POST request for multiple bids', function() {
- expect(bidRequest.method).to.equal('POST');
- expect(bidRequest.url).to.equal('https://banner.hpmdnetwork.ru/bidder/request');
- expect(bidRequest.data).to.be.an('object');
- expect(bidRequest.data.places).to.be.an('array');
- expect(bidRequest.data.places).to.have.lengthOf(2);
- });
-
- it('should pass bid parameters', function() {
- const place1 = bidRequest.data.places[0];
- const place2 = bidRequest.data.places[1];
-
- expect(place1.placementId).to.equal('1');
- expect(place2.placementId).to.equal('2');
- expect(place1.id).to.equal('bid1');
- expect(place2.id).to.equal('bid2');
- });
-
- it('should pass site parameters', function() {
- const url = bidRequest.data.url;
-
- expect(url).to.be.an('String');
- expect(url).to.equal('https://example.com?foo=bar');
- });
-
- it('should pass settings', function() {
- const settings = bidRequest.data.settings;
-
- expect(settings).to.be.an('object');
- expect(settings.currency).to.equal('RUB');
- });
- });
-
- describe('interpretResponse', function () {
- const serverResponse = {
- body: {
- 'bids':
- [
- {
- 'cpm': 20,
- 'currency': 'RUB',
- 'displayUrl': 'https://banner.hpmdnetwork.ru/bidder/display?dbid=0&vbid=168',
- 'id': '1',
- 'creativeId': '11111',
- },
- {
- 'cpm': 30,
- 'currency': 'RUB',
- 'displayUrl': 'https://banner.hpmdnetwork.ru/bidder/display?dbid=0&vbid=170',
- 'id': '2',
- 'creativeId': '22222',
- 'width': 300,
- 'height': 250,
- },
- ]
- }
- };
-
- const bids = spec.interpretResponse(serverResponse);
-
- it('should return empty array for response with no bids', function() {
- const emptyBids = spec.interpretResponse({ body: {} });
-
- expect(emptyBids).to.have.lengthOf(0);
- });
-
- it('should parse all bids from response', function() {
- expect(bids).to.have.lengthOf(2);
- });
-
- it('should parse bid without sizes', function() {
- expect(bids[0].requestId).to.equal('1');
- expect(bids[0].cpm).to.equal(20);
- expect(bids[0].width).to.equal(1);
- expect(bids[0].height).to.equal(1);
- expect(bids[0].ttl).to.equal(300);
- expect(bids[0].currency).to.equal('RUB');
- expect(bids[0]).to.have.property('creativeId');
- expect(bids[0].creativeId).to.equal('11111');
- expect(bids[0].netRevenue).to.equal(true);
- expect(bids[0].ad).to.include('');
- });
-
- it('should parse bid with sizes', function() {
- expect(bids[1].requestId).to.equal('2');
- expect(bids[1].cpm).to.equal(30);
- expect(bids[1].width).to.equal(300);
- expect(bids[1].height).to.equal(250);
- expect(bids[1].ttl).to.equal(300);
- expect(bids[1].currency).to.equal('RUB');
- expect(bids[1]).to.have.property('creativeId');
- expect(bids[1].creativeId).to.equal('22222');
- expect(bids[1].netRevenue).to.equal(true);
- expect(bids[1].ad).to.include('');
- });
- });
-});
diff --git a/test/spec/modules/iasBidAdapter_spec.js b/test/spec/modules/iasBidAdapter_spec.js
deleted file mode 100644
index 1743ac947e6..00000000000
--- a/test/spec/modules/iasBidAdapter_spec.js
+++ /dev/null
@@ -1,343 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/iasBidAdapter.js';
-
-describe('iasBidAdapter is an adapter that', function () {
- it('has the correct bidder code', function () {
- expect(spec.code).to.equal('ias');
- });
- describe('has a method `isBidRequestValid` that', function () {
- it('exists', function () {
- expect(spec.isBidRequestValid).to.be.a('function');
- });
- it('returns false if bid params misses `pubId`', function () {
- expect(spec.isBidRequestValid(
- {
- params: {
- adUnitPath: 'someAdUnitPath'
- }
- })).to.equal(false);
- });
- it('returns false if bid params misses `adUnitPath`', function () {
- expect(spec.isBidRequestValid(
- {
- params: {
- pubId: 'somePubId'
- }
- })).to.equal(false);
- });
- it('returns true otherwise', function () {
- expect(spec.isBidRequestValid(
- {
- params: {
- adUnitPath: 'someAdUnitPath',
- pubId: 'somePubId',
- someOtherParam: 'abc'
- }
- })).to.equal(true);
- });
- });
-
- describe('has a method `buildRequests` that', function () {
- it('exists', function () {
- expect(spec.buildRequests).to.be.a('function');
- });
- describe('given bid requests, returns a `ServerRequest` instance that', function () {
- let bidRequests, IAS_HOST;
- beforeEach(function () {
- IAS_HOST = 'https://pixel.adsafeprotected.com/services/pub';
- bidRequests = [
- {
- adUnitCode: 'one-div-id',
- auctionId: 'someAuctionId',
- bidId: 'someBidId',
- bidder: 'ias',
- bidderRequestId: 'someBidderRequestId',
- params: {
- pubId: '1234',
- adUnitPath: '/a/b/c'
- },
- sizes: [
- [10, 20],
- [300, 400]
- ],
- transactionId: 'someTransactionId'
- },
- {
- adUnitCode: 'two-div-id',
- auctionId: 'someAuctionId',
- bidId: 'someBidId',
- bidder: 'ias',
- bidderRequestId: 'someBidderRequestId',
- params: {
- pubId: '1234',
- adUnitPath: '/d/e/f'
- },
- sizes: [
- [50, 60]
- ],
- transactionId: 'someTransactionId'
- }
- ];
- });
- it('has property `method` of `GET`', function () {
- expect(spec.buildRequests(bidRequests)).to.deep.include({
- method: 'GET'
- });
- });
- it('has property `url` to be the correct IAS endpoint', function () {
- expect(spec.buildRequests(bidRequests)).to.deep.include({
- url: IAS_HOST
- });
- });
- it('only includes the first `bidRequest` as the bidRequest variable on a multiple slot request', function () {
- expect(spec.buildRequests(bidRequests).bidRequest.adUnitCode).to.equal(bidRequests[0].adUnitCode);
- });
- describe('has property `data` that is an encode query string containing information such as', function () {
- let val;
- const ANID_PARAM = 'anId';
- const SLOT_PARAM = 'slot';
- const SLOT_ID_PARAM = 'id';
- const SLOT_SIZE_PARAM = 'ss';
- const SLOT_AD_UNIT_PATH_PARAM = 'p';
-
- beforeEach(function () {
- val = decodeURI(spec.buildRequests(bidRequests).data);
- });
- it('publisher id', function () {
- expect(val).to.have.string(`${ANID_PARAM}=1234`);
- });
- it('ad slot`s id, size and ad unit path', function () {
- expect(val).to.have.string(`${SLOT_PARAM}={${SLOT_ID_PARAM}:one-div-id,${SLOT_SIZE_PARAM}:[10.20,300.400],${SLOT_AD_UNIT_PATH_PARAM}:/a/b/c}`);
- expect(val).to.have.string(`${SLOT_PARAM}={${SLOT_ID_PARAM}:two-div-id,${SLOT_SIZE_PARAM}:[50.60],${SLOT_AD_UNIT_PATH_PARAM}:/d/e/f}`);
- });
- it('window size', function () {
- expect(val).to.match(/.*wr=[0-9]*\.[0-9]*/);
- });
- it('screen size', function () {
- expect(val).to.match(/.*sr=[0-9]*\.[0-9]*/);
- });
- it('url value', function () {
- expect(val).to.match(/.*url=https?%3A%2F%2F[^\s$.?#].[^\s]*/);
- });
- });
- it('has property `bidRequest` that is the first passed in bid request', function () {
- expect(spec.buildRequests(bidRequests)).to.deep.include({
- bidRequest: bidRequests[0]
- });
- });
- });
- });
- describe('has a method `interpretResponse` that', function () {
- it('exists', function () {
- expect(spec.interpretResponse).to.be.a('function');
- });
- describe('returns a list of bid response that', function () {
- let bidRequests, bidResponse, slots, serverResponse;
- beforeEach(function () {
- bidRequests = [
- {
- adUnitCode: 'one-div-id',
- auctionId: 'someAuctionId',
- bidId: 'someBidId1',
- bidder: 'ias',
- bidderRequestId: 'someBidderRequestId',
- params: {
- pubId: '1234',
- adUnitPath: '/a/b/c'
- },
- sizes: [
- [10, 20],
- [300, 400]
- ],
- transactionId: 'someTransactionId'
- },
- {
- adUnitCode: 'two-div-id',
- auctionId: 'someAuctionId',
- bidId: 'someBidId2',
- bidder: 'ias',
- bidderRequestId: 'someBidderRequestId',
- params: {
- pubId: '1234',
- adUnitPath: '/d/e/f'
- },
- sizes: [
- [50, 60]
- ],
- transactionId: 'someTransactionId'
- }
- ];
- const request = {
- bidRequest: {
- bidId: '102938'
- }
- };
- slots = {};
- slots['test-div-id'] = {
- id: '1234',
- vw: ['60', '70']
- };
- slots['test-div-id-two'] = {
- id: '5678',
- vw: ['80', '90']
- };
- serverResponse = {
- body: {
- brandSafety: {
- adt: 'adtVal',
- alc: 'alcVal',
- dlm: 'dlmVal',
- drg: 'drgVal',
- hat: 'hatVal',
- off: 'offVal',
- vio: 'vioVal'
- },
- fr: 'false',
- slots: slots
- },
- headers: {}
- };
- bidResponse = spec.interpretResponse(serverResponse, request);
- });
- it('has IAS keyword `adt` as property', function () {
- expect(bidResponse[0]).to.deep.include({ adt: 'adtVal' });
- });
- it('has IAS keyword `alc` as property', function () {
- expect(bidResponse[0]).to.deep.include({ alc: 'alcVal' });
- });
- it('has IAS keyword `dlm` as property', function () {
- expect(bidResponse[0]).to.deep.include({ dlm: 'dlmVal' });
- });
- it('has IAS keyword `drg` as property', function () {
- expect(bidResponse[0]).to.deep.include({ drg: 'drgVal' });
- });
- it('has IAS keyword `hat` as property', function () {
- expect(bidResponse[0]).to.deep.include({ hat: 'hatVal' });
- });
- it('has IAS keyword `off` as property', function () {
- expect(bidResponse[0]).to.deep.include({ off: 'offVal' });
- });
- it('has IAS keyword `vio` as property', function () {
- expect(bidResponse[0]).to.deep.include({ vio: 'vioVal' });
- });
- it('has IAS keyword `fr` as property', function () {
- expect(bidResponse[0]).to.deep.include({ fr: 'false' });
- });
- it('has property `slots`', function () {
- expect(bidResponse[0]).to.deep.include({ slots: slots });
- });
- it('response is the same for multiple slots', function () {
- var adapter = spec;
- var requests = adapter.buildRequests(bidRequests);
- expect(adapter.interpretResponse(serverResponse, requests)).to.length(2);
- });
- });
- describe('returns a list of bid response that with custom value', function () {
- let bidRequests, bidResponse, slots, custom, serverResponse;
- beforeEach(function () {
- bidRequests = [
- {
- adUnitCode: 'one-div-id',
- auctionId: 'someAuctionId',
- bidId: 'someBidId1',
- bidder: 'ias',
- bidderRequestId: 'someBidderRequestId',
- params: {
- pubId: '1234',
- adUnitPath: '/a/b/c'
- },
- sizes: [
- [10, 20],
- [300, 400]
- ],
- transactionId: 'someTransactionId'
- },
- {
- adUnitCode: 'two-div-id',
- auctionId: 'someAuctionId',
- bidId: 'someBidId2',
- bidder: 'ias',
- bidderRequestId: 'someBidderRequestId',
- params: {
- pubId: '1234',
- adUnitPath: '/d/e/f'
- },
- sizes: [
- [50, 60]
- ],
- transactionId: 'someTransactionId'
- }
- ];
- const request = {
- bidRequest: {
- bidId: '102938'
- }
- };
- slots = {};
- slots['test-div-id'] = {
- id: '1234',
- vw: ['60', '70']
- };
- slots['test-div-id-two'] = {
- id: '5678',
- vw: ['80', '90']
- };
- custom = {};
- custom['ias-kw'] = ['IAS_1_KW', 'IAS_2_KW'];
- serverResponse = {
- body: {
- brandSafety: {
- adt: 'adtVal',
- alc: 'alcVal',
- dlm: 'dlmVal',
- drg: 'drgVal',
- hat: 'hatVal',
- off: 'offVal',
- vio: 'vioVal'
- },
- fr: 'false',
- slots: slots,
- custom: custom
- },
- headers: {}
- };
- bidResponse = spec.interpretResponse(serverResponse, request);
- });
- it('has IAS keyword `adt` as property', function () {
- expect(bidResponse[0]).to.deep.include({ adt: 'adtVal' });
- });
- it('has IAS keyword `alc` as property', function () {
- expect(bidResponse[0]).to.deep.include({ alc: 'alcVal' });
- });
- it('has IAS keyword `dlm` as property', function () {
- expect(bidResponse[0]).to.deep.include({ dlm: 'dlmVal' });
- });
- it('has IAS keyword `drg` as property', function () {
- expect(bidResponse[0]).to.deep.include({ drg: 'drgVal' });
- });
- it('has IAS keyword `hat` as property', function () {
- expect(bidResponse[0]).to.deep.include({ hat: 'hatVal' });
- });
- it('has IAS keyword `off` as property', function () {
- expect(bidResponse[0]).to.deep.include({ off: 'offVal' });
- });
- it('has IAS keyword `vio` as property', function () {
- expect(bidResponse[0]).to.deep.include({ vio: 'vioVal' });
- });
- it('has IAS keyword `fr` as property', function () {
- expect(bidResponse[0]).to.deep.include({ fr: 'false' });
- });
- it('has property `slots`', function () {
- expect(bidResponse[0]).to.deep.include({ slots: slots });
- });
- it('has property `custom`', function () {
- expect(bidResponse[0]).to.deep.include({ custom: custom });
- });
- it('response is the same for multiple slots', function () {
- var adapter = spec;
- var requests = adapter.buildRequests(bidRequests);
- expect(adapter.interpretResponse(serverResponse, requests)).to.length(3);
- });
- });
- });
-});
diff --git a/test/spec/modules/iasRtdProvider_spec.js b/test/spec/modules/iasRtdProvider_spec.js
new file mode 100644
index 00000000000..778a3a81b9b
--- /dev/null
+++ b/test/spec/modules/iasRtdProvider_spec.js
@@ -0,0 +1,74 @@
+import { iasSubModule } from 'modules/iasRtdProvider.js';
+import { expect } from 'chai';
+
+describe('iasRtdProvider is a RTD provider that', function () {
+ it('has the correct module name', function () {
+ expect(iasSubModule.name).to.equal('ias');
+ });
+ describe('has a method `init` that', function () {
+ it('exists', function () {
+ expect(iasSubModule.init).to.be.a('function');
+ });
+ it('returns true', function () {
+ expect(iasSubModule.init()).to.equal(true);
+ });
+ });
+ describe('has a method `getBidRequestData` that', function () {
+ const callback = sinon.spy();
+ const config = {
+ name: 'ias',
+ waitForIt: true,
+ params: {
+ pubId: 1234
+ }
+ };
+ it('exists', function () {
+ expect(iasSubModule.getBidRequestData).to.be.a('function');
+ });
+ it('verify config params', function () {
+ expect(config.name).to.not.be.undefined;
+ expect(config.name).to.equal('ias');
+ expect(config.params.pubId).to.not.be.undefined;
+ expect(config.params).to.have.property('pubId');
+ });
+ it('invoke method', function () {
+ iasSubModule.getBidRequestData({ adUnits: adUnits }, callback, config);
+ expect(adUnits).to.length(2);
+ expect(callback.calledOnce).to.be.false;
+ });
+ });
+});
+
+const adUnits = [
+ {
+ code: 'one-div-id',
+ mediaTypes: {
+ banner: {
+ sizes: [[970, 250], [728, 90], [1000, 90]]
+ }
+ },
+ sizes: [[970, 250], [728, 90], [1000, 90]],
+ bids: [
+ {
+ bidder: 'ias',
+ params: {
+ pubId: '1234',
+ adUnitPath: '/a/b/c'
+ }
+ }]
+ },
+ {
+ code: 'two-div-id',
+ mediaTypes: {
+ banner: { sizes: [[300, 250], [300, 600]] }
+ },
+ sizes: [[300, 250], [300, 600]],
+ bids: [
+ {
+ bidder: 'ias',
+ params: {
+ pubId: '1234',
+ adUnitPath: '/d/e/f'
+ }
+ }]
+ }];
diff --git a/test/spec/modules/id5AnalyticsAdapter_spec.js b/test/spec/modules/id5AnalyticsAdapter_spec.js
new file mode 100644
index 00000000000..be5998967c9
--- /dev/null
+++ b/test/spec/modules/id5AnalyticsAdapter_spec.js
@@ -0,0 +1,462 @@
+import adapterManager from '../../../src/adapterManager.js';
+import id5AnalyticsAdapter from '../../../modules/id5AnalyticsAdapter.js';
+import { expect } from 'chai';
+import sinon from 'sinon';
+import events from '../../../src/events.js';
+import constants from '../../../src/constants.json';
+import { generateUUID } from '../../../src/utils.js';
+
+const CONFIG_URL = 'https://api.id5-sync.com/analytics/12349/pbjs';
+const INGEST_URL = 'https://test.me/ingest';
+
+describe('ID5 analytics adapter', () => {
+ let server;
+ let config;
+
+ beforeEach(() => {
+ server = sinon.createFakeServer();
+ config = {
+ options: {
+ partnerId: 12349,
+ }
+ };
+ });
+
+ afterEach(() => {
+ server.restore();
+ });
+
+ it('registers itself with the adapter manager', () => {
+ const adapter = adapterManager.getAnalyticsAdapter('id5Analytics');
+ expect(adapter).to.exist;
+ expect(adapter.gvlid).to.be.a('number');
+ expect(adapter.adapter).to.equal(id5AnalyticsAdapter);
+ });
+
+ it('tolerates undefined or empty config', () => {
+ id5AnalyticsAdapter.enableAnalytics(undefined);
+ id5AnalyticsAdapter.enableAnalytics({});
+ });
+
+ it('calls configuration endpoint', () => {
+ server.respondWith('GET', CONFIG_URL, [200,
+ {
+ 'Content-Type': 'application/json',
+ 'Access-Control-Allow-Origin': '*'
+ },
+ `{ "sampling": 0, "ingestUrl": "${INGEST_URL}" }`
+ ]);
+ id5AnalyticsAdapter.enableAnalytics(config);
+ server.respond();
+
+ expect(server.requests).to.have.length(1);
+
+ id5AnalyticsAdapter.disableAnalytics();
+ });
+
+ it('does not call configuration endpoint when partner id is missing', () => {
+ id5AnalyticsAdapter.enableAnalytics({});
+ server.respond();
+
+ expect(server.requests).to.have.length(0);
+
+ id5AnalyticsAdapter.disableAnalytics();
+ });
+
+ describe('after configuration', () => {
+ let auction;
+
+ beforeEach(() => {
+ server.respondWith('GET', CONFIG_URL, [200,
+ {
+ 'Content-Type': 'application/json',
+ 'Access-Control-Allow-Origin': '*'
+ },
+ `{ "sampling": 1, "ingestUrl": "${INGEST_URL}" }`
+ ]);
+
+ server.respondWith('POST', INGEST_URL, [200,
+ {
+ 'Content-Type': 'application/json',
+ 'Access-Control-Allow-Origin': '*'
+ },
+ ''
+ ]);
+
+ auction = {
+ auctionId: generateUUID(),
+ adUnits: [{
+ 'code': 'user-728',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250], [300, 600], [728, 90]]
+ }
+ },
+ adUnitCodes: ['user-728']
+ }],
+ };
+ });
+
+ afterEach(() => {
+ id5AnalyticsAdapter.disableAnalytics();
+ });
+
+ it('sends auction end events to the backend', () => {
+ id5AnalyticsAdapter.enableAnalytics(config);
+ server.respond();
+ events.emit(constants.EVENTS.AUCTION_END, auction);
+ server.respond();
+
+ // Why 3? 1: config, 2: tcfEnforcement, 3: auctionEnd
+ // tcfEnforcement? yes, gdprEnforcement module emits in reaction to auctionEnd
+ expect(server.requests).to.have.length(3);
+
+ const body1 = JSON.parse(server.requests[1].requestBody);
+ expect(body1.source).to.equal('pbjs');
+ expect(body1.event).to.equal('tcf2Enforcement');
+ expect(body1.partnerId).to.equal(12349);
+ expect(body1.meta).to.be.a('object');
+ expect(body1.meta.pbjs).to.equal($$PREBID_GLOBAL$$.version);
+ expect(body1.meta.sampling).to.equal(1);
+ expect(body1.meta.tz).to.be.a('number');
+
+ const body2 = JSON.parse(server.requests[2].requestBody);
+ expect(body2.source).to.equal('pbjs');
+ expect(body2.event).to.equal('auctionEnd');
+ expect(body2.partnerId).to.equal(12349);
+ expect(body2.meta).to.be.a('object');
+ expect(body2.meta.pbjs).to.equal($$PREBID_GLOBAL$$.version);
+ expect(body2.meta.sampling).to.equal(1);
+ expect(body2.meta.tz).to.be.a('number');
+ expect(body2.payload).to.eql(auction);
+ });
+
+ it('filters unwanted IDs from the events it sends', () => {
+ auction.adUnits[0].bids = [{
+ 'bidder': 'appnexus',
+ 'params': {
+ 'placementId': '16618951'
+ },
+ 'userId': {
+ 'criteoId': '_h_y_19IMUhMZG1TOTRReHFNc29TekJ3TzQ3elhnRU81ayUyQjhiRkdJJTJGaTFXJTJCdDRnVmN4S0FETUhQbXdmQWg0M3g1NWtGbGolMkZXalclMkJvWjJDOXFDSk1HU3ZKaVElM0QlM0Q',
+ 'id5id': {
+ 'uid': 'ID5-ZHMOQ99ulpk687Fd9xVwzxMsYtkQIJnI-qm3iWdtww!ID5*FSycZQy7v7zWXiKbEpPEWoB3_UiWdPGzh554ncYDvOkAAA3rajiR0yNrFAU7oDTu',
+ 'ext': { 'linkType': 1 }
+ },
+ 'tdid': '888a6042-8f99-483b-aa26-23c44bc9166b'
+ },
+ 'userIdAsEids': [{
+ 'source': 'criteo.com',
+ 'uids': [{
+ 'id': '_h_y_19IMUhMZG1TOTRReHFNc29TekJ3TzQ3elhnRU81ayUyQjhiRkdJJTJGaTFXJTJCdDRnVmN4S0FETUhQbXdmQWg0M3g1NWtGbGolMkZXalclMkJvWjJDOXFDSk1HU3ZKaVElM0QlM0Q',
+ 'atype': 1
+ }]
+ }, {
+ 'source': 'id5-sync.com',
+ 'uids': [{
+ 'id': 'ID5-ZHMOQ99ulpk687Fd9xVwzxMsYtkQIJnI-qm3iWdtww!ID5*FSycZQy7v7zWXiKbEpPEWoB3_UiWdPGzh554ncYDvOkAAA3rajiR0yNrFAU7oDTu',
+ 'atype': 1,
+ 'ext': { 'linkType': 1 }
+ }]
+ }]
+ }];
+
+ auction.bidderRequests = [{
+ 'bidderCode': 'appnexus',
+ 'auctionId': 'e8d15df4-d89c-44c9-8b36-812f75cbf227',
+ 'bidderRequestId': '1451a3c759c60359',
+ 'bids': [
+ {
+ 'bidder': 'appnexus',
+ 'params': {
+ 'placementId': '16824712'
+ },
+ 'userId': {
+ 'id5id': {
+ 'uid': 'ID5-ZHMOQ99ulpk687Fd9xVwzxMsYtkQIJnI-qm3iWdtww!ID5*CmuuahP8jbPJGRCUDdT2VZ8wz0eJM8O8mNlKktlEjuYAABFEjc2c9faqDencf2hR',
+ 'ext': {
+ 'linkType': 1
+ }
+ },
+ 'sharedid': {
+ 'id': '01F6J4T72MRFYVWTN65WFA0H7N',
+ 'third': '01F6J4T72MRFYVWTN65WFA0H7N'
+ },
+ 'tdid': '0e45f56b-ad09-4c91-b090-8bd03e0d0754'
+ },
+ 'userIdAsEids': [
+ {
+ 'source': 'id5-sync.com',
+ 'uids': [
+ {
+ 'id': 'ID5-ZHMOQ99ulpk687Fd9xVwzxMsYtkQIJnI-qm3iWdtww!ID5*CmuuahP8jbPJGRCUDdT2VZ8wz0eJM8O8mNlKktlEjuYAABFEjc2c9faqDencf2hR',
+ 'atype': 1,
+ 'ext': {
+ 'linkType': 1
+ }
+ }
+ ]
+ },
+ {
+ 'source': 'sharedid.org',
+ 'uids': [
+ {
+ 'id': '01F6J4T72MRFYVWTN65WFA0H7N',
+ 'atype': 1,
+ 'ext': {
+ 'third': '01F6J4T72MRFYVWTN65WFA0H7N'
+ }
+ }
+ ]
+ },
+ {
+ 'source': 'adserver.org',
+ 'uids': [
+ {
+ 'id': '0e45f56b-ad09-4c91-b090-8bd03e0d0754',
+ 'atype': 1,
+ 'ext': {
+ 'rtiPartner': 'TDID'
+ }
+ }
+ ]
+ }
+ ],
+ 'ortb2Imp': {
+ 'ext': {
+ 'data': {
+ 'adserver': {
+ 'name': 'gam',
+ 'adslot': '/6783/Kiwi/portail'
+ },
+ 'pbadslot': '/6783/Kiwi/portail'
+ }
+ }
+ },
+ 'adUnitCode': 'btf_leaderboard',
+ 'transactionId': '3ce8216e-7898-4a22-86ba-01519b62bfce',
+ 'sizes': [
+ [
+ 728,
+ 90
+ ]
+ ],
+ 'bidId': '146661c05209a56e',
+ 'bidderRequestId': '1451a3c759c60359',
+ 'auctionId': 'e8d15df4-d89c-44c9-8b36-812f75cbf227',
+ 'src': 'client',
+ 'bidRequestsCount': 2,
+ 'bidderRequestsCount': 2,
+ 'bidderWinsCount': 0
+ }
+ ],
+ 'auctionStart': 1621959214757,
+ 'timeout': 2000,
+ 'refererInfo': {
+ 'referer': 'https://www.blog.com/?pbjs_debug=true',
+ 'reachedTop': true,
+ 'isAmp': false,
+ 'numIframes': 0,
+ 'stack': [
+ 'https://www.blog.com/?pbjs_debug=true'
+ ],
+ 'canonicalUrl': null
+ },
+ 'gdprConsent': {
+ 'consentString': 'CPGw1WAPGw1WAAHABBENBbCsAP_AAH_AAAAAH3tf_X__b3_j-_59__t0eY1f9_7_v-0zjhfdt-8N2f_X_L8X42M7vF36pq4KuR4Eu3LBIQdlHOHcTUmw6okVrTPsbk2Mr7NKJ7PEmnMbe2dYGH9_n93TuZKY7__8___z__-v_v____f_r-3_3__59X---_e_V399zLv9__3__9gfaASYal8AF2JY4Mk0aVQogQhWEh0AoAKKAYWiawgZXBTsrgI9QQMAEJqAjAiBBiCjFgEAAgEASERASAHggEQBEAgABACpAQgAI2AQWAFgYBAAKAaFiBFAEIEhBkcFRymBARItFBPZWAJRd7GmEIZRYAUCj-iowEShBAsDISFg4AAA.f_gAD_gAAAAA',
+ 'vendorData': {
+ 'cmpId': 7,
+ 'cmpVersion': 1,
+ 'gdprApplies': true,
+ 'tcfPolicyVersion': 2,
+ 'eventStatus': 'useractioncomplete',
+ 'cmpStatus': 'loaded',
+ 'listenerId': 47,
+ 'tcString': 'CPGw1WAPGw1WAAHABBENBbCsAP_AAH_AAAAAH3tf_X__b3_j-_59__t0eY1f9_7_v-0zjhfdt-8N2f_X_L8X42M7vF36pq4KuR4Eu3LBIQdlHOHcTUmw6okVrTPsbk2Mr7NKJ7PEmnMbe2dYGH9_n93TuZKY7__8___z__-v_v____f_r-3_3__59X---_e_V399zLv9__3__9gfaASYal8AF2JY4Mk0aVQogQhWEh0AoAKKAYWiawgZXBTsrgI9QQMAEJqAjAiBBiCjFgEAAgEASERASAHggEQBEAgABACpAQgAI2AQWAFgYBAAKAaFiBFAEIEhBkcFRymBARItFBPZWAJRd7GmEIZRYAUCj-iowEShBAsDISFg4AAA.f_gAD_gAAAAA',
+ },
+ 'gdprApplies': true,
+ 'addtlConsent': '1~7.12.35.62.66.70.89.93.108.122.144.149.153.162.167.184.196.221.241.253.259.272.311.317.323.326.338.348.350.415.440.448.449.482.486.491.494.495.540.571.574.585.587.588.590.725.733.780.817.839.864.867.932.938.981.986.1031.1033.1051.1092.1097.1126.1127.1170.1171.1186.1201.1204.1205.1211.1215.1230.1232.1236.1248.1276.1290.1301.1313.1344.1364.1365.1415.1419.1428.1449.1451.1509.1558.1564.1570.1577.1591.1651.1669.1712.1716.1720.1721.1725.1733.1753.1765.1799.1810.1834.1842.1870.1878.1889.1896.1911.1922.1929.2012.2072.2078.2079.2109.2177.2202.2253.2290.2299.2316.2357.2373.2526.2531.2571.2572.2575.2628.2663.2677.2776.2778.2779.2985.3033.3052.3154',
+ 'apiVersion': 2
+ },
+ 'start': 1621959214763
+ }];
+
+ auction.bidsReceived = [{
+ 'bidderCode': 'appnexus',
+ 'width': 728,
+ 'height': 90,
+ 'statusMessage': 'Bid available',
+ 'adId': '99e7838aa7f1c4f',
+ 'requestId': '21e0b32208ee9a',
+ 'mediaType': 'banner',
+ 'source': 'client',
+ 'cpm': 0.020601,
+ 'creativeId': 209272535,
+ 'currency': 'USD',
+ 'netRevenue': true,
+ 'ttl': 300,
+ 'adUnitCode': 'user-728',
+ 'appnexus': {
+ 'buyerMemberId': 11563
+ },
+ 'meta': {
+ 'advertiserId': 4388779
+ },
+ 'ad': 'stuff i am not interested in',
+ 'originalCpm': 0.020601,
+ 'originalCurrency': 'USD',
+ 'auctionId': 'c7694dbb-a583-4a73-a933-b16f1f821ba4',
+ // Make sure cleanup is resilient
+ 'someNullObject': null,
+ 'someUndefinedProperty': undefined
+ }];
+
+ id5AnalyticsAdapter.enableAnalytics(config);
+ server.respond();
+ events.emit(constants.EVENTS.AUCTION_END, auction);
+ server.respond();
+
+ expect(server.requests).to.have.length(3);
+
+ const body = JSON.parse(server.requests[2].requestBody);
+ expect(body.event).to.equal('auctionEnd');
+ expect(body.payload.adUnits[0].bids[0].userId).to.eql({
+ 'criteoId': '__ID5_REDACTED__',
+ 'id5id': {
+ 'uid': '__ID5_REDACTED__',
+ 'ext': {
+ 'linkType': 1
+ }
+ },
+ 'tdid': '__ID5_REDACTED__'
+ });
+ expect(body.payload.bidderRequests[0].bids[0].userId).to.eql({
+ 'sharedid': '__ID5_REDACTED__',
+ 'id5id': {
+ 'uid': '__ID5_REDACTED__',
+ 'ext': {
+ 'linkType': 1
+ }
+ },
+ 'tdid': '__ID5_REDACTED__'
+ });
+ body.payload.adUnits[0].bids[0].userIdAsEids.forEach((userId) => {
+ expect(userId.uids[0].id).to.equal('__ID5_REDACTED__');
+ if (userId.uids[0].ext) {
+ expect(userId.uids[0].ext).to.equal('__ID5_REDACTED__');
+ }
+ });
+ body.payload.bidderRequests[0].bids[0].userIdAsEids.forEach((userId) => {
+ expect(userId.uids[0].id).to.equal('__ID5_REDACTED__');
+ if (userId.uids[0].ext) {
+ expect(userId.uids[0].ext).to.equal('__ID5_REDACTED__');
+ }
+ });
+ expect(body.payload.bidsReceived[0].ad).to.equal(undefined);
+ expect(body.payload.bidsReceived[0].requestId).to.equal('21e0b32208ee9a');
+ });
+
+ it('can override events to collect if configured to do so', () => {
+ server.respondWith('GET', CONFIG_URL, [200,
+ {
+ 'Content-Type': 'application/json',
+ 'Access-Control-Allow-Origin': '*'
+ },
+ `{ "sampling": 1, "ingestUrl": "${INGEST_URL}", "eventsToTrack": ["tcf2Enforcement"] }`
+ ]);
+ id5AnalyticsAdapter.enableAnalytics(config);
+ server.respond();
+ events.emit(constants.EVENTS.AUCTION_END, auction);
+ server.respond();
+
+ expect(server.requests).to.have.length(2);
+ const body1 = JSON.parse(server.requests[1].requestBody);
+ expect(body1.event).to.equal('tcf2Enforcement');
+ });
+
+ it('can extend cleanup rules from server side', () => {
+ auction.bidsReceived = [{
+ 'bidderCode': 'appnexus',
+ 'width': 728,
+ 'height': 90,
+ 'statusMessage': 'Bid available',
+ 'adId': '99e7838aa7f1c4f',
+ 'requestId': '21e0b32208ee9a',
+ 'mediaType': 'banner',
+ 'source': 'client',
+ 'cpm': 0.020601,
+ 'creativeId': 209272535,
+ 'currency': 'USD',
+ 'netRevenue': true,
+ 'ttl': 300,
+ 'adUnitCode': 'user-728',
+ 'appnexus': {
+ 'buyerMemberId': 11563
+ },
+ 'meta': {
+ 'advertiserId': 4388779
+ },
+ 'ad': 'stuff i am not interested in',
+ 'originalCpm': 0.020601,
+ 'originalCurrency': 'USD',
+ 'auctionId': 'c7694dbb-a583-4a73-a933-b16f1f821ba4'
+ }, {
+ 'bidderCode': 'ix',
+ 'width': 728,
+ 'height': 90,
+ 'statusMessage': 'Bid available',
+ 'adId': '228f725de4a9ff09',
+ 'requestId': '225a42b4a8ec7287',
+ 'mediaType': 'banner',
+ 'source': 'client',
+ 'cpm': 0.06,
+ 'netRevenue': true,
+ 'currency': 'USD',
+ 'creativeId': '8838044',
+ 'ad': 'lots of HTML code',
+ 'ttl': 300,
+ 'meta': {
+ 'networkId': 85,
+ 'brandId': 822,
+ 'brandName': 'Microsoft Brands',
+ 'advertiserDomains': [
+ 'microsoftstore.com'
+ ]
+ },
+ 'originalCpm': 0.06,
+ 'originalCurrency': 'USD',
+ 'auctionId': 'fe28ce44-61bb-4ed8-be3c-3e801dfddcb9',
+ 'responseTimestamp': 1621954632648,
+ 'requestTimestamp': 1621954632498,
+ 'bidder': 'ix',
+ 'adUnitCode': 'sticky_footer',
+ 'timeToRespond': 150,
+ 'pbLg': '0.00',
+ 'pbCg': '0.06',
+ 'size': '728x90',
+ 'adserverTargeting': {
+ 'hb_bidder': 'ix',
+ }
+ }];
+ server.respondWith('GET', CONFIG_URL, [200,
+ {
+ 'Content-Type': 'application/json',
+ 'Access-Control-Allow-Origin': '*'
+ },
+ `{ "sampling": 1, "ingestUrl": "${INGEST_URL}", "additionalCleanupRules": {"auctionEnd": [{"match":["bidsReceived", "*", "requestId"],"apply":"erase"}]} }`
+ ]);
+ id5AnalyticsAdapter.enableAnalytics(config);
+ server.respond();
+ events.emit(constants.EVENTS.AUCTION_END, auction);
+ server.respond();
+
+ expect(server.requests).to.have.length(3);
+ const body = JSON.parse(server.requests[2].requestBody);
+ expect(body.event).to.equal('auctionEnd');
+ expect(body.payload.bidsReceived[0].requestId).to.equal(undefined);
+ expect(body.payload.bidsReceived[1].requestId).to.equal(undefined);
+ expect(body.payload.bidsReceived[0].bidderCode).to.equal('appnexus');
+ expect(body.payload.bidsReceived[1].bidderCode).to.equal('ix');
+ });
+ });
+});
diff --git a/test/spec/modules/id5IdSystem_spec.js b/test/spec/modules/id5IdSystem_spec.js
index 9ba9aee9c63..debde20e4c0 100644
--- a/test/spec/modules/id5IdSystem_spec.js
+++ b/test/spec/modules/id5IdSystem_spec.js
@@ -74,9 +74,6 @@ describe('ID5 ID System', function() {
}
}
}
- function getFetchCookieConfig() {
- return getUserSyncConfig([getId5FetchConfig(ID5_STORAGE_NAME, 'cookie')]);
- }
function getFetchLocalStorageConfig() {
return getUserSyncConfig([getId5FetchConfig(ID5_STORAGE_NAME, 'html5')]);
}
@@ -239,35 +236,36 @@ describe('ID5 ID System', function() {
expect(getNbFromCache(ID5_TEST_PARTNER_ID)).to.be.eq(0);
});
- it('should call the ID5 server with ab feature = 1 when abTesting is turned on', function () {
+ it('should call the ID5 server with ab_testing object when abTesting is turned on', function () {
let id5Config = getId5FetchConfig();
- id5Config.params.abTesting = { enabled: true, controlGroupPct: 10 }
+ id5Config.params.abTesting = { enabled: true, controlGroupPct: 0.234 }
let submoduleCallback = id5IdSubmodule.getId(id5Config, undefined, ID5_STORED_OBJ).callback;
submoduleCallback(callbackSpy);
let request = server.requests[0];
let requestBody = JSON.parse(request.requestBody);
- expect(requestBody.features.ab).to.eq(1);
+ expect(requestBody.ab_testing.enabled).to.eq(true);
+ expect(requestBody.ab_testing.control_group_pct).to.eq(0.234);
request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
});
- it('should call the ID5 server without ab feature when abTesting is turned off', function () {
+ it('should call the ID5 server without ab_testing object when abTesting is turned off', function () {
let id5Config = getId5FetchConfig();
- id5Config.params.abTesting = { enabled: false, controlGroupPct: 10 }
+ id5Config.params.abTesting = { enabled: false, controlGroupPct: 0.55 }
let submoduleCallback = id5IdSubmodule.getId(id5Config, undefined, ID5_STORED_OBJ).callback;
submoduleCallback(callbackSpy);
let request = server.requests[0];
let requestBody = JSON.parse(request.requestBody);
- expect(requestBody.features).to.be.undefined;
+ expect(requestBody.ab_testing).to.be.undefined;
request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
});
- it('should call the ID5 server without ab feature when when abTesting is not set', function () {
+ it('should call the ID5 server without ab_testing when when abTesting is not set', function () {
let id5Config = getId5FetchConfig();
let submoduleCallback = id5IdSubmodule.getId(id5Config, undefined, ID5_STORED_OBJ).callback;
@@ -275,7 +273,7 @@ describe('ID5 ID System', function() {
let request = server.requests[0];
let requestBody = JSON.parse(request.requestBody);
- expect(requestBody.features).to.be.undefined;
+ expect(requestBody.ab_testing).to.be.undefined;
request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
});
@@ -450,105 +448,11 @@ describe('ID5 ID System', function() {
const expectedDecodedObjectWithIdAbOff = { id5id: { uid: ID5_STORED_ID, ext: { linkType: ID5_STORED_LINK_TYPE } } };
const expectedDecodedObjectWithIdAbOn = { id5id: { uid: ID5_STORED_ID, ext: { linkType: ID5_STORED_LINK_TYPE, abTestingControlGroup: false } } };
const expectedDecodedObjectWithoutIdAbOn = { id5id: { uid: '', ext: { linkType: 0, abTestingControlGroup: true } } };
- let testConfig;
+ let testConfig, storedObject;
beforeEach(function() {
testConfig = getId5FetchConfig();
- });
-
- describe('Configuration Validation', function() {
- let logErrorSpy;
- let logInfoSpy;
-
- beforeEach(function() {
- logErrorSpy = sinon.spy(utils, 'logError');
- logInfoSpy = sinon.spy(utils, 'logInfo');
- });
- afterEach(function() {
- logErrorSpy.restore();
- logInfoSpy.restore();
- });
-
- // A/B Testing ON, but invalid config
- let testInvalidAbTestingConfigsWithError = [
- { enabled: true },
- { enabled: true, controlGroupPct: 2 },
- { enabled: true, controlGroupPct: -1 },
- { enabled: true, controlGroupPct: 'a' },
- { enabled: true, controlGroupPct: true }
- ];
- testInvalidAbTestingConfigsWithError.forEach((testAbTestingConfig) => {
- it('should be undefined if ratio is invalid', () => {
- expect(isInControlGroup('userId', testAbTestingConfig.controlGroupPct)).to.be.undefined;
- });
- it('should error if config is invalid, and always return an ID', function () {
- testConfig.params.abTesting = testAbTestingConfig;
- let decoded = id5IdSubmodule.decode(ID5_STORED_OBJ, testConfig);
- expect(decoded).to.deep.equal(expectedDecodedObjectWithIdAbOn);
- sinon.assert.calledOnce(logErrorSpy);
- });
- });
-
- // A/B Testing OFF, with invalid config (ignore)
- let testInvalidAbTestingConfigsWithoutError = [
- { enabled: false, controlGroupPct: -1 },
- { enabled: false, controlGroupPct: 2 },
- { enabled: false, controlGroupPct: 'a' },
- { enabled: false, controlGroupPct: true }
- ];
- testInvalidAbTestingConfigsWithoutError.forEach((testAbTestingConfig) => {
- it('should be undefined if ratio is invalid', () => {
- expect(isInControlGroup('userId', testAbTestingConfig.controlGroupPct)).to.be.undefined;
- });
- it('should not error if config is invalid but A/B testing is off, and always return an ID', function () {
- testConfig.params.abTesting = testAbTestingConfig;
- let decoded = id5IdSubmodule.decode(ID5_STORED_OBJ, testConfig);
- expect(decoded).to.deep.equal(expectedDecodedObjectWithIdAbOff);
- sinon.assert.notCalled(logErrorSpy);
- });
- });
-
- // A/B Testing ON, with valid config
- let testValidConfigs = [
- { enabled: true, controlGroupPct: 0 },
- { enabled: true, controlGroupPct: 0.5 },
- { enabled: true, controlGroupPct: 1 }
- ];
- testValidConfigs.forEach((testAbTestingConfig) => {
- it('should not be undefined if ratio is valid', () => {
- expect(isInControlGroup('userId', testAbTestingConfig.controlGroupPct)).to.not.be.undefined;
- });
- it('should not error if config is valid', function () {
- testConfig.params.abTesting = testAbTestingConfig;
- id5IdSubmodule.decode(ID5_STORED_OBJ, testConfig);
- sinon.assert.notCalled(logErrorSpy);
- });
- });
- });
-
- describe('A/B Testing Config is not Set', function() {
- let randStub;
-
- beforeEach(function() {
- randStub = sinon.stub(Math, 'random').callsFake(function() {
- return 0;
- });
- });
- afterEach(function () {
- randStub.restore();
- });
-
- it('should expose ID when A/B config is not set', function () {
- let decoded = id5IdSubmodule.decode(ID5_STORED_OBJ, testConfig);
- expect(decoded).to.deep.equal(expectedDecodedObjectWithIdAbOff);
- });
-
- it('should expose ID when A/B config is empty', function () {
- testConfig.params.abTesting = { };
-
- let decoded = id5IdSubmodule.decode(ID5_STORED_OBJ, testConfig);
- expect(decoded).to.deep.equal(expectedDecodedObjectWithIdAbOff);
- });
+ storedObject = utils.deepClone(ID5_STORED_OBJ);
});
describe('A/B Testing Config is Set', function() {
@@ -563,69 +467,41 @@ describe('ID5 ID System', function() {
randStub.restore();
});
- describe('IsInControlGroup', function () {
- it('Nobody is in a 0% control group', function () {
- expect(isInControlGroup('dsdndskhsdks', 0)).to.be.false;
- expect(isInControlGroup('3erfghyuijkm', 0)).to.be.false;
- expect(isInControlGroup('', 0)).to.be.false;
- expect(isInControlGroup(undefined, 0)).to.be.false;
- });
-
- it('Everybody is in a 100% control group', function () {
- expect(isInControlGroup('dsdndskhsdks', 1)).to.be.true;
- expect(isInControlGroup('3erfghyuijkm', 1)).to.be.true;
- expect(isInControlGroup('', 1)).to.be.true;
- expect(isInControlGroup(undefined, 1)).to.be.true;
- });
+ describe('Decode', function() {
+ let logErrorSpy;
- it('Being in the control group must be consistant', function () {
- const inControlGroup = isInControlGroup('dsdndskhsdks', 0.5);
- expect(inControlGroup === isInControlGroup('dsdndskhsdks', 0.5)).to.be.true;
- expect(inControlGroup === isInControlGroup('dsdndskhsdks', 0.5)).to.be.true;
- expect(inControlGroup === isInControlGroup('dsdndskhsdks', 0.5)).to.be.true;
+ beforeEach(function() {
+ logErrorSpy = sinon.spy(utils, 'logError');
});
-
- it('Control group ratio must be within a 10% error on a large sample', function () {
- let nbInControlGroup = 0;
- const sampleSize = 100;
- for (let i = 0; i < sampleSize; i++) {
- nbInControlGroup = nbInControlGroup + (isInControlGroup('R$*df' + i, 0.5) ? 1 : 0);
- }
- expect(nbInControlGroup).to.be.greaterThan(sampleSize / 2 - sampleSize / 10);
- expect(nbInControlGroup).to.be.lessThan(sampleSize / 2 + sampleSize / 10);
+ afterEach(function() {
+ logErrorSpy.restore();
});
- });
-
- describe('Decode', function() {
- it('should expose ID when A/B testing is off', function () {
- testConfig.params.abTesting = {
- enabled: false,
- controlGroupPct: 0.5
- };
- let decoded = id5IdSubmodule.decode(ID5_STORED_OBJ, testConfig);
+ it('should not set abTestingControlGroup extension when A/B testing is off', function () {
+ let decoded = id5IdSubmodule.decode(storedObject, testConfig);
expect(decoded).to.deep.equal(expectedDecodedObjectWithIdAbOff);
});
- it('should expose ID when no one is in control group', function () {
- testConfig.params.abTesting = {
- enabled: true,
- controlGroupPct: 0
- };
-
- let decoded = id5IdSubmodule.decode(ID5_STORED_OBJ, testConfig);
+ it('should set abTestingControlGroup to false when A/B testing is on but in normal group', function () {
+ storedObject.ab_testing = { result: 'normal' };
+ let decoded = id5IdSubmodule.decode(storedObject, testConfig);
expect(decoded).to.deep.equal(expectedDecodedObjectWithIdAbOn);
});
it('should not expose ID when everyone is in control group', function () {
- testConfig.params.abTesting = {
- enabled: true,
- controlGroupPct: 1
- };
-
- let decoded = id5IdSubmodule.decode(ID5_STORED_OBJ, testConfig);
+ storedObject.ab_testing = { result: 'control' };
+ storedObject.universal_uid = '';
+ storedObject.link_type = 0;
+ let decoded = id5IdSubmodule.decode(storedObject, testConfig);
expect(decoded).to.deep.equal(expectedDecodedObjectWithoutIdAbOn);
});
+
+ it('should log A/B testing errors', function () {
+ storedObject.ab_testing = { result: 'error' };
+ let decoded = id5IdSubmodule.decode(storedObject, testConfig);
+ expect(decoded).to.deep.equal(expectedDecodedObjectWithIdAbOff);
+ sinon.assert.calledOnce(logErrorSpy);
+ });
});
});
});
diff --git a/test/spec/modules/imonomyBidAdapter_spec.js b/test/spec/modules/imonomyBidAdapter_spec.js
deleted file mode 100644
index 45b3bed6e77..00000000000
--- a/test/spec/modules/imonomyBidAdapter_spec.js
+++ /dev/null
@@ -1,164 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/imonomyBidAdapter.js';
-
-describe('Imonomy Adapter Tests', function () {
- const bidsRequest = [
- {
- bidder: 'imonomy',
- params: {
- placementId: '170577',
- hbid: '14567718624',
- },
- placementCode: 'div-gpt-ad-1460505748561-0',
- transactionId: '9f801c02-bbe8-4683-8ed4-bc816ea186bb',
- sizes: [
- [300, 250]
- ],
- bidId: '2faedf1095f815',
- bidderRequestId: '18065867f8ae39',
- auctionId: '529e1518-b872-45cf-807c-2d41dfa5bcd3'
- },
- {
- bidder: 'imonomy',
- params: {
- placementId: '281277',
- hbid: '14567718624',
- floorPrice: 0.5
- },
- placementCode: 'div-gpt-ad-1460505748561-0',
- transactionId: '9f801c02-bbe8-4683-8ed4-bc816ea186bb',
- sizes: [
- [728, 90]
- ],
- bidId: '3c34e2367a3f59',
- bidderRequestId: '18065867f8ae39',
- auctionId: '529e1518-b872-45cf-807c-2d41dfa5bcd3'
- }];
-
- const bidsResponse = {
- body: {
- bids: [
- {
- placementid: '170577',
- uuid: '2faedf1095f815',
- width: 300,
- height: 250,
- cpm: 0.51,
- creative: '',
- ttl: 360,
- currency: 'USD',
- netRevenue: true,
- creativeId: 'd30b58c2ba'
- }
- ]
- }
- };
-
- it('Verifies imonomyAdapter bidder code', function () {
- expect(spec.code).to.equal('imonomy');
- });
-
- it('Verifies imonomyAdapter bid request validation', function () {
- expect(spec.isBidRequestValid(bidsRequest[0])).to.equal(true);
- expect(spec.isBidRequestValid(bidsRequest[1])).to.equal(true);
- expect(spec.isBidRequestValid({})).to.equal(false);
- expect(spec.isBidRequestValid({ params: {} })).to.equal(false);
- expect(spec.isBidRequestValid({ params: { hbid: 12345 } })).to.equal(false);
- expect(spec.isBidRequestValid({ params: { placementid: 12345 } })).to.equal(false);
- expect(spec.isBidRequestValid({ params: { hbid: 12345, placementId: 67890 } })).to.equal(true);
- expect(spec.isBidRequestValid({ params: { hbid: 12345, placementId: 67890, floorPrice: 0.8 } })).to.equal(true);
- });
-
- it('Verify imonomyAdapter build request', function () {
- var startTime = new Date().getTime();
-
- const request = spec.buildRequests(bidsRequest);
- expect(request.url).to.equal('https://b.imonomy.com/openrtb/hb/14567718624');
- expect(request.method).to.equal('POST');
- const requestData = JSON.parse(request.data);
-
- // bids object
- let bids = requestData.bids;
- expect(bids).to.have.lengthOf(2);
-
- // first bid request: no floor price
- expect(bids[0].uuid).to.equal('2faedf1095f815');
- expect(bids[0].floorprice).to.be.undefined;
- expect(bids[0].placementid).to.equal('170577');
- expect(bids[0].hbid).to.equal('14567718624');
- expect(bids[0].trid).to.equal('9f801c02-bbe8-4683-8ed4-bc816ea186bb');
- expect(bids[0].sizes).to.have.lengthOf(1);
- expect(bids[0].sizes[0][0]).to.equal(300);
- expect(bids[0].sizes[0][1]).to.equal(250);
-
- // second bid request: with floor price
- expect(bids[1].uuid).to.equal('3c34e2367a3f59');
- expect(bids[1].floorprice).to.equal(0.5);
- expect(bids[1].placementid).to.equal('281277');
- expect(bids[1].hbid).to.equal('14567718624');
- expect(bids[1].trid).to.equal('9f801c02-bbe8-4683-8ed4-bc816ea186bb');
- expect(bids[1]).to.have.property('sizes')
- .that.is.an('array')
- .of.length(1)
- .that.deep.equals([[728, 90]]);
-
- // kbConf object
- let kbConf = requestData.kbConf;
- expect(kbConf.hdbdid).to.equal(bids[0].hbid);
- expect(kbConf.hdbdid).to.equal(bids[1].hbid);
- expect(kbConf.encode_bid).to.be.undefined;
- // kbConf timezone and cb
- expect(kbConf.cb).not.to.be.undefined;
- expect(kbConf.ts_as).to.be.above(startTime - 1);
- expect(kbConf.tz).to.equal(new Date().getTimezoneOffset());
- // kbConf bid ids
- expect(kbConf.hb_placement_bidids)
- .to.have.property(bids[0].placementid)
- .that.equal(bids[0].uuid);
- expect(kbConf.hb_placement_bidids)
- .to.have.property(bids[1].placementid)
- .that.equal(bids[1].uuid);
- // kbConf floor price
- expect(kbConf.hb_floors).not.to.have.property(bids[0].placementid)
- expect(kbConf.hb_floors).to.have.property(bids[1].placementid).that.equal(bids[1].floorprice);
- // kbConf placement ids
- expect(kbConf.hb_placements).to.have.lengthOf(2);
- expect(kbConf.hb_placements[0]).to.equal(bids[0].placementid);
- expect(kbConf.hb_placements[1]).to.equal(bids[1].placementid);
- });
-
- it('Verify imonomyAdapter build response', function () {
- const request = spec.buildRequests(bidsRequest);
- const bids = spec.interpretResponse(bidsResponse, request);
-
- // 'server' return single bid
- expect(bids).to.have.lengthOf(1);
-
- // verify bid object
- const bid = bids[0];
- const responseBids = bidsResponse.body.bids;
-
- expect(bid.cpm).to.equal(responseBids[0].cpm);
- expect(bid.ad).to.equal(responseBids[0].creative);
- expect(bid.requestId).equal(responseBids[0].uuid);
- expect(bid.uuid).equal(responseBids[0].uuid);
- expect(bid.width).to.equal(responseBids[0].width);
- expect(bid.height).to.equal(responseBids[0].height);
- expect(bid.ttl).to.equal(responseBids[0].ttl);
- expect(bid.currency).to.equal('USD');
- expect(bid.netRevenue).to.equal(true);
- expect(bid.creativeId).to.equal(responseBids[0].creativeId);
- });
-
- it('Verifies imonomyAdapter sync options', function () {
- // user sync disabled
- expect(spec.getUserSyncs({})).to.be.undefined;
- expect(spec.getUserSyncs({ iframeEnabled: false })).to.be.undefined;
- // user sync enabled
- const options = spec.getUserSyncs({ iframeEnabled: true });
- expect(options).to.not.be.undefined;
- expect(options).to.have.lengthOf(1);
- expect(options[0].type).to.equal('iframe');
- expect(options[0].url).to.equal('https://b.imonomy.com/UserMatching/b/');
- });
-});
diff --git a/test/spec/modules/impactifyBidAdapter_spec.js b/test/spec/modules/impactifyBidAdapter_spec.js
index d14cea8cad3..8bc02d9afce 100644
--- a/test/spec/modules/impactifyBidAdapter_spec.js
+++ b/test/spec/modules/impactifyBidAdapter_spec.js
@@ -171,14 +171,14 @@ describe('ImpactifyAdapter', function () {
price: 3.40,
adm: '',
adid: '97517771',
- adomain: [
- ''
- ],
iurl: 'https://fra1-ib.adnxs.com/cr?id=97517771',
cid: '9325',
crid: '97517771',
w: 1,
h: 1,
+ hash: 'test',
+ expiry: 166192938,
+ meta: {'advertiserDomains': ['testdomain.com']},
ext: {
prebid: {
'type': 'video'
@@ -254,6 +254,7 @@ describe('ImpactifyAdapter', function () {
height: 1,
hash: 'test',
expiry: 166192938,
+ meta: {'advertiserDomains': ['testdomain.com']},
ttl: 300,
creativeId: '97517771'
}
@@ -308,14 +309,14 @@ describe('ImpactifyAdapter', function () {
price: 3.40,
adm: '',
adid: '97517771',
- adomain: [
- ''
- ],
iurl: 'https://fra1-ib.adnxs.com/cr?id=97517771',
cid: '9325',
crid: '97517771',
w: 1,
h: 1,
+ hash: 'test',
+ expiry: 166192938,
+ meta: {'advertiserDomains': ['testdomain.com']},
ext: {
prebid: {
'type': 'video'
diff --git a/test/spec/modules/improvedigitalBidAdapter_spec.js b/test/spec/modules/improvedigitalBidAdapter_spec.js
index f34a75ef8f3..095e50f0c66 100644
--- a/test/spec/modules/improvedigitalBidAdapter_spec.js
+++ b/test/spec/modules/improvedigitalBidAdapter_spec.js
@@ -263,6 +263,14 @@ describe('Improve Digital Adapter Tests', function () {
params = JSON.parse(decodeURIComponent(request.data.substring(PARAM_PREFIX.length)));
expect(params.bid_request.imp[0].bidfloor).to.equal(0.05);
expect(params.bid_request.imp[0].bidfloorcur).to.equal('EUR');
+
+ // getFloor defined -> use it over bidFloor
+ let getFloorResponse = { currency: 'USD', floor: 3 };
+ bidRequest.getFloor = () => getFloorResponse;
+ request = spec.buildRequests([bidRequest])[0];
+ params = JSON.parse(decodeURIComponent(request.data.substring(PARAM_PREFIX.length)));
+ expect(params.bid_request.imp[0].bidfloor).to.equal(3);
+ expect(params.bid_request.imp[0].bidfloorcur).to.equal('USD');
});
it('should add GDPR consent string', function () {
@@ -953,6 +961,14 @@ describe('Improve Digital Adapter Tests', function () {
expect(bids[0].netRevenue).to.equal(true);
});
+ it('should set advertiserDomains', function () {
+ const adomain = ['domain.com'];
+ const response = JSON.parse(JSON.stringify(serverResponse));
+ response.body.bid[0].adomain = adomain;
+ const bids = spec.interpretResponse(response, {bidderRequest});
+ expect(bids[0].meta.advertiserDomains).to.equal(adomain);
+ });
+
// Native ads
it('should return a well-formed native ad bid', function () {
let bids = spec.interpretResponse(serverResponseNative, {bidderRequest});
diff --git a/test/spec/modules/innityBidAdapter_spec.js b/test/spec/modules/innityBidAdapter_spec.js
index 80c00252632..d4a28ec2100 100644
--- a/test/spec/modules/innityBidAdapter_spec.js
+++ b/test/spec/modules/innityBidAdapter_spec.js
@@ -37,9 +37,9 @@ describe('innityAdapterTest', () => {
'auctionId': '18fd8b8b0bd757'
}];
- const bidderRequest = {
+ let bidderRequest = {
refererInfo: {
- referer: 'https://example.com'
+ referer: 'https://refererExample.com'
}
};
@@ -50,14 +50,21 @@ describe('innityAdapterTest', () => {
});
});
- it('bidRequest data', () => {
+ it('bidRequest with complete data', () => {
const requests = spec.buildRequests(bidRequests, bidderRequest);
expect(requests[0].data.pub).to.equal(267);
expect(requests[0].data.zone).to.equal(62546);
expect(requests[0].data.width).to.equal('300');
expect(requests[0].data.height).to.equal('250');
+ expect(requests[0].data.url).to.equal(encodeURIComponent('https://refererExample.com'));
expect(requests[0].data.callback_uid).to.equal('51ef8751f9aead');
});
+
+ it('bidRequest without referer URL', () => {
+ delete bidderRequest.refererInfo;
+ const requests = spec.buildRequests(bidRequests, bidderRequest);
+ expect(requests[0].data.url).to.equal('');
+ });
});
describe('interpretResponse', () => {
@@ -74,12 +81,14 @@ describe('innityAdapterTest', () => {
'height': '250',
'callback': 'json',
'callback_uid': '51ef8751f9aead',
- 'url': 'https://example.com',
+ 'url': 'https://refererExample.com',
'cb': '',
}
};
- const bidResponse = {
+ let advDomains = ['advertiserExample.com'];
+
+ let bidResponse = {
body: {
'cpm': 100,
'width': '300',
@@ -87,6 +96,7 @@ describe('innityAdapterTest', () => {
'creative_id': '148186',
'callback_uid': '51ef8751f9aead',
'tag': '',
+ 'adomain': advDomains,
},
headers: {}
};
@@ -101,6 +111,14 @@ describe('innityAdapterTest', () => {
expect(result[0].currency).to.equal('USD');
expect(result[0].ttl).to.equal(60);
expect(result[0].ad).to.equal('');
+ expect(result[0].meta.advertiserDomains).to.equal(advDomains);
+ });
+
+ it('result with no advertiser domain', () => {
+ bidResponse.body.adomain = [];
+ const result = spec.interpretResponse(bidResponse, bidRequest);
+ expect(result[0].meta.advertiserDomains.length).to.equal(0);
+ expect(result[0].meta.advertiserDomains).to.deep.equal([]);
});
});
});
diff --git a/test/spec/modules/inskinBidAdapter_spec.js b/test/spec/modules/inskinBidAdapter_spec.js
index cedaff2a0cf..151cbce7692 100644
--- a/test/spec/modules/inskinBidAdapter_spec.js
+++ b/test/spec/modules/inskinBidAdapter_spec.js
@@ -328,6 +328,7 @@ describe('InSkin BidAdapter', function () {
expect(b).to.have.property('currency', 'USD');
expect(b).to.have.property('creativeId');
expect(b).to.have.property('ttl', 360);
+ expect(b.meta).to.have.property('advertiserDomains');
expect(b).to.have.property('netRevenue', true);
});
});
diff --git a/test/spec/modules/intentIqIdSystem_spec.js b/test/spec/modules/intentIqIdSystem_spec.js
index 7e819195b9f..8ea30a6ba92 100644
--- a/test/spec/modules/intentIqIdSystem_spec.js
+++ b/test/spec/modules/intentIqIdSystem_spec.js
@@ -55,10 +55,10 @@ describe('IntentIQ tests', function () {
expect(callBackSpy.calledOnce).to.be.true;
});
- it('should ignore NA and invalid responses in decode', function () {
+ it('should ignore INVALID_ID and invalid responses in decode', function () {
// let resp = JSON.stringify({'RESULT': 'NA'});
// expect(intentIqIdSubmodule.decode(resp)).to.equal(undefined);
- expect(intentIqIdSubmodule.decode('NA')).to.equal(undefined);
+ expect(intentIqIdSubmodule.decode('INVALID_ID')).to.equal(undefined);
expect(intentIqIdSubmodule.decode('')).to.equal(undefined);
expect(intentIqIdSubmodule.decode(undefined)).to.equal(undefined);
});
@@ -134,37 +134,37 @@ describe('IntentIQ tests', function () {
expect(callBackSpy.calledOnce).to.be.true;
});
- it('should ignore {RESULT: NA} in get id', function () {
+ it('save result if ls=true', function () {
let callBackSpy = sinon.spy();
- let submoduleCallback = intentIqIdSubmodule.getId(defaultConfigParams).callback;
+ let submoduleCallback = intentIqIdSubmodule.getId(allConfigParams).callback;
submoduleCallback(callBackSpy);
let request = server.requests[0];
- expect(request.url).to.contain('https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=10&pt=17&dpn=1&iiqidtype=2&iiqpcid=');
+ expect(request.url).to.contain('https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=10&pt=17&dpn=1&pcid=12&pai=11&iiqidtype=2&iiqpcid=');
request.respond(
200,
responseHeader,
- JSON.stringify({RESULT: 'NA'})
+ JSON.stringify({pid: 'test_pid', data: 'test_personid', ls: true})
);
expect(callBackSpy.calledOnce).to.be.true;
- expect(callBackSpy.args[0][0]).to.be.undefined;
+ expect(callBackSpy.args[0][0]).to.be.eq('test_personid');
});
- it('should ignore NA in get id', function () {
+ it('dont save result if ls=false', function () {
let callBackSpy = sinon.spy();
- let submoduleCallback = intentIqIdSubmodule.getId(defaultConfigParams).callback;
+ let submoduleCallback = intentIqIdSubmodule.getId(allConfigParams).callback;
submoduleCallback(callBackSpy);
let request = server.requests[0];
- expect(request.url).to.contain('https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=10&pt=17&dpn=1&iiqidtype=2&iiqpcid=');
+ expect(request.url).to.contain('https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=10&pt=17&dpn=1&pcid=12&pai=11&iiqidtype=2&iiqpcid=');
request.respond(
200,
responseHeader,
- 'NA'
+ JSON.stringify({pid: 'test_pid', data: 'test_personid', ls: false})
);
expect(callBackSpy.calledOnce).to.be.true;
expect(callBackSpy.args[0][0]).to.be.undefined;
});
- it('should parse result from json response', function () {
+ it('save result as INVALID_ID on empty data and ls=true ', function () {
let callBackSpy = sinon.spy();
let submoduleCallback = intentIqIdSubmodule.getId(allConfigParams).callback;
submoduleCallback(callBackSpy);
@@ -173,9 +173,9 @@ describe('IntentIQ tests', function () {
request.respond(
200,
responseHeader,
- JSON.stringify({pid: 'test_pid', data: 'test_personid'})
+ JSON.stringify({pid: 'test_pid', data: '', ls: true})
);
expect(callBackSpy.calledOnce).to.be.true;
- expect(callBackSpy.args[0][0]).to.be.eq('test_personid');
+ expect(callBackSpy.args[0][0]).to.be.eq('INVALID_ID');
});
});
diff --git a/test/spec/modules/invamiaBidAdapter_spec.js b/test/spec/modules/invamiaBidAdapter_spec.js
new file mode 100644
index 00000000000..2f8f0612e44
--- /dev/null
+++ b/test/spec/modules/invamiaBidAdapter_spec.js
@@ -0,0 +1,172 @@
+import {expect} from 'chai';
+import {spec} from 'modules/invamiaBidAdapter.js';
+
+describe('invamia bid adapter tests', function () {
+ describe('bid requests', function () {
+ it('should accept valid bid', function () {
+ const validBid = {
+ bidder: 'invamia',
+ params: {zoneId: 123},
+ };
+
+ expect(spec.isBidRequestValid(validBid)).to.equal(true);
+ });
+
+ it('should reject invalid bid', function () {
+ const invalidBid = {
+ bidder: 'invamia',
+ params: {},
+ };
+
+ expect(spec.isBidRequestValid(invalidBid)).to.equal(false);
+ });
+
+ it('should correctly build payload string', function () {
+ const bidRequests = [{
+ bidder: 'invamia',
+ params: {zoneId: 123},
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ },
+ },
+ bidId: '23acc48ad47af5',
+ auctionId: '0fb4905b-9456-4152-86be-c6f6d259ba99',
+ bidderRequestId: '1c56ad30b9b8ca8',
+ transactionId: '92489f71-1bf2-49a0-adf9-000cea934729',
+ }];
+ const payload = spec.buildRequests(bidRequests)[0].data;
+
+ expect(payload).to.contain('ctype=div');
+ expect(payload).to.contain('pzoneid=123');
+ expect(payload).to.contain('width=300');
+ expect(payload).to.contain('height=250');
+ });
+
+ it('should support multiple bids', function () {
+ const bidRequests = [{
+ bidder: 'invamia',
+ params: {zoneId: 123},
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]],
+ },
+ },
+ bidId: '23acc48ad47af5',
+ auctionId: '0fb4905b-9456-4152-86be-c6f6d259ba99',
+ bidderRequestId: '1c56ad30b9b8ca8',
+ transactionId: '92489f71-1bf2-49a0-adf9-000cea934729',
+ }, {
+ bidder: 'invamia',
+ params: {zoneId: 321},
+ mediaTypes: {
+ banner: {
+ sizes: [[728, 90]],
+ },
+ },
+ bidId: '23acc48ad47af52',
+ auctionId: '0fb4905b-9456-4152-86be-c6f6d259ba992',
+ bidderRequestId: '1c56ad30b9b8ca82',
+ transactionId: '92489f71-1bf2-49a0-adf9-000cea9347292',
+ }];
+ const payload = spec.buildRequests(bidRequests);
+
+ expect(payload).to.be.lengthOf(2);
+ });
+
+ it('should support multiple sizes', function () {
+ const bidRequests = [{
+ bidder: 'invamia',
+ params: {zoneId: 123},
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250], [300, 600]],
+ },
+ },
+ bidId: '23acc48ad47af5',
+ auctionId: '0fb4905b-9456-4152-86be-c6f6d259ba99',
+ bidderRequestId: '1c56ad30b9b8ca8',
+ transactionId: '92489f71-1bf2-49a0-adf9-000cea934729',
+ }];
+ const payload = spec.buildRequests(bidRequests);
+
+ expect(payload).to.be.lengthOf(2);
+ });
+ });
+
+ describe('bid responses', function () {
+ it('should return complete bid response', function () {
+ const serverResponse = {
+ body: {
+ banner: {
+ hash: '1c56ad30b9b8ca8',
+ },
+ hb: {
+ cpm: 0.5,
+ netRevenue: false,
+ adomains: ['securepubads.g.doubleclick.net'],
+ },
+ template: {
+ html: ' ',
+ },
+ },
+ };
+ const bidderRequest = {
+ bidId: '23acc48ad47af5',
+ params: {
+ requestedSizes: [300, 250],
+ },
+ };
+
+ const bids = spec.interpretResponse(serverResponse, {bidderRequest});
+
+ expect(bids).to.be.lengthOf(1);
+ expect(bids[0].requestId).to.equal('23acc48ad47af5');
+ expect(bids[0].creativeId).to.equal('1c56ad30b9b8ca8');
+ expect(bids[0].width).to.equal(300);
+ expect(bids[0].height).to.equal(250);
+ expect(bids[0].ttl).to.equal(600);
+ expect(bids[0].cpm).to.equal(0.5);
+ expect(bids[0].netRevenue).to.equal(false);
+ expect(bids[0].currency).to.equal('USD');
+ expect(bids[0].meta.advertiserDomains).to.be.lengthOf(1);
+ expect(bids[0].meta.advertiserDomains[0]).to.equal('securepubads.g.doubleclick.net');
+ });
+
+ it('should return empty bid response', function () {
+ const serverResponse = {
+ body: {},
+ };
+ const bidderRequest = {
+ bidId: '23acc48ad47af5',
+ params: {
+ requestedSizes: [300, 250],
+ },
+ };
+
+ const bids = spec.interpretResponse(serverResponse, {bidderRequest});
+
+ expect(bids).to.be.lengthOf(0);
+ });
+
+ it('should return empty bid response 2', function () {
+ const serverResponse = {
+ body: {
+ template: {
+ html: '',
+ }
+ },
+ };
+ const bidderRequest = {
+ bidId: '23acc48ad47af5',
+ params: {
+ requestedSizes: [300, 250],
+ },
+ };
+
+ const bids = spec.interpretResponse(serverResponse, {bidderRequest});
+
+ expect(bids).to.be.lengthOf(0);
+ });
+ });
+});
diff --git a/test/spec/modules/ipromBidAdapter_spec.js b/test/spec/modules/ipromBidAdapter_spec.js
deleted file mode 100644
index 535cc332b21..00000000000
--- a/test/spec/modules/ipromBidAdapter_spec.js
+++ /dev/null
@@ -1,193 +0,0 @@
-import {expect} from 'chai';
-import {spec} from 'modules/ipromBidAdapter.js';
-
-describe('iPROM Adapter', function () {
- let bidRequests;
- let bidderRequest;
-
- beforeEach(function () {
- bidRequests = [
- {
- bidder: 'iprom',
- params: {
- id: '1234',
- dimension: '300x250',
- },
- adUnitCode: '/19966331/header-bid-tag-1',
- mediaTypes: {
- banner: {
- sizes: [[300, 250], [300, 600]],
- }
- },
- bidId: '29a72b151f7bd3',
- auctionId: 'e36abb27-g3b1-1ad6-8a4c-701c8919d3hh',
- bidderRequestId: '2z76da40m1b3cb8',
- transactionId: 'j51lhf58-1ad6-g3b1-3j6s-912c9493g0gu'
- }
- ];
-
- bidderRequest = {
- timeout: 3000,
- refererInfo: {
- referer: 'https://adserver.si/index.html',
- reachedTop: true,
- numIframes: 1,
- stack: [
- 'https://adserver.si/index.html',
- 'https://adserver.si/iframe1.html',
- ]
- }
- }
- });
-
- describe('validating bids', function () {
- it('should accept valid bid', function () {
- let validBid = {
- bidder: 'iprom',
- params: {
- id: '1234',
- dimension: '300x250',
- },
- };
-
- const isValid = spec.isBidRequestValid(validBid);
-
- expect(isValid).to.equal(true);
- });
-
- it('should reject bid if missing dimension and id', function () {
- let invalidBid = {
- bidder: 'iprom',
- params: {}
- };
-
- const isValid = spec.isBidRequestValid(invalidBid);
-
- expect(isValid).to.equal(false);
- });
-
- it('should reject bid if missing dimension', function () {
- let invalidBid = {
- bidder: 'iprom',
- params: {
- id: '1234',
- }
- };
-
- const isValid = spec.isBidRequestValid(invalidBid);
-
- expect(isValid).to.equal(false);
- });
-
- it('should reject bid if dimension is not a string', function () {
- let invalidBid = {
- bidder: 'iprom',
- params: {
- id: '1234',
- dimension: 404,
- }
- };
-
- const isValid = spec.isBidRequestValid(invalidBid);
-
- expect(isValid).to.equal(false);
- });
-
- it('should reject bid if missing id', function () {
- let invalidBid = {
- bidder: 'iprom',
- params: {
- dimension: '300x250',
- }
- };
-
- const isValid = spec.isBidRequestValid(invalidBid);
-
- expect(isValid).to.equal(false);
- });
-
- it('should reject bid if id is not a string', function () {
- let invalidBid = {
- bidder: 'iprom',
- params: {
- id: 1234,
- dimension: '300x250',
- }
- };
-
- const isValid = spec.isBidRequestValid(invalidBid);
-
- expect(isValid).to.equal(false);
- });
- });
-
- describe('building requests', function () {
- it('should go to correct endpoint', function () {
- const request = spec.buildRequests(bidRequests, bidderRequest);
-
- expect(request.method).to.exist;
- expect(request.method).to.equal('POST');
- expect(request.url).to.exist;
- expect(request.url).to.equal('https://core.iprom.net/programmatic');
- });
-
- it('should add referer info', function () {
- const request = spec.buildRequests(bidRequests, bidderRequest);
- const requestparse = JSON.parse(request.data);
-
- expect(requestparse.referer).to.exist;
- expect(requestparse.referer.referer).to.equal('https://adserver.si/index.html');
- });
-
- it('should add adapter version', function () {
- const request = spec.buildRequests(bidRequests, bidderRequest);
- const requestparse = JSON.parse(request.data);
-
- expect(requestparse.version).to.exist;
- });
-
- it('should contain id and dimension', function () {
- const request = spec.buildRequests(bidRequests, bidderRequest);
- const requestparse = JSON.parse(request.data);
-
- expect(requestparse.bids[0].params.id).to.equal('1234');
- expect(requestparse.bids[0].params.dimension).to.equal('300x250');
- });
- });
-
- describe('handling responses', function () {
- it('should return complete bid response', function () {
- const serverResponse = {
- body: [{
- requestId: '29a72b151f7bd3',
- cpm: 0.5,
- width: '300',
- height: '250',
- creativeId: 1234,
- ad: 'Iprom Header bidding example '
- }
- ]};
-
- const request = spec.buildRequests(bidRequests, bidderRequest);
- const bids = spec.interpretResponse(serverResponse, request);
-
- expect(bids).to.be.lengthOf(1);
- expect(bids[0].requestId).to.equal('29a72b151f7bd3');
- expect(bids[0].cpm).to.equal(0.5);
- expect(bids[0].width).to.equal('300');
- expect(bids[0].height).to.equal('250');
- expect(bids[0].ad).to.have.length.above(1);
- });
-
- it('should return empty bid response', function () {
- const emptyServerResponse = {
- body: []
- };
-
- const request = spec.buildRequests(bidRequests, bidderRequest);
- const bids = spec.interpretResponse(emptyServerResponse, request);
-
- expect(bids).to.be.lengthOf(0);
- });
- });
-});
diff --git a/test/spec/modules/iqmBidAdapter_spec.js b/test/spec/modules/iqmBidAdapter_spec.js
new file mode 100644
index 00000000000..27693937330
--- /dev/null
+++ b/test/spec/modules/iqmBidAdapter_spec.js
@@ -0,0 +1,227 @@
+import { expect } from 'chai';
+import { newBidder } from 'src/adapters/bidderFactory.js';
+import * as bidderFactory from 'src/adapters/bidderFactory.js';
+import {spec} from 'modules/iqmBidAdapter';
+
+const ENDPOINT = 'https://pbd.bids.iqm.com';
+
+describe('iqmAdapter', 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: 'iqm',
+ params: {
+ publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a',
+ placementId: 23451,
+ bidfloor: 0.50
+ },
+
+ 'adUnitCode': 'adunit-code',
+ 'sizes': [[300, 250]],
+ 'bidId': '30b31c1838de1e',
+ 'bidderRequestId': '22edbae2733bf6',
+ 'auctionId': '1d1a030790a475',
+ };
+
+ it('should return false when no bid', function () {
+ expect(spec.isBidRequestValid()).to.equal(false);
+ });
+
+ it('should return true when required params found', function () {
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
+ });
+ it('should return false when it is video and mimes and protcol are not present', function () {
+ const bid = {
+ adUnitCode: 'div-gpt-ad-1460505748561-0',
+ auctionId: 'a0aca162-e3d0-44db-a465-5c96a64fa5fb',
+ bidId: '2cbdc9b506be33',
+ bidRequestsCount: 1,
+ bidder: 'iqm',
+ bidderRequestId: '185c3a4c7f88ec',
+ bidderRequestsCount: 1,
+ bidderWinsCount: 0,
+ crumbs: {pubcid: 'f56a553d-370d-4cea-b31a-7214a3d8f8e1'},
+ mediaTypes: {
+ video: {
+ context: 'instream',
+ playerSize: [
+ [
+ 640,
+ 480
+ ]
+ ]
+ }
+ },
+ params: {
+ publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a',
+ placementId: 23451,
+ geo: {
+ country: 'USA'
+ },
+
+ bidfloor: 0.50,
+ video: {
+ placement: 2,
+ mimes: null,
+ protocols: null,
+ skipppable: true,
+ playback_method: ['auto_play_sound_off']
+ }
+ },
+ src: 'client',
+ transactionId: 'a57d06fd-cc6d-4a90-87af-c10727998f0b' };
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
+ it('should return false when required params are not found', function () {
+ let bid = Object.assign({}, bid);
+ delete bid.params;
+ bid.params = {
+ placementId: 0,
+ publisherId: null
+
+ };
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
+ });
+
+ describe('buildRequests', function () {
+ let validBidRequests = [
+ {bidder: 'iqm',
+ params: {
+ publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a',
+ placementId: 23451,
+ bidfloor: 0.5},
+ crumbs: {
+ pubcid: 'a0f51f64-6d86-41d0-abaf-7ece71404d94'},
+ fpd: {'context': {'pbAdSlot': '/19968336/header-bid-tag-0'}},
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]}},
+ adUnitCode: '/19968336/header-bid-tag-0',
+ transactionId: '56fe8d92-ff6e-4c34-90ad-2f743cd0eae8',
+ sizes: [[300, 250]],
+ bidId: '266d810da21904',
+ bidderRequestId: '13c05d264c7ffe',
+ auctionId: '565ab569-ab95-40d6-8b42-b9707a92062f',
+ src: 'client',
+ bidRequestsCount: 1,
+ bidderRequestsCount: 1,
+ bidderWinsCount: 0}];
+
+ let bidderRequest = {bidderCode: 'iqm', auctionId: '565ab569-ab95-40d6-8b42-b9707a92062f', bidderRequestId: '13c05d264c7ffe', bids: [{bidder: 'iqm', params: {publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a', placementId: 23451, bidfloor: 0.5}, crumbs: {pubcid: 'a0f51f64-6d86-41d0-abaf-7ece71404d94'}, fpd: {context: {pbAdSlot: '/19968336/header-bid-tag-0'}}, mediaTypes: {banner: {sizes: [[300, 250]]}}, adUnitCode: '/19968336/header-bid-tag-0', transactionId: '56fe8d92-ff6e-4c34-90ad-2f743cd0eae8', sizes: [[300, 250]], bidId: '266d810da21904', bidderRequestId: '13c05d264c7ffe', auctionId: '565ab569-ab95-40d6-8b42-b9707a92062f', src: 'client', bidRequestsCount: 1, bidderRequestsCount: 1, bidderWinsCount: 0}], auctionStart: 1615205942159, timeout: 7000, refererInfo: {referer: 'http://test.localhost:9999/integrationExamples/gpt/hello_world.html', reachedTop: true, isAmp: false, numIframes: 0, stack: ['http://test.localhost:9999/integrationExamples/gpt/hello_world.html'], canonicalUrl: null}, start: 1615205942162};
+
+ it('should parse out sizes', function () {
+ let temp = [];
+ const request = spec.buildRequests(validBidRequests, bidderRequest);
+ const payload = request[0].data;
+
+ expect(payload.sizes).to.exist;
+ expect(payload.sizes[0]).to.deep.equal([300, 250]);
+ });
+
+ it('should populate the ad_types array on all requests', function () {
+ // const bidRequest = Object.assign({}, bidRequests[0]);
+
+ const request = spec.buildRequests(validBidRequests, bidderRequest);
+ const payload = request[0].data;
+
+ expect(payload.imp.mediatype).to.deep.equal('banner');
+ });
+ it('sends bid request to ENDPOINT via POST', function () {
+ const request = spec.buildRequests(validBidRequests, bidderRequest);
+ expect(request[0].url).to.equal(ENDPOINT);
+ expect(request[0].method).to.equal('POST');
+ });
+ it('should attach valid video params to the tag', function () {
+ let validBidRequests_video = [{bidder: 'iqm', params: {publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a', placementId: 23451, bidfloor: 0.5, video: {placement: 2, mimes: ['video/mp4'], protocols: [2, 5], skipppable: true, playback_method: ['auto_play_sound_off']}}, crumbs: {pubcid: '09b8f065-9d1b-4a36-bd0c-ea22e2dad807'}, fpd: {context: {pbAdSlot: 'video1'}}, mediaTypes: {video: {playerSize: [[640, 480]], context: 'instream'}}, adUnitCode: 'video1', transactionId: '86795c66-acf9-4dd5-998f-6d5362aaa541', sizes: [[640, 480]], bidId: '28bfb7e2d12897', bidderRequestId: '16e1ce8481bc6d', auctionId: '3140a2ec-d567-4db0-9bbb-eb6fa20ccb71', src: 'client', bidRequestsCount: 1, bidderRequestsCount: 1, bidderWinsCount: 0}];
+ let bidderRequest_video = {bidderCode: 'iqm', auctionId: '3140a2ec-d567-4db0-9bbb-eb6fa20ccb71', bidderRequestId: '16e1ce8481bc6d', bids: [{bidder: 'iqm', params: {publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a', placementId: 23451, bidfloor: 0.5, video: {placement: 2, mimes: ['video/mp4'], protocols: [2, 5], skipppable: true, playback_method: ['auto_play_sound_off']}}, crumbs: {pubcid: '09b8f065-9d1b-4a36-bd0c-ea22e2dad807'}, fpd: {context: {pbAdSlot: 'video1'}}, mediaTypes: {video: {playerSize: [[640, 480]], context: 'instream'}}, adUnitCode: 'video1', transactionId: '86795c66-acf9-4dd5-998f-6d5362aaa541', sizes: [[640, 480]], bidId: '28bfb7e2d12897', bidderRequestId: '16e1ce8481bc6d', auctionId: '3140a2ec-d567-4db0-9bbb-eb6fa20ccb71', src: 'client', bidRequestsCount: 1, bidderRequestsCount: 1, bidderWinsCount: 0}], auctionStart: 1615271191985, timeout: 3000, refererInfo: {referer: 'http://test.localhost:9999/integrationExamples/gpt/pbjs_video_adUnit.html', reachedTop: true, isAmp: false, numIframes: 0, stack: ['http://test.localhost:9999/integrationExamples/gpt/pbjs_video_adUnit.html'], canonicalUrl: null}, start: 1615271191988};
+ const request = spec.buildRequests(validBidRequests_video, bidderRequest_video);
+ const payload = request[0].data;
+ expect(payload.imp.id).to.exist;
+ expect(payload.imp.displaymanager).to.exist;
+ expect(payload.imp.displaymanagerver).to.exist;
+
+ expect(payload.imp.video).to.deep.equal({
+ context: 'instream',
+ w: 640,
+ h: 480,
+ mimes: ['video/mp4'],
+ placement: 1,
+ protocols: [2, 5],
+ startdelay: 0
+ });
+ });
+
+ it('should add referer info to payload', function () {
+ const request = spec.buildRequests(validBidRequests, bidderRequest);
+ const payload = request[0].data;
+
+ expect(payload.bidderRequest.refererInfo).to.exist;
+ expect(payload.bidderRequest.refererInfo).to.deep.equal({referer: 'http://test.localhost:9999/integrationExamples/gpt/hello_world.html', reachedTop: true, isAmp: false, numIframes: 0, stack: ['http://test.localhost:9999/integrationExamples/gpt/hello_world.html'], canonicalUrl: null});
+ });
+ })
+
+ describe('interpretResponse', function () {
+ let tempResult = {requestId: '2d9601dd8328f8', currency: 'USD', cpm: 4.5, netRevenue: true, creativeId: 'cr-121004', adUnitCode: 'div-gpt-ad-1460505748561-0', 'auctionId': '22a4f3d8-511f-46ba-91be-53b9949e4b48', mediaType: 'banner', ttl: 3000, ad: " ", width: 844, height: 617};
+ let validBidRequests_temp = [
+ {bidder: 'iqm',
+ params: {
+ publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a',
+ placementId: 23451,
+ bidfloor: 0.5},
+ crumbs: {
+ pubcid: 'a0f51f64-6d86-41d0-abaf-7ece71404d94'},
+ fpd: {'context': {'pbAdSlot': '/19968336/header-bid-tag-0'}},
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]}},
+ adUnitCode: '/19968336/header-bid-tag-0',
+ transactionId: '56fe8d92-ff6e-4c34-90ad-2f743cd0eae8',
+ sizes: [[300, 250]],
+ bidId: '266d810da21904',
+ bidderRequestId: '13c05d264c7ffe',
+ auctionId: '565ab569-ab95-40d6-8b42-b9707a92062f',
+ src: 'client',
+ bidRequestsCount: 1,
+ bidderRequestsCount: 1,
+ bidderWinsCount: 0}];
+ let bidderRequest = {bidderCode: 'iqm', auctionId: '565ab569-ab95-40d6-8b42-b9707a92062f', bidderRequestId: '13c05d264c7ffe', bids: [{bidder: 'iqm', params: {publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a', placementId: 23451, bidfloor: 0.5}, crumbs: {pubcid: 'a0f51f64-6d86-41d0-abaf-7ece71404d94'}, fpd: {context: {pbAdSlot: '/19968336/header-bid-tag-0'}}, mediaTypes: {banner: {sizes: [[300, 250]]}}, adUnitCode: '/19968336/header-bid-tag-0', transactionId: '56fe8d92-ff6e-4c34-90ad-2f743cd0eae8', sizes: [[300, 250]], bidId: '266d810da21904', bidderRequestId: '13c05d264c7ffe', auctionId: '565ab569-ab95-40d6-8b42-b9707a92062f', src: 'client', bidRequestsCount: 1, bidderRequestsCount: 1, bidderWinsCount: 0}], auctionStart: 1615205942159, timeout: 7000, refererInfo: {referer: 'http://test.localhost:9999/integrationExamples/gpt/hello_world.html', reachedTop: true, isAmp: false, numIframes: 0, stack: ['http://test.localhost:9999/integrationExamples/gpt/hello_world.html'], canonicalUrl: null}, start: 1615205942162};
+ let response = {
+
+ id: '5bdbab92aae961cfbdf7465d',
+ seatbid: [{bid: [{id: 'bid-5bdbab92aae961cfbdf7465d-5bdbab92aae961cfbdf74653', impid: '5bdbab92aae961cfbdf74653', price: 9.9, nurl: 'https://winn.stage.iqm.com/smaato?raw=w9XViV4dovBHrxujHhBj-l-uWB08CUOMW_oR-EUxZbaWLL0ENzcMlP3CJFEURN6FgRp_HdjAjxTYHR7uG4S6h6dl_vjU_YNABiPd607-iTqxOCl-2cKLo-hhQus4sMw01VIqyqrPmzOTHTwJm4vTjUIoWMPZbARgQvUnBzjRH9xeYS-Bv3kgAW9NSBfgBZeLyT3WJJ_3VKIE_Iurt8OjpA%3D%3D&req_id=5bdbab92aae961cfbdf7465d&ap=${AUCTION_PRICE}', adm: " ", adomain: ['click.iqm.com'], iurl: 'https://d3jme5si7t6llb.cloudfront.net/image/1/404/owVo6mc_1588902031079.png', cid: '169218', crid: 'cr-301435', attr: [], h: 250, w: 250}]}],
+ bidid: '5bdbab92aae961cfbdf7465d'
+ };
+
+ it('should get correct bid response', function () {
+ let expectedResponse = [
+ {requestId: '49ad5f21156efd', currency: 'USD', cpm: 9.9, netRevenue: true, creativeId: 'cr-301435', adUnitCode: '/19968336/header-bid-tag-0', auctionId: '853cddf1-8d13-4482-bd88-f5ef927d5ab3', mediaType: 'banner', ttl: 3000, ad: " ", width: 250, height: 250}
+ ];
+ let temprequest = spec.buildRequests(validBidRequests_temp, bidderRequest);
+
+ let result = spec.interpretResponse({ body: response }, temprequest[0]);
+ expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
+ });
+
+ let validBidRequests_temp_video =
+ [{bidder: 'iqm', params: {publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a', placementId: 23451, bidfloor: 0.5, video: {placement: 2, mimes: ['video/mp4'], protocols: [2, 5], skipppable: true, playback_method: ['auto_play_sound_off']}}, crumbs: {pubcid: 'cd86c3ff-d630-40e6-83ab-420e9e800594'}, fpd: {context: {pbAdSlot: 'video1'}}, mediaTypes: {video: {playerSize: [[640, 480]], context: 'instream'}}, adUnitCode: 'video1', transactionId: '8335b266-7a41-45f9-86a2-92fdc7cf0cd9', sizes: [[640, 480]], bidId: '26274beff25455', bidderRequestId: '17c5d8c3168761', auctionId: '2c592dcf-7dfc-4823-8203-dd1ebab77fe0', src: 'client', bidRequestsCount: 1, bidderRequestsCount: 1, bidderWinsCount: 0}];
+ let bidderRequest_video = {bidderCode: 'iqm', auctionId: '3140a2ec-d567-4db0-9bbb-eb6fa20ccb71', bidderRequestId: '16e1ce8481bc6d', bids: [{bidder: 'iqm', params: {publisherId: 'df5fd732-c5f3-11e7-abc4-cec278b6b50a', placementId: 23451, bidfloor: 0.5, video: {placement: 2, mimes: ['video/mp4'], protocols: [2, 5], skipppable: true, playback_method: ['auto_play_sound_off']}}, crumbs: {pubcid: '09b8f065-9d1b-4a36-bd0c-ea22e2dad807'}, fpd: {context: {pbAdSlot: 'video1'}}, mediaTypes: {video: {playerSize: [[640, 480]], context: 'instream'}}, adUnitCode: 'video1', transactionId: '86795c66-acf9-4dd5-998f-6d5362aaa541', sizes: [[640, 480]], bidId: '28bfb7e2d12897', bidderRequestId: '16e1ce8481bc6d', auctionId: '3140a2ec-d567-4db0-9bbb-eb6fa20ccb71', src: 'client', bidRequestsCount: 1, bidderRequestsCount: 1, bidderWinsCount: 0}], auctionStart: 1615271191985, timeout: 3000, refererInfo: {referer: 'http://test.localhost:9999/integrationExamples/gpt/pbjs_video_adUnit.html', reachedTop: true, isAmp: false, numIframes: 0, stack: ['http://test.localhost:9999/integrationExamples/gpt/pbjs_video_adUnit.html'], canonicalUrl: null}, start: 1615271191988};
+
+ it('handles non-banner media responses', function () {
+ let response = {id: '2341234', seatbid: [{bid: [{id: 'bid-2341234-1', impid: '1', price: 9, nurl: 'https://frontend.stage.iqm.com/static/vast-01.xml', adm: 'http://cdn.iqm.com/pbd?raw=312730_203cf73dc83fb_2824348636878_pbd', adomain: ['app1.stage.iqm.com'], cid: '168900', crid: 'cr-304503', attr: []}]}], bidid: '2341234'};
+
+ let temprequest_video = spec.buildRequests(validBidRequests_temp_video, bidderRequest_video);
+
+ let result = spec.interpretResponse({ body: response }, temprequest_video[0]);
+ expect(result[0]).to.have.property('vastUrl');
+ });
+ });
+});
diff --git a/test/spec/modules/ironsourceBidAdapter_spec.js b/test/spec/modules/ironsourceBidAdapter_spec.js
deleted file mode 100644
index cca928ff28b..00000000000
--- a/test/spec/modules/ironsourceBidAdapter_spec.js
+++ /dev/null
@@ -1,381 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/ironsourceBidAdapter.js';
-import { newBidder } from 'src/adapters/bidderFactory.js';
-import { config } from 'src/config.js';
-import { VIDEO } from '../../../src/mediaTypes.js';
-
-const ENDPOINT = 'https://hb.yellowblue.io/hb';
-const TEST_ENDPOINT = 'https://hb.yellowblue.io/hb-test';
-const TTL = 360;
-
-describe('ironsourceAdapter', 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 () {
- const bid = {
- 'bidder': spec.code,
- 'adUnitCode': 'adunit-code',
- 'sizes': [['640', '480']],
- 'params': {
- 'isOrg': 'jdye8weeyirk00000001'
- }
- };
-
- it('should return true when required params are passed', function () {
- expect(spec.isBidRequestValid(bid)).to.equal(true);
- });
-
- it('should return false when required params are not found', function () {
- const newBid = Object.assign({}, bid);
- delete newBid.params;
- newBid.params = {
- 'isOrg': null
- };
- expect(spec.isBidRequestValid(newBid)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- const bidRequests = [
- {
- 'bidder': spec.code,
- 'adUnitCode': 'adunit-code',
- 'sizes': [[640, 480]],
- 'params': {
- 'isOrg': 'jdye8weeyirk00000001'
- },
- 'bidId': '299ffc8cca0b87',
- 'bidderRequestId': '1144f487e563f9',
- 'auctionId': 'bfc420c3-8577-4568-9766-a8a935fb620d',
- }
- ];
-
- const testModeBidRequests = [
- {
- 'bidder': spec.code,
- 'adUnitCode': 'adunit-code',
- 'sizes': [[640, 480]],
- 'params': {
- 'isOrg': 'jdye8weeyirk00000001',
- 'testMode': true
- },
- 'bidId': '299ffc8cca0b87',
- 'bidderRequestId': '1144f487e563f9',
- 'auctionId': 'bfc420c3-8577-4568-9766-a8a935fb620d',
- }
- ];
-
- const bidderRequest = {
- bidderCode: 'ironsource',
- }
-
- const customSessionId = '12345678';
-
- it('sends bid request to ENDPOINT via GET', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.url).to.equal(ENDPOINT);
- expect(request.method).to.equal('GET');
- }
- });
-
- it('sends bid request to test ENDPOINT via GET', function () {
- const requests = spec.buildRequests(testModeBidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.url).to.equal(TEST_ENDPOINT);
- expect(request.method).to.equal('GET');
- }
- });
-
- it('should send the correct bid Id', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.data.bid_id).to.equal('299ffc8cca0b87');
- }
- });
-
- it('sends the is_wrapper query param', function () {
- bidRequests[0].params.isWrapper = true;
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.data.is_wrapper).to.equal(true);
- }
- });
-
- it('sends the custom session id as a query param', function () {
- bidRequests[0].params.sessionId = customSessionId;
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.data.session_id).to.equal(customSessionId);
- }
- });
-
- it('should send the correct width and height', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.data).to.be.an('object');
- expect(request.data).to.have.property('width', 640);
- expect(request.data).to.have.property('height', 480);
- }
- });
-
- it('should respect syncEnabled option', function() {
- config.setConfig({
- userSync: {
- syncEnabled: false,
- filterSettings: {
- all: {
- bidders: '*',
- filter: 'include'
- }
- }
- }
- });
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.data).to.be.an('object');
- expect(request.data).to.not.have.property('cs_method');
- }
- });
-
- it('should respect "iframe" filter settings', function () {
- config.setConfig({
- userSync: {
- syncEnabled: true,
- filterSettings: {
- iframe: {
- bidders: [spec.code],
- filter: 'include'
- }
- }
- }
- });
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.data).to.be.an('object');
- expect(request.data).to.have.property('cs_method', 'iframe');
- }
- });
-
- it('should respect "all" filter settings', function () {
- config.setConfig({
- userSync: {
- syncEnabled: true,
- filterSettings: {
- all: {
- bidders: [spec.code],
- filter: 'include'
- }
- }
- }
- });
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.data).to.be.an('object');
- expect(request.data).to.have.property('cs_method', 'iframe');
- }
- });
-
- it('should send the pixel user sync param if userSync is enabled and no "iframe" or "all" configs are present', function () {
- config.setConfig({
- userSync: {
- syncEnabled: true
- }
- });
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.data).to.be.an('object');
- expect(request.data).to.have.property('cs_method', 'pixel');
- }
- });
-
- it('should respect total exclusion', function() {
- config.setConfig({
- userSync: {
- syncEnabled: true,
- filterSettings: {
- image: {
- bidders: [spec.code],
- filter: 'exclude'
- },
- iframe: {
- bidders: [spec.code],
- filter: 'exclude'
- }
- }
- }
- });
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.data).to.be.an('object');
- expect(request.data).to.not.have.property('cs_method');
- }
- });
-
- it('should have us_privacy param if usPrivacy is available in the bidRequest', function () {
- const bidderRequestWithUSP = Object.assign({uspConsent: '1YNN'}, bidderRequest);
- const requests = spec.buildRequests(bidRequests, bidderRequestWithUSP);
- for (const request of requests) {
- expect(request.data).to.be.an('object');
- expect(request.data).to.have.property('us_privacy', '1YNN');
- }
- });
-
- it('should have an empty us_privacy param if usPrivacy is missing in the bidRequest', function () {
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.data).to.be.an('object');
- expect(request.data).to.not.have.property('us_privacy');
- }
- });
-
- it('should not send the gdpr param if gdprApplies is false in the bidRequest', function () {
- const bidderRequestWithGDPR = Object.assign({gdprConsent: {gdprApplies: false}}, bidderRequest);
- const requests = spec.buildRequests(bidRequests, bidderRequestWithGDPR);
- for (const request of requests) {
- expect(request.data).to.be.an('object');
- expect(request.data).to.not.have.property('gdpr');
- expect(request.data).to.not.have.property('gdpr_consent');
- }
- });
-
- it('should send the gdpr param if gdprApplies is true in the bidRequest', function () {
- const bidderRequestWithGDPR = Object.assign({gdprConsent: {gdprApplies: true, consentString: 'test-consent-string'}}, bidderRequest);
- const requests = spec.buildRequests(bidRequests, bidderRequestWithGDPR);
- for (const request of requests) {
- expect(request.data).to.be.an('object');
- expect(request.data).to.have.property('gdpr', true);
- expect(request.data).to.have.property('gdpr_consent', 'test-consent-string');
- }
- });
-
- it('should have schain param if it is available in the bidRequest', () => {
- const schain = {
- ver: '1.0',
- complete: 1,
- nodes: [{ asi: 'indirectseller.com', sid: '00001', hp: 1 }],
- };
- bidRequests[0].schain = schain;
- const requests = spec.buildRequests(bidRequests, bidderRequest);
- for (const request of requests) {
- expect(request.data).to.be.an('object');
- expect(request.data).to.have.property('schain', '1.0,1!indirectseller.com,00001,,,,');
- }
- });
- });
-
- describe('interpretResponse', function () {
- const response = {
- cpm: 12.5,
- vastXml: ' ',
- width: 640,
- height: 480,
- requestId: '21e12606d47ba7',
- netRevenue: true,
- currency: 'USD'
- };
-
- it('should get correct bid response', function () {
- let expectedResponse = [
- {
- requestId: '21e12606d47ba7',
- cpm: 12.5,
- width: 640,
- height: 480,
- creativeId: '21e12606d47ba7',
- currency: 'USD',
- netRevenue: true,
- ttl: TTL,
- vastXml: ' ',
- mediaType: VIDEO
- }
- ];
- const result = spec.interpretResponse({ body: response });
- expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
- });
- })
-
- describe('getUserSyncs', function() {
- const imageSyncResponse = {
- body: {
- userSyncPixels: [
- 'https://image-sync-url.test/1',
- 'https://image-sync-url.test/2',
- 'https://image-sync-url.test/3'
- ]
- }
- };
-
- const iframeSyncResponse = {
- body: {
- userSyncURL: 'https://iframe-sync-url.test'
- }
- };
-
- it('should register all img urls from the response', function() {
- const syncs = spec.getUserSyncs({ pixelEnabled: true }, [imageSyncResponse]);
- expect(syncs).to.deep.equal([
- {
- type: 'image',
- url: 'https://image-sync-url.test/1'
- },
- {
- type: 'image',
- url: 'https://image-sync-url.test/2'
- },
- {
- type: 'image',
- url: 'https://image-sync-url.test/3'
- }
- ]);
- });
-
- it('should register the iframe url from the response', function() {
- const syncs = spec.getUserSyncs({ iframeEnabled: true }, [iframeSyncResponse]);
- expect(syncs).to.deep.equal([
- {
- type: 'iframe',
- url: 'https://iframe-sync-url.test'
- }
- ]);
- });
-
- it('should register both image and iframe urls from the responses', function() {
- const syncs = spec.getUserSyncs({ pixelEnabled: true, iframeEnabled: true }, [iframeSyncResponse, imageSyncResponse]);
- expect(syncs).to.deep.equal([
- {
- type: 'iframe',
- url: 'https://iframe-sync-url.test'
- },
- {
- type: 'image',
- url: 'https://image-sync-url.test/1'
- },
- {
- type: 'image',
- url: 'https://image-sync-url.test/2'
- },
- {
- type: 'image',
- url: 'https://image-sync-url.test/3'
- }
- ]);
- });
-
- it('should handle an empty response', function() {
- const syncs = spec.getUserSyncs({ iframeEnabled: true }, []);
- expect(syncs).to.deep.equal([]);
- });
-
- it('should handle when user syncs are disabled', function() {
- const syncs = spec.getUserSyncs({ pixelEnabled: false }, [imageSyncResponse]);
- expect(syncs).to.deep.equal([]);
- });
- })
-});
diff --git a/test/spec/modules/ixBidAdapter_spec.js b/test/spec/modules/ixBidAdapter_spec.js
index 48c8e48e6af..4c24af6c082 100644
--- a/test/spec/modules/ixBidAdapter_spec.js
+++ b/test/spec/modules/ixBidAdapter_spec.js
@@ -26,7 +26,7 @@ describe('IndexexchangeAdapter', function () {
}
]
};
- const div_many_sizes = [
+ const LARGE_SET_OF_SIZES = [
[300, 250],
[600, 410],
[336, 280],
@@ -210,16 +210,15 @@ describe('IndexexchangeAdapter', function () {
bidder: 'ix',
params: {
siteId: '123',
- size: [300, 250]
+ size: [300, 250],
},
- sizes: [[300, 250], [300, 600]],
mediaTypes: {
video: {
context: 'outstream',
- playerSize: [[400, 100]]
+ playerSize: [600, 700]
},
banner: {
- sizes: [[300, 250], [300, 600]]
+ sizes: [[300, 250], [300, 600], [400, 500]]
}
},
adUnitCode: 'div-gpt-ad-1460505748562-0',
@@ -246,20 +245,19 @@ describe('IndexexchangeAdapter', function () {
maxduration: 60,
protocols: [1]
},
- size: [400, 100]
+ size: [300, 250]
},
- sizes: [[300, 250], [300, 600]],
mediaTypes: {
video: {
context: 'outstream',
- playerSize: [[400, 100]]
+ playerSize: [300, 250]
},
banner: {
sizes: [[300, 250], [300, 600]]
}
},
adUnitCode: 'div-gpt-ad-1460505748562-0',
- transactionId: '173f49a8-7549-4218-a23c-e7ba59b47230',
+ transactionId: '273f49a8-7549-4218-a23c-e7ba59b47230',
bidId: '1a2b3c4e',
bidderRequestId: '11a22b33c44e',
auctionId: '1aa2bb3cc4de',
@@ -411,7 +409,7 @@ describe('IndexexchangeAdapter', function () {
netId: 'testnetid123', // NetId
IDP: 'userIDP000', // IDP
fabrickId: 'fabrickId9000', // FabrickId
- uid2: {id: 'testuid2'} // UID 2.0
+ uid2: { id: 'testuid2' } // UID 2.0
};
const DEFAULT_USERIDASEIDS_DATA = createEidsArray(DEFAULT_USERID_DATA);
@@ -463,7 +461,7 @@ describe('IndexexchangeAdapter', function () {
const DEFAULT_USERID_BID_DATA = {
lotamePanoramaId: 'bd738d136bdaa841117fe9b331bb4',
- flocId: {id: '1234', version: 'chrome.1.2'}
+ flocId: { id: '1234', version: 'chrome.1.2' }
};
const DEFAULT_FLOC_USERID_PAYLOAD = [
@@ -531,10 +529,10 @@ describe('IndexexchangeAdapter', function () {
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
- it('should return false when size is missing', function () {
+ it('should return True when size is missing ', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
delete bid.params.size;
- expect(spec.isBidRequestValid(bid)).to.equal(false);
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
});
it('should return false when size array is wrong length', function () {
@@ -553,33 +551,47 @@ 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.banner does not have sizes', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.mediaTypes = {
- native: {
- sizes: [[300, 250]]
+ banner: {
+ size: [[300, 250]]
}
};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
- it('should return false when mediaTypes.banner does not have sizes', function () {
- const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
+ it('should return false when mediaTypes.video.playerSize does not include params.size', function () {
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
bid.mediaTypes = {
- banner: {
- size: [[300, 250]]
+ video: {
+ playerSize: [300, 250]
}
};
+ bid.params.size = [100, 200];
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
- it('should return false when mediaTypes.video does not have sizes', function () {
+ it('should return true when mediaTypes.video.playerSize includes params.size', function () {
const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
bid.mediaTypes = {
video: {
- size: [[300, 250]]
+ playerSize: [[300, 250], [200, 300]]
}
};
+ bid.params.size = [[300, 250]];
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
+ });
+
+ it('should return true when bid.params.size is missing', function () {
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
+ delete bid.params.size;
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
+ });
+
+ it('should return false when minduration is missing', function () {
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
+ delete bid.params.video.minduration;
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
@@ -709,7 +721,7 @@ describe('IndexexchangeAdapter', function () {
const request = spec.buildRequests(cloneValidBid, ALIAS_OPTIONS);
const payload = JSON.parse(request[0].data.r);
expect(request).to.be.an('array');
- expect(request).to.have.lengthOf(1);
+ expect(request).to.have.lengthOf.above(0); // should be 1 or more
expect(payload.user.eids).to.have.lengthOf(5);
expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[0]);
});
@@ -917,7 +929,7 @@ describe('IndexexchangeAdapter', function () {
expect(payload.user.eids).to.deep.include(DEFAULT_USERID_PAYLOAD[4]);
});
- it('IX adapter reads floc id from prebid userId and adds it to eids when there is not other eids', function() {
+ it('IX adapter reads floc id from prebid userId and adds it to eids when there is not other eids', function () {
const cloneValidBid = utils.deepClone(DEFAULT_BANNER_VALID_BID);
cloneValidBid[0].userId = utils.deepClone(DEFAULT_USERID_BID_DATA);
const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
@@ -927,7 +939,7 @@ describe('IndexexchangeAdapter', function () {
expect(payload.user.eids).to.deep.include(DEFAULT_FLOC_USERID_PAYLOAD[0]);
});
- it('IX adapter reads floc id from prebid userId and appends it to eids', function() {
+ it('IX adapter reads floc id from prebid userId and appends it to eids', function () {
const cloneValidBid = utils.deepClone(DEFAULT_BANNER_VALID_BID);
cloneValidBid[0].userIdAsEids = utils.deepClone(DEFAULT_USERIDASEIDS_DATA);
cloneValidBid[0].userId = utils.deepClone(DEFAULT_USERID_BID_DATA);
@@ -943,10 +955,10 @@ describe('IndexexchangeAdapter', function () {
expect(payload.user.eids).to.deep.include(DEFAULT_FLOC_USERID_PAYLOAD[0]);
});
- it('IX adapter reads empty floc obj from prebid userId it, floc is not added to eids', function() {
+ it('IX adapter reads empty floc obj from prebid userId it, floc is not added to eids', function () {
const cloneValidBid = utils.deepClone(DEFAULT_BANNER_VALID_BID);
cloneValidBid[0].userIdAsEids = utils.deepClone(DEFAULT_USERIDASEIDS_DATA);
- cloneValidBid[0].userId = {'flocId': {}}
+ cloneValidBid[0].userId = { 'flocId': {} }
const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
const payload = JSON.parse(request.data.r);
@@ -959,10 +971,10 @@ describe('IndexexchangeAdapter', function () {
expect(payload.user.eids).should.not.include(DEFAULT_FLOC_USERID_PAYLOAD[0]);
});
- it('IX adapter reads floc obj from prebid userId it version is missing, floc is not added to eids', function() {
+ it('IX adapter reads floc obj from prebid userId it version is missing, floc is not added to eids', function () {
const cloneValidBid = utils.deepClone(DEFAULT_BANNER_VALID_BID);
cloneValidBid[0].userIdAsEids = utils.deepClone(DEFAULT_USERIDASEIDS_DATA);
- cloneValidBid[0].userId = {'flocId': {'id': 'abcd'}}
+ cloneValidBid[0].userId = { 'flocId': { 'id': 'abcd' } }
const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
const payload = JSON.parse(request.data.r);
@@ -975,10 +987,10 @@ describe('IndexexchangeAdapter', function () {
expect(payload.user.eids).should.not.include(DEFAULT_FLOC_USERID_PAYLOAD[0]);
});
- it('IX adapter reads floc obj from prebid userId it ID is missing, floc is not added to eids', function() {
+ it('IX adapter reads floc obj from prebid userId it ID is missing, floc is not added to eids', function () {
const cloneValidBid = utils.deepClone(DEFAULT_BANNER_VALID_BID);
cloneValidBid[0].userIdAsEids = utils.deepClone(DEFAULT_USERIDASEIDS_DATA);
- cloneValidBid[0].userId = {'flocId': {'version': 'chrome.a.b.c'}}
+ cloneValidBid[0].userId = { 'flocId': { 'version': 'chrome.a.b.c' } }
const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
const payload = JSON.parse(request.data.r);
@@ -991,10 +1003,10 @@ describe('IndexexchangeAdapter', function () {
expect(payload.user.eids).should.not.include(DEFAULT_FLOC_USERID_PAYLOAD[0]);
});
- it('IX adapter reads floc id with empty id from prebid userId and it does not added to eids', function() {
+ it('IX adapter reads floc id with empty id from prebid userId and it does not added to eids', function () {
const cloneValidBid = utils.deepClone(DEFAULT_BANNER_VALID_BID);
cloneValidBid[0].userIdAsEids = utils.deepClone(DEFAULT_USERIDASEIDS_DATA);
- cloneValidBid[0].userId = {flocID: {id: '', ver: 'chrome.1.2.3'}};
+ cloneValidBid[0].userId = { flocID: { id: '', ver: 'chrome.1.2.3' } };
const request = spec.buildRequests(cloneValidBid, DEFAULT_OPTION)[0];
const payload = JSON.parse(request.data.r);
@@ -1265,14 +1277,14 @@ describe('IndexexchangeAdapter', function () {
}
};
const requests = spec.buildRequests(validBids, DEFAULT_OPTION);
- const { dfp_ad_unit_code } = JSON.parse(requests[0].data.r).imp[0].ext;
+ const { dfp_ad_unit_code } = JSON.parse(requests[0].data.r).imp[0].banner.format[0].ext;
expect(dfp_ad_unit_code).to.equal(AD_UNIT_CODE);
});
it('should not send dfp_adunit_code in request if ortb2Imp.ext.data.adserver.adslot does not exists', function () {
const validBids = utils.deepClone(DEFAULT_BANNER_VALID_BID);
const requests = spec.buildRequests(validBids, DEFAULT_OPTION);
- const { dfp_ad_unit_code } = JSON.parse(requests[0].data.r).imp[0].ext;
+ const { dfp_ad_unit_code } = JSON.parse(requests[0].data.r).imp[0].banner.format[0].ext;
expect(dfp_ad_unit_code).to.not.exist;
});
@@ -1281,15 +1293,24 @@ describe('IndexexchangeAdapter', function () {
const payload = JSON.parse(query.r);
expect(payload.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidderRequestId);
expect(payload.id).to.be.a('string');
- expect(payload.site).to.exist;
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');
expect(payload.source.ext.schain).to.deep.equal(SAMPLE_SCHAIN);
- expect(payload.imp).to.exist;
expect(payload.imp).to.be.an('array');
- expect(payload.imp).to.have.lengthOf(2);
+ expect(payload.imp).to.have.lengthOf(1);
+ });
+
+ it('payload should have correct format and value for r.id when bidderRequestId is a number ', function () {
+ const bidWithIntId = utils.deepClone(DEFAULT_BANNER_VALID_BID);
+ bidWithIntId[0].bidderRequestId = 123456;
+
+ request = spec.buildRequests(bidWithIntId, DEFAULT_OPTION)[0];
+
+ const payload = JSON.parse(request.data.r);
+ expect(bidWithIntId[0].bidderRequestId).to.be.a('number');
+ expect(payload.id).to.equal(bidWithIntId[0].bidderRequestId.toString());
+ expect(payload.id).to.be.a('string');
});
it('payload should have correct format and value for r.id when bidderRequestId is a number ', function () {
@@ -1311,202 +1332,162 @@ describe('IndexexchangeAdapter', function () {
it('impression should have correct format and value', function () {
const impression = JSON.parse(query.r).imp[0];
- const sidValue = `${DEFAULT_BANNER_VALID_BID[0].params.size[0].toString()}x${DEFAULT_BANNER_VALID_BID[0].params.size[1].toString()}`;
expect(impression.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
- expect(impression.banner).to.exist;
- expect(impression.banner.w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
- expect(impression.banner.h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
- expect(impression.banner.topframe).to.exist;
+ expect(impression.banner.format).to.be.length(2);
expect(impression.banner.topframe).to.be.oneOf([0, 1]);
- expect(impression.ext).to.exist;
- expect(impression.ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
- expect(impression.ext.sid).to.equal(sidValue);
- });
- it('video impression has #priceFloors floors', function () {
- const bid = utils.deepClone(ONE_VIDEO[0]);
- const flr = 5.5
- const floorInfo = {floor: flr, currency: 'USD'};
- bid.getFloor = function () {
- return floorInfo;
- }
+ impression.banner.format.map(({ w, h, ext }, index) => {
+ const size = DEFAULT_BANNER_VALID_BID[0].mediaTypes.banner.sizes[index];
+ const sidValue = utils.parseGPTSingleSizeArray(size);
- // check if floors are in imp
- const requestBidFloor = spec.buildRequests([bid])[0];
- const imp1 = JSON.parse(requestBidFloor.data.r).imp[0];
- expect(imp1.bidfloor).to.equal(flr);
- expect(imp1.bidfloorcur).to.equal('USD');
- expect(imp1.ext.fl).to.equal('p');
+ expect(w).to.equal(size[0]);
+ expect(h).to.equal(size[1]);
+ expect(ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
+ expect(ext.sid).to.equal(sidValue);
+ });
});
- it('banner imp has floors from #priceFloors module', function () {
- const floor300x250 = 3.25
- const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0])
+ describe('build requests with price floors', () => {
+ const highFloor = 4.5;
+ const lowFloor = 3.5;
+ const currency = 'USD';
- const floorInfo = { floor: floor300x250, currency: 'USD' };
- bid.getFloor = function () {
- return floorInfo;
- };
-
- // check if floors are in imp
- const requestBidFloor = spec.buildRequests([bid])[0];
- const imp1 = JSON.parse(requestBidFloor.data.r).imp[0];
+ it('video impression should contain floors from priceFloors module', function () {
+ const bid = utils.deepClone(ONE_VIDEO[0]);
+ const expectedFloor = 3.25;
+ bid.getFloor = () => ({ floor: expectedFloor, currency });
+ const request = spec.buildRequests([bid])[0];
+ const impression = JSON.parse(request.data.r).imp[0];
- expect(imp1.bidfloorcur).to.equal('USD');
- expect(imp1.bidfloor).to.equal(floor300x250);
- expect(imp1.ext.fl).to.equal('p');
- });
+ expect(impression.bidfloor).to.equal(expectedFloor);
+ expect(impression.bidfloorcur).to.equal(currency);
+ expect(impression.ext.fl).to.equal('p');
+ });
- it('ix adapter floors chosen over #priceFloors ', function () {
- const bid = utils.deepClone(ONE_BANNER[0]);
+ it('banner impression should contain floors from priceFloors module', function () {
+ const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0])
+ const expectedFloor = 3.25;
+ bid.getFloor = () => ({ floor: expectedFloor, currency });
+ const request = spec.buildRequests([bid])[0];
+ const impression = JSON.parse(request.data.r).imp[0];
- const floorhi = 4.5
- const floorlow = 3.5
+ expect(impression.bidfloor).to.equal(expectedFloor);
+ expect(impression.bidfloorcur).to.equal(currency);
+ expect(impression.banner.format[0].ext.fl).to.equal('p');
+ });
- bid.params.bidFloor = floorhi
- bid.params.bidFloorCur = 'USD'
+ it('should default to ix floors when priceFloors Module is not implemented', function () {
+ const bid = utils.deepClone(ONE_BANNER[0]);
+ bid.params.bidFloor = highFloor;
+ bid.params.bidFloorCur = 'USD'
+ const request = spec.buildRequests([bid])[0];
+ const impression = JSON.parse(request.data.r).imp[0];
- const floorInfo = { floor: floorlow, currency: 'USD' };
- bid.getFloor = function () {
- return floorInfo;
- };
+ expect(impression.bidfloor).to.equal(highFloor);
+ expect(impression.bidfloorcur).to.equal(bid.params.bidFloorCur);
+ expect(impression.banner.format[0].ext.fl).to.equal('x');
+ });
- // check if floors are in imp
- const requestBidFloor = spec.buildRequests([bid])[0];
- const imp1 = JSON.parse(requestBidFloor.data.r).imp[0];
- expect(imp1.bidfloor).to.equal(floorhi);
- expect(imp1.bidfloorcur).to.equal(bid.params.bidFloorCur);
- expect(imp1.ext.fl).to.equal('x');
- });
+ it('should prioritize priceFloors Module over IX param floors', function () {
+ const bid = utils.deepClone(ONE_BANNER[0]);
+ bid.params.bidFloor = lowFloor;
+ bid.params.bidFloorCur = 'USD';
+ const expectedFloor = highFloor;
+ bid.getFloor = () => ({ floor: expectedFloor, currency });
+ const requestBidFloor = spec.buildRequests([bid])[0];
+ const impression = JSON.parse(requestBidFloor.data.r).imp[0];
+
+ expect(impression.bidfloor).to.equal(highFloor);
+ expect(impression.bidfloorcur).to.equal(bid.params.bidFloorCur);
+ expect(impression.banner.format[0].ext.fl).to.equal('p');
+ });
- it(' #priceFloors floors chosen over ix adapter floors', function () {
- const bid = utils.deepClone(ONE_BANNER[0]);
+ it('impression should have bidFloor and bidFloorCur if configured', 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 impression = JSON.parse(requestBidFloor.data.r).imp[0];
- const floorhi = 4.5
- const floorlow = 3.5
+ expect(impression.bidfloor).to.equal(bid.params.bidFloor);
+ expect(impression.bidfloorcur).to.equal(bid.params.bidFloorCur);
+ expect(impression.banner.format[0].ext.fl).to.equal('x');
+ });
- bid.params.bidFloor = floorlow
- bid.params.bidFloorCur = 'USD'
+ it('missing sizes impressions should contain floors from priceFloors module ', function () {
+ const bid = utils.deepClone(ONE_BANNER[0]);
+ bid.mediaTypes.banner.sizes.push([500, 400])
- const floorInfo = { floor: floorhi, currency: 'USD' };
- bid.getFloor = function () {
- return floorInfo;
- };
+ const expectedFloor = 3.25;
+ bid.getFloor = () => ({ floor: expectedFloor, currency });
- // check if floors are in imp
- const requestBidFloor = spec.buildRequests([bid])[0];
- const imp1 = JSON.parse(requestBidFloor.data.r).imp[0];
- expect(imp1.bidfloor).to.equal(floorhi);
- expect(imp1.bidfloorcur).to.equal(bid.params.bidFloorCur);
- expect(imp1.ext.fl).to.equal('p');
- });
+ sinon.spy(bid, 'getFloor');
- it('impression should have bidFloor and bidFloorCur if configured', 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 impression = JSON.parse(requestBidFloor.data.r).imp[0];
-
- expect(impression.bidfloor).to.equal(bid.params.bidFloor);
- expect(impression.bidfloorcur).to.equal(bid.params.bidFloorCur);
- expect(impression.ext.fl).to.equal('x');
- });
+ const requestBidFloor = spec.buildRequests([bid])[0];
+ expect(bid.getFloor.getCall(0).args[0].mediaType).to.equal('banner');
+ expect(bid.getFloor.getCall(0).args[0].size[0]).to.equal(300);
+ expect(bid.getFloor.getCall(0).args[0].size[1]).to.equal(250);
- it('missing sizes #priceFloors ', function () {
- const bid = utils.deepClone(ONE_BANNER[0]);
- bid.mediaTypes.banner.sizes.push([500, 400])
+ expect(bid.getFloor.getCall(1).args[0].mediaType).to.equal('banner');
+ expect(bid.getFloor.getCall(1).args[0].size[0]).to.equal(500);
+ expect(bid.getFloor.getCall(1).args[0].size[1]).to.equal(400);
- const floorInfo = { floor: 3.25, currency: 'USD' };
- bid.getFloor = function () {
- return floorInfo;
- };
+ const impression = JSON.parse(requestBidFloor.data.r).imp[0];
+ expect(impression.bidfloor).to.equal(expectedFloor);
+ expect(impression.bidfloorcur).to.equal(currency);
+ });
- sinon.spy(bid, 'getFloor');
+ it('banner impressions should have pricefloors in AdUnit', function () {
+ const bid = utils.deepClone(ONE_BANNER[0]);
- const requestBidFloor = spec.buildRequests([bid])[0];
- // called getFloor with 300 x 250
- expect(bid.getFloor.getCall(0).args[0].mediaType).to.equal('banner');
- expect(bid.getFloor.getCall(0).args[0].size[0]).to.equal(300);
- expect(bid.getFloor.getCall(0).args[0].size[1]).to.equal(250);
-
- // called getFloor with 500 x 400
- expect(bid.getFloor.getCall(1).args[0].mediaType).to.equal('banner');
- expect(bid.getFloor.getCall(1).args[0].size[0]).to.equal(500);
- expect(bid.getFloor.getCall(1).args[0].size[1]).to.equal(400);
-
- // both will have same floors due to mock getFloor
- const imp1 = JSON.parse(requestBidFloor.data.r).imp[0];
- expect(imp1.bidfloor).to.equal(3.25);
- expect(imp1.bidfloorcur).to.equal('USD');
-
- const imp2 = JSON.parse(requestBidFloor.data.r).imp[1];
- expect(imp2.bidfloor).to.equal(3.25);
- expect(imp2.bidfloorcur).to.equal('USD');
- });
-
- it('#pricefloors inAdUnit, banner impressions should have floors', function () {
- const bid = utils.deepClone(ONE_BANNER[0]);
-
- const flr = 4.3
- bid.floors = {
- currency: 'USD',
- schema: {
- delimiter: '|',
- fields: ['mediaType', 'size']
- },
- values: {
- 'banner|300x250': flr,
- 'banner|600x500': 6.5,
- 'banner|*': 7.5
- }
- };
- const floorInfo = { floor: flr, currency: 'USD' };
- bid.getFloor = function () {
- return floorInfo;
- };
+ const expectedFloor = 4.3;
+ bid.floors = {
+ currency: 'USD',
+ schema: {
+ delimiter: '|',
+ fields: ['mediaType', 'size']
+ },
+ values: {
+ 'banner|300x250': expectedFloor,
+ 'banner|600x500': 6.5,
+ 'banner|*': 7.5
+ }
+ };
+ bid.getFloor = () => ({ floor: expectedFloor, currency });
- sinon.spy(bid, 'getFloor');
+ sinon.spy(bid, 'getFloor');
- const requestBidFloor = spec.buildRequests([bid])[0];
- // called getFloor with 300 x 250
- expect(bid.getFloor.getCall(0).args[0].mediaType).to.equal('banner');
- expect(bid.getFloor.getCall(0).args[0].size[0]).to.equal(300);
- expect(bid.getFloor.getCall(0).args[0].size[1]).to.equal(250);
+ const requestBidFloor = spec.buildRequests([bid])[0];
+ expect(bid.getFloor.getCall(0).args[0].mediaType).to.equal('banner');
+ expect(bid.getFloor.getCall(0).args[0].size[0]).to.equal(300);
+ expect(bid.getFloor.getCall(0).args[0].size[1]).to.equal(250);
- const imp1 = JSON.parse(requestBidFloor.data.r).imp[0];
- expect(imp1.bidfloor).to.equal(flr);
- expect(imp1.bidfloorcur).to.equal('USD');
+ const impression = JSON.parse(requestBidFloor.data.r).imp[0];
+ expect(impression.bidfloor).to.equal(expectedFloor);
+ expect(impression.bidfloorcur).to.equal(currency);
+ });
});
it('payload without mediaType should have correct format and value', function () {
const payload = JSON.parse(queryWithoutMediaType.r);
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.ref).to.equal(document.referrer);
- expect(payload.ext).to.exist;
expect(payload.ext.source).to.equal('prebid');
- expect(payload.imp).to.exist;
expect(payload.imp).to.be.an('array');
expect(payload.imp).to.have.lengthOf(1);
});
it('impression without mediaType should have correct format and value', function () {
const impression = JSON.parse(queryWithoutMediaType.r).imp[0];
- const sidValue = `${DEFAULT_BANNER_VALID_BID[0].params.size[0].toString()}x${DEFAULT_BANNER_VALID_BID[0].params.size[1].toString()}`;
expect(impression.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
- expect(impression.banner).to.exist;
- expect(impression.banner.w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
- expect(impression.banner.h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
- expect(impression.banner.topframe).to.exist;
+ expect(impression.banner.format).to.be.length(1);
+ expect(impression.banner.format[0].w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
+ expect(impression.banner.format[0].h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
expect(impression.banner.topframe).to.be.oneOf([0, 1]);
- expect(impression.ext).to.exist;
- expect(impression.ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
- expect(impression.ext.sid).to.equal(sidValue);
});
it('impression should have sid if id is configured as number', function () {
@@ -1516,14 +1497,11 @@ describe('IndexexchangeAdapter', function () {
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;
- expect(impression.banner.w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
- expect(impression.banner.h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
- expect(impression.banner.topframe).to.exist;
+ expect(impression.banner.format[0].w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
+ expect(impression.banner.format[0].h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
expect(impression.banner.topframe).to.be.oneOf([0, 1]);
- expect(impression.ext).to.exist;
- expect(impression.ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
- expect(impression.ext.sid).to.equal('50');
+ expect(impression.banner.format[0].ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
+ expect(impression.banner.format[0].ext.sid).to.equal('50');
});
it('impression should have sid if id is configured as string', function () {
@@ -1531,131 +1509,146 @@ describe('IndexexchangeAdapter', function () {
bid.params.id = 'abc';
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;
- expect(impression.banner.w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
- expect(impression.banner.h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
- expect(impression.banner.topframe).to.exist;
+ expect(impression.banner.format[0].w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
+ expect(impression.banner.format[0].h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
expect(impression.banner.topframe).to.be.oneOf([0, 1]);
- expect(impression.ext).to.exist;
- expect(impression.ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
- expect(impression.ext.sid).to.equal('abc');
+ expect(impression.banner.format[0].ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
+ expect(impression.banner.format[0].ext.sid).to.equal('abc');
});
- it('should add first party data to page url in bid request if it exists in config', function () {
- config.setConfig({
- ix: {
- firstPartyData: {
- ab: 123,
- cd: '123#ab',
- 'e/f': 456,
- 'h?g': '456#cd'
+ describe('first party data', () => {
+ it('should add first party data to page url in bid request if it exists in config', function () {
+ config.setConfig({
+ ix: {
+ firstPartyData: {
+ ab: 123,
+ cd: '123#ab',
+ 'e/f': 456,
+ 'h?g': '456#cd'
+ }
}
- }
- });
-
- const requestWithFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
- 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';
- expect(pageUrl).to.equal(expectedPageUrl);
- });
+ });
- it('should not set first party data if it is not an object', function () {
- config.setConfig({
- ix: {
- firstPartyData: 500
- }
+ const requestWithFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ 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';
+ expect(pageUrl).to.equal(expectedPageUrl);
});
- const requestFirstPartyDataNumber = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
- const pageUrl = JSON.parse(requestFirstPartyDataNumber.data.r).site.page;
+ it('should not set first party data if it is not an object', function () {
+ config.setConfig({
+ ix: {
+ firstPartyData: 500
+ }
+ });
- expect(pageUrl).to.equal(DEFAULT_OPTION.refererInfo.referer);
- });
+ const requestFirstPartyDataNumber = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ const pageUrl = JSON.parse(requestFirstPartyDataNumber.data.r).site.page;
- it('should not set first party or timeout if it is not present', function () {
- config.setConfig({
- ix: {}
+ expect(pageUrl).to.equal(DEFAULT_OPTION.refererInfo.referer);
});
- const requestWithoutConfig = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
- const pageUrl = JSON.parse(requestWithoutConfig.data.r).site.page;
+ it('should not set first party or timeout if it is not present', function () {
+ config.setConfig({
+ ix: {}
+ });
- expect(pageUrl).to.equal(DEFAULT_OPTION.refererInfo.referer);
- expect(requestWithoutConfig.data.t).to.be.undefined;
- });
+ const requestWithoutConfig = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ const pageUrl = JSON.parse(requestWithoutConfig.data.r).site.page;
- 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 pageUrl = JSON.parse(requestWithoutConfig.data.r).site.page;
+ expect(pageUrl).to.equal(DEFAULT_OPTION.refererInfo.referer);
+ expect(requestWithoutConfig.data.t).to.be.undefined;
+ });
- 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_OPTION)[0];
+ const pageUrl = JSON.parse(requestWithoutConfig.data.r).site.page;
- it('should set timeout if publisher set it through setConfig', function () {
- config.setConfig({
- ix: {
- timeout: 500
- }
+ expect(pageUrl).to.equal(DEFAULT_OPTION.refererInfo.referer);
+ expect(requestWithoutConfig.data.t).to.be.undefined;
});
- const requestWithTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0];
- expect(requestWithTimeout.data.t).to.equal(500);
- });
+ it('should set timeout if publisher set it through setConfig', function () {
+ config.setConfig({
+ ix: {
+ timeout: 500
+ }
+ });
+ const requestWithTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0];
- it('should set timeout if timeout is a string', function () {
- config.setConfig({
- ix: {
- timeout: '500'
- }
+ expect(requestWithTimeout.data.t).to.equal(500);
});
- const requestStringTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0];
- expect(requestStringTimeout.data.t).to.be.undefined;
+ it('should set timeout if timeout is a string', function () {
+ config.setConfig({
+ ix: {
+ timeout: '500'
+ }
+ });
+ 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 () {
+ describe('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.r).imp).to.have.lengthOf(2);
- 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]);
+ it('should have banner request', () => {
+ const bannerImpression = JSON.parse(request[0].data.r).imp[0];
+
+ expect(JSON.parse(request[0].data.r).imp).to.have.lengthOf(1);
+ expect(JSON.parse(request[0].data.v)).to.equal(BANNER_ENDPOINT_VERSION);
+ expect(bannerImpression.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
- 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]);
+ expect(bannerImpression.banner.format).to.be.length(2);
+ expect(bannerImpression.banner.topframe).to.be.oneOf([0, 1]);
+
+ bannerImpression.banner.format.map(({ w, h, ext }, index) => {
+ const size = DEFAULT_BANNER_VALID_BID[0].mediaTypes.banner.sizes[index];
+ const sidValue = utils.parseGPTSingleSizeArray(size);
+
+ expect(w).to.equal(size[0]);
+ expect(h).to.equal(size[1]);
+ expect(ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
+ expect(ext.sid).to.equal(sidValue);
+ });
+ });
+
+ it('should have video request', () => {
+ const videoImpression = JSON.parse(request[1].data.r).imp[0];
+
+ expect(JSON.parse(request[1].data.v)).to.equal(VIDEO_ENDPOINT_VERSION);
+ expect(videoImpression.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId);
+ expect(videoImpression.video.w).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[0]);
+ expect(videoImpression.video.h).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[1]);
+ });
});
it('single request under 8k size limit for large ad unit', function () {
const options = {};
- const bid1 = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
- bid1.mediaTypes.banner.sizes = div_many_sizes;
- const requests = spec.buildRequests([bid1], options);
+ const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
+ bid.mediaTypes.banner.sizes = LARGE_SET_OF_SIZES;
+ const requests = spec.buildRequests([bid], options);
- const reqSize = new Blob([`${requests[0].url}?${utils.parseQueryStringParameters(requests[0].data)}`]).size;
+ const reqSize = `${requests[0].url}?${utils.parseQueryStringParameters(requests[0].data)}`.length;
expect(requests).to.be.an('array');
expect(requests).to.have.lengthOf(1);
expect(reqSize).to.be.lessThan(8000);
+ expect(requests[0].data.sn).to.be.undefined;
});
it('2 requests due to 2 ad units, one larger than url size', function () {
- const bid1 = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
- bid1.mediaTypes.banner.sizes = div_many_sizes;
- bid1.params.siteId = '124';
- bid1.adUnitCode = 'div-gpt-1'
- bid1.transactionId = '152e36d1-1241-4242-t35e-y1dv34d12315';
- bid1.bidId = '2f6g5s5e';
+ const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
+ bid.mediaTypes.banner.sizes = LARGE_SET_OF_SIZES;
+ bid.params.siteId = '124';
+ bid.adUnitCode = 'div-gpt-1'
+ bid.transactionId = '152e36d1-1241-4242-t35e-y1dv34d12315';
+ bid.bidId = '2f6g5s5e';
- const requests = spec.buildRequests([bid1, DEFAULT_BANNER_VALID_BID[0]], DEFAULT_OPTION);
+ const requests = spec.buildRequests([bid, DEFAULT_BANNER_VALID_BID[0]], DEFAULT_OPTION);
expect(requests).to.be.an('array');
expect(requests).to.have.lengthOf(2);
expect(requests[0].data.sn).to.be.equal(0);
@@ -1664,7 +1657,7 @@ describe('IndexexchangeAdapter', function () {
it('6 ad units should generate only 4 requests', function () {
const bid1 = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
- bid1.mediaTypes.banner.sizes = div_many_sizes;
+ bid1.mediaTypes.banner.sizes = LARGE_SET_OF_SIZES;
bid1.params.siteId = '121';
bid1.adUnitCode = 'div-gpt-1'
bid1.transactionId = 'tr1';
@@ -1690,9 +1683,8 @@ describe('IndexexchangeAdapter', function () {
expect(requests).to.be.an('array');
expect(requests).to.have.lengthOf(4);
- // check if seq number increases
for (var i = 0; i < requests.length; i++) {
- const reqSize = new Blob([`${requests[i].url}?${utils.parseQueryStringParameters(requests[i].data)}`]).size;
+ const reqSize = `${requests[i].url}?${utils.parseQueryStringParameters(requests[i].data)}`.length;
expect(reqSize).to.be.lessThan(8000);
let payload = JSON.parse(requests[i].data.r);
if (requests.length > 1) {
@@ -1718,12 +1710,14 @@ describe('IndexexchangeAdapter', function () {
bid3.mediaTypes.banner.sizes = [[330, 331], [332, 333], [300, 250]];
const requests = spec.buildRequests([bid1, bid2, bid3], DEFAULT_OPTION);
+
expect(requests).to.be.an('array');
expect(requests).to.have.lengthOf(1);
const impressions = JSON.parse(requests[0].data.r).imp;
expect(impressions).to.be.an('array');
- expect(impressions).to.have.lengthOf(9);
+ expect(impressions).to.have.lengthOf(3);
+ expect(requests[0].data.sn).to.be.undefined;
});
it('request should contain the extra banner ad sizes that IX is not configured for using the first site id in the ad unit', function () {
@@ -1736,24 +1730,21 @@ describe('IndexexchangeAdapter', function () {
bid2.params.bidId = '2b3c4d5e';
const request = spec.buildRequests([bid, bid2], DEFAULT_OPTION)[0];
- const impressions = JSON.parse(request.data.r).imp;
+ const impression = JSON.parse(request.data.r).imp[0];
- expect(impressions).to.be.an('array');
- expect(impressions).to.have.lengthOf(4);
+ expect(impression.id).to.equal(bid.bidId);
+ expect(impression.banner.format).to.be.length(bid.mediaTypes.banner.sizes.length);
+ expect(impression.banner.topframe).to.be.oneOf([0, 1]);
- expect(impressions[0].ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString())
- expect(impressions[1].ext.siteID).to.equal(bid2.params.siteId)
- expect(impressions[2].ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString())
- expect(impressions[3].ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString())
+ impression.banner.format.map(({ w, h, ext }, index) => {
+ const size = bid.mediaTypes.banner.sizes[index];
+ const sidValue = utils.parseGPTSingleSizeArray(size);
- expect(impressions[0].banner.w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
- expect(impressions[0].banner.h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
- expect(impressions[1].banner.w).to.equal(bid2.params.size[0]);
- expect(impressions[1].banner.h).to.equal(bid2.params.size[1]);
- expect(impressions[2].banner.w).to.equal(bid.mediaTypes.banner.sizes[2][0]);
- expect(impressions[2].banner.h).to.equal(bid.mediaTypes.banner.sizes[2][1]);
- expect(impressions[3].banner.w).to.equal(bid.mediaTypes.banner.sizes[3][0]);
- expect(impressions[3].banner.h).to.equal(bid.mediaTypes.banner.sizes[3][1]);
+ expect(w).to.equal(size[0]);
+ expect(h).to.equal(size[1]);
+ expect(ext.siteID).to.equal(index === 1 ? bid2.params.siteId : bid.params.siteId);
+ expect(ext.sid).to.equal(sidValue);
+ });
});
it('request should contain the extra banner ad sizes and their corresponding site ids when there is multiple ad units', function () {
@@ -1766,33 +1757,30 @@ describe('IndexexchangeAdapter', function () {
bid.sizes = [[336, 280], [970, 90]]
bid.mediaTypes.banner.sizes = [[336, 280], [970, 90]]
- const request = spec.buildRequests([DEFAULT_BANNER_VALID_BID[0], bid], DEFAULT_OPTION)[0];
+ const bids = [DEFAULT_BANNER_VALID_BID[0], bid];
+ const request = spec.buildRequests(bids, DEFAULT_OPTION)[0];
const impressions = JSON.parse(request.data.r).imp;
expect(impressions).to.be.an('array');
- expect(impressions).to.have.lengthOf(4);
- expect(impressions[0].ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
- expect(impressions[1].ext.siteID).to.equal(bid.params.siteId);
- expect(impressions[2].ext.siteID).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId.toString());
- expect(impressions[3].ext.siteID).to.equal(bid.params.siteId);
-
- expect(impressions[0].banner.w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
- expect(impressions[0].banner.h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
-
- expect(impressions[1].banner.w).to.equal(bid.params.size[0]);
- expect(impressions[1].banner.h).to.equal(bid.params.size[1]);
+ expect(impressions).to.have.lengthOf(2);
+ expect(request.data.sn).to.be.undefined;
- expect(impressions[2].banner.w).to.equal(DEFAULT_BANNER_VALID_BID[0].mediaTypes.banner.sizes[1][0]);
- expect(impressions[2].banner.h).to.equal(DEFAULT_BANNER_VALID_BID[0].mediaTypes.banner.sizes[1][1]);
+ impressions.map((impression, impressionIndex) => {
+ const firstSizeObject = bids[impressionIndex].mediaTypes.banner.sizes[0];
- expect(impressions[3].banner.w).to.equal(bid.mediaTypes.banner.sizes[1][0]);
- expect(impressions[3].banner.h).to.equal(bid.mediaTypes.banner.sizes[1][1]);
+ expect(impression.banner.format).to.be.length(2);
+ expect(impression.banner.topframe).to.be.oneOf([0, 1]);
- expect(impressions[0].ext.sid).to.equal(`${DEFAULT_BANNER_VALID_BID[0].params.size[0].toString()}x${DEFAULT_BANNER_VALID_BID[0].params.size[1].toString()}`);
- expect(impressions[1].ext.sid).to.equal(`${bid.params.size[0].toString()}x${bid.params.size[1].toString()}`);
+ impression.banner.format.map(({ w, h, ext }, index) => {
+ const size = bids[impressionIndex].mediaTypes.banner.sizes[index];
+ const sidValue = utils.parseGPTSingleSizeArray(size);
- expect(impressions[2].ext.sid).to.equal(`${DEFAULT_BANNER_VALID_BID[0].mediaTypes.banner.sizes[1][0].toString()}x${DEFAULT_BANNER_VALID_BID[0].mediaTypes.banner.sizes[1][1].toString()}`);
- expect(impressions[3].ext.sid).to.equal(`${bid.mediaTypes.banner.sizes[1][0].toString()}x${bid.mediaTypes.banner.sizes[1][1].toString()}`);
+ expect(w).to.equal(size[0]);
+ expect(h).to.equal(size[1]);
+ expect(ext.siteID).to.equal(bids[impressionIndex].params.siteId.toString());
+ expect(ext.sid).to.equal(sidValue);
+ });
+ });
});
it('request should not contain the extra video ad sizes that IX is not configured for', function () {
@@ -1814,14 +1802,14 @@ describe('IndexexchangeAdapter', function () {
it('request should not contain missing sizes if detectMissingSizes = false', function () {
const bid1 = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
- bid1.mediaTypes.banner.sizes = div_many_sizes;
+ bid1.mediaTypes.banner.sizes = LARGE_SET_OF_SIZES;
const requests = spec.buildRequests([bid1, DEFAULT_BANNER_VALID_BID[0]], DEFAULT_OPTION);
const impressions = JSON.parse(requests[0].data.r).imp;
expect(impressions).to.be.an('array');
- expect(impressions).to.have.lengthOf(2);
+ expect(impressions).to.have.lengthOf(1);
});
});
});
@@ -1841,56 +1829,59 @@ describe('IndexexchangeAdapter', function () {
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()}`;
+ const sidValue = utils.parseGPTSingleSizeArray(DEFAULT_VIDEO_VALID_BID[0].params.size);
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 () {
+ it('should not use default placement values when placement is defined at adUnit level', 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()}`;
+ bid.mediaTypes.video.context = 'outstream';
+ bid.mediaTypes.video.placement = 2;
+ 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.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);
+ expect(impression.video.placement).to.equal(2);
});
- it('should set correct placement if context is outstream', function () {
+ it('should set correct default placement, if context is instream', function () {
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
+ bid.mediaTypes.video.context = 'instream';
+ 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.placement).to.equal(1);
+ });
+
+ it('should set correct default 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);
});
+ it('should handle unexpected context', function () {
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
+ bid.mediaTypes.video.context = 'VaccineJanssen';
+ const request = spec.buildRequests([bid])[0];
+ const impression = JSON.parse(request.data.r).imp[0];
+ expect(impression.video.placement).to.be.undefined;
+ });
+
it('should not override video properties if they are already configured at the params video level', function () {
const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
bid.mediaTypes.video.context = 'outstream';
@@ -1931,58 +1922,84 @@ describe('IndexexchangeAdapter', function () {
});
describe('buildRequestMultiFormat', function () {
- describe('only banner bidder params set', function () {
+ it('only banner bidder params set', function () {
const request = spec.buildRequests(DEFAULT_MULTIFORMAT_BANNER_VALID_BID)
-
- const bannerImp = JSON.parse(request[0].data.r).imp[0];
- expect(JSON.parse(request[0].data.r).imp).to.have.lengthOf(2);
+ const bannerImpression = JSON.parse(request[0].data.r).imp[0];
+ expect(JSON.parse(request[0].data.r).imp).to.have.lengthOf(1);
expect(JSON.parse(request[0].data.v)).to.equal(BANNER_ENDPOINT_VERSION);
- expect(bannerImp.id).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].bidId);
- expect(bannerImp.banner).to.exist;
- expect(bannerImp.banner.w).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].params.size[0]);
- expect(bannerImp.banner.h).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].params.size[1]);
+ expect(bannerImpression.id).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].bidId);
+ expect(bannerImpression.banner.format[0].w).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].params.size[0]);
+ expect(bannerImpression.banner.format[0].h).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].params.size[1]);
});
describe('only video bidder params set', function () {
- const request = spec.buildRequests(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID);
+ it('should generate video impression', function () {
+ const request = spec.buildRequests(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID);
+ const videoImp = JSON.parse(request[1].data.r).imp[0];
+ expect(JSON.parse(request[1].data.r).imp).to.have.lengthOf(1);
+ expect(JSON.parse(request[1].data.v)).to.equal(VIDEO_ENDPOINT_VERSION);
+ expect(videoImp.id).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].bidId);
+ expect(videoImp.video.w).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].params.size[0]);
+ expect(videoImp.video.h).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].params.size[1]);
+ });
- const videoImp = JSON.parse(request[0].data.r).imp[0];
- expect(JSON.parse(request[0].data.r).imp).to.have.lengthOf(1);
- expect(JSON.parse(request[0].data.v)).to.equal(VIDEO_ENDPOINT_VERSION);
- expect(videoImp.id).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].bidId);
- expect(videoImp.video).to.exist;
- expect(videoImp.video.w).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].params.size[0]);
- expect(videoImp.video.h).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].params.size[1]);
+ it('should get missing sizes count 0 when params.size not used', function () {
+ const bid = utils.deepClone(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]);
+ delete bid.params.size;
+ const request = spec.buildRequests([bid]);
+ const diagObj = JSON.parse(request[0].data.r).ext.ixdiag;
+ expect(diagObj.msd).to.equal(0);
+ expect(diagObj.msi).to.equal(0);
+ });
});
+
describe('both banner and video bidder params set', function () {
- const request = spec.buildRequests([DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0], DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]]);
+ const bids = [DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0], DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]];
+ const request = spec.buildRequests(bids);
- it('should return valid banner and video requests', function () {
- const bannerImp = JSON.parse(request[0].data.r).imp[0];
- expect(JSON.parse(request[0].data.r).imp).to.have.lengthOf(2);
+ it('should return valid banner requests', function () {
+ const impressions = JSON.parse(request[0].data.r).imp;
+
+ expect(impressions).to.have.lengthOf(2);
expect(JSON.parse(request[0].data.v)).to.equal(BANNER_ENDPOINT_VERSION);
- expect(bannerImp.id).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].bidId);
- expect(bannerImp.banner).to.exist;
- expect(bannerImp.banner.w).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].params.size[0]);
- expect(bannerImp.banner.h).to.equal(DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0].params.size[1]);
- const videoImp = JSON.parse(request[1].data.r).imp[0];
+ impressions.map((impression, index) => {
+ const bid = bids[index];
+
+ expect(impression.id).to.equal(bid.bidId);
+ expect(impression.banner.format).to.be.length(bid.mediaTypes.banner.sizes.length);
+ expect(impression.banner.topframe).to.be.oneOf([0, 1]);
+
+ impression.banner.format.map(({ w, h, ext }, index) => {
+ const size = bid.mediaTypes.banner.sizes[index];
+ const sidValue = utils.parseGPTSingleSizeArray(size);
+
+ expect(w).to.equal(size[0]);
+ expect(h).to.equal(size[1]);
+ expect(ext.siteID).to.equal(bid.params.siteId.toString());
+ expect(ext.sid).to.equal(sidValue);
+ });
+ });
+ });
+
+ it('should return valid banner and video requests', function () {
+ const videoImpression = JSON.parse(request[1].data.r).imp[0];
+
expect(JSON.parse(request[1].data.r).imp).to.have.lengthOf(1);
expect(JSON.parse(request[1].data.v)).to.equal(VIDEO_ENDPOINT_VERSION);
- expect(videoImp.id).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].bidId);
- expect(videoImp.video).to.exist;
- expect(videoImp.video.w).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].params.size[0]);
- expect(videoImp.video.h).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].params.size[1]);
+ expect(videoImpression.id).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].bidId);
+ expect(videoImpression.video.w).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].mediaTypes.video.playerSize[0]);
+ expect(videoImpression.video.h).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].mediaTypes.video.playerSize[1]);
});
it('should contain all correct IXdiag properties', function () {
const diagObj = JSON.parse(request[0].data.r).ext.ixdiag;
expect(diagObj.iu).to.equal(0);
expect(diagObj.nu).to.equal(0);
- expect(diagObj.ou).to.equal(1);
+ expect(diagObj.ou).to.equal(2);
expect(diagObj.ren).to.equal(false);
- expect(diagObj.mfu).to.equal(1);
- expect(diagObj.allu).to.equal(1);
+ expect(diagObj.mfu).to.equal(2);
+ expect(diagObj.allu).to.equal(2);
expect(diagObj.version).to.equal('$prebid.version$');
});
});
diff --git a/test/spec/modules/jcmBidAdapter_spec.js b/test/spec/modules/jcmBidAdapter_spec.js
deleted file mode 100644
index 9d84bca5513..00000000000
--- a/test/spec/modules/jcmBidAdapter_spec.js
+++ /dev/null
@@ -1,139 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/jcmBidAdapter.js';
-import { newBidder } from 'src/adapters/bidderFactory.js';
-
-const ENDPOINT = 'https://media.adfrontiers.com/';
-
-describe('jcmAdapter', 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': 'jcm',
- 'params': {
- 'siteId': '3608'
- },
- 'adUnitCode': 'adunit-code',
- '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;
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
- });
-
- describe('buildRequests', function () {
- let bidRequests = [
- {
- 'bidder': 'jcm',
- 'params': {
- 'siteId': '3608'
- },
- 'adUnitCode': 'adunit-code',
- 'sizes': [[300, 250], [300, 600]],
- 'bidId': '30b31c1838de1e',
- 'bidderRequestId': '22edbae2733bf6',
- 'auctionId': '1d1a030790a475',
- }
-
- ];
-
- const request = spec.buildRequests(bidRequests);
-
- it('sends bid request to ENDPOINT via GET', function () {
- expect(request.method).to.equal('GET');
- });
-
- it('sends correct bid parameters', function () {
- const payloadArr = request.data.split('&');
- expect(request.method).to.equal('GET');
- expect(payloadArr.length).to.equal(4);
- expect(payloadArr[0]).to.equal('t=hb');
- expect(payloadArr[1]).to.equal('ver=1.0');
- expect(payloadArr[2]).to.equal('compact=true');
- const adReqStr = request.data.split('&bids=')[1];
- const adReq = JSON.parse(decodeURIComponent(adReqStr));
- const adReqBid = JSON.parse(decodeURIComponent(adReqStr)).bids[0];
- expect(adReqBid.siteId).to.equal('3608');
- expect(adReqBid.callbackId).to.equal('30b31c1838de1e');
- expect(adReqBid.adSizes).to.equal('300x250,300x600');
- });
- });
-
- describe('interpretResponse', function () {
- it('should get correct bid response', function () {
- let serverResponse = {'bids': [{'width': 300, 'height': 250, 'creativeId': '29681110', 'ad': '', 'cpm': 0.5, 'callbackId': '30b31c1838de1e'}]};
-
- let expectedResponse = [
- {
- 'requestId': '30b31c1838de1e',
- 'bidderCode': 'jcm',
- 'cpm': 0.5,
- 'creativeId': '29681110',
- 'width': 300,
- 'height': 250,
- 'ttl': 60,
- 'currency': 'USA',
- 'netRevenue': true,
- 'ad': '',
- }
- ];
-
- let result = spec.interpretResponse({ body: serverResponse });
- expect(Object.keys(result[0]).length).to.equal(Object.keys(expectedResponse[0]).length);
- expect(Object.keys(result[0]).requestId).to.equal(Object.keys(expectedResponse[0]).requestId);
- expect(Object.keys(result[0]).bidderCode).to.equal(Object.keys(expectedResponse[0]).bidderCode);
- expect(Object.keys(result[0]).cpm).to.equal(Object.keys(expectedResponse[0]).cpm);
- expect(Object.keys(result[0]).creativeId).to.equal(Object.keys(expectedResponse[0]).creativeId);
- expect(Object.keys(result[0]).width).to.equal(Object.keys(expectedResponse[0]).width);
- expect(Object.keys(result[0]).height).to.equal(Object.keys(expectedResponse[0]).height);
- expect(Object.keys(result[0]).ttl).to.equal(Object.keys(expectedResponse[0]).ttl);
- expect(Object.keys(result[0]).currency).to.equal(Object.keys(expectedResponse[0]).currency);
- expect(Object.keys(result[0]).netRevenue).to.equal(Object.keys(expectedResponse[0]).netRevenue);
-
- expect(Object.keys(result[0]).ad).to.equal(Object.keys(expectedResponse[0]).ad);
- });
-
- it('handles nobid responses', function () {
- let serverResponse = {'bids': []};
-
- let result = spec.interpretResponse({ body: serverResponse });
- expect(result.length).to.equal(0);
- });
- });
- describe('getUserSyncs', function () {
- it('Verifies sync iframe option', function () {
- expect(spec.getUserSyncs({})).to.be.undefined;
- expect(spec.getUserSyncs({ iframeEnabled: false })).to.be.undefined;
- const options = spec.getUserSyncs({ iframeEnabled: true });
- expect(options).to.not.be.undefined;
- expect(options).to.have.lengthOf(1);
- expect(options[0].type).to.equal('iframe');
- expect(options[0].url).to.equal('https://media.adfrontiers.com/hb/jcm_usersync.html');
- });
-
- it('Verifies sync image option', function () {
- expect(spec.getUserSyncs({ image: false })).to.be.undefined;
- const options = spec.getUserSyncs({ image: true });
- expect(options).to.not.be.undefined;
- expect(options).to.have.lengthOf(1);
- expect(options[0].type).to.equal('image');
- expect(options[0].url).to.equal('https://media.adfrontiers.com/hb/jcm_usersync.png');
- });
- });
-});
diff --git a/test/spec/modules/jixieBidAdapter_spec.js b/test/spec/modules/jixieBidAdapter_spec.js
index 842f9e0ed30..ae58da30f64 100644
--- a/test/spec/modules/jixieBidAdapter_spec.js
+++ b/test/spec/modules/jixieBidAdapter_spec.js
@@ -281,7 +281,8 @@ describe('jixie Adapter', function () {
},
'vastUrl': 'https://ad.jixie.io/v1/video?creativeid=522'
},
- // display ad returned here:
+ // display ad returned here: This one there is advertiserDomains
+ // in the response . Will be checked in the unit tests below
{
'trackingUrlBase': 'https://tr.jixie.io/sync/ad?',
'jxBidId': '600c9ae6fda1acb-028d5dee-2c83-44e3-bed1-b75002475cdf',
@@ -411,6 +412,9 @@ describe('jixie Adapter', function () {
expect(result[0].ttl).to.equal(300)
expect(result[0].vastUrl).to.include('https://ad.jixie.io/v1/video?creativeid=')
expect(result[0].trackingUrlBase).to.include('sync')
+ // We will always make sure the meta->advertiserDomains property is there
+ // If no info it is an empty array.
+ expect(result[0].meta.advertiserDomains.length).to.equal(0)
// display ad
expect(result[1].requestId).to.equal('600c9ae6fda1acb')
@@ -422,6 +426,7 @@ describe('jixie Adapter', function () {
expect(result[1].netRevenue).to.equal(true)
expect(result[1].ttl).to.equal(300)
expect(result[1].ad).to.include('jxoutstream')
+ expect(result[1].meta.advertiserDomains.length).to.equal(3)
expect(result[1].trackingUrlBase).to.include('sync')
// should pick up about using alternative outstream renderer
@@ -436,6 +441,7 @@ describe('jixie Adapter', function () {
expect(result[2].vastXml).to.include('')
expect(result[2].trackingUrlBase).to.include('sync');
expect(result[2].renderer.id).to.equal('demoslot4-div')
+ expect(result[2].meta.advertiserDomains.length).to.equal(0)
expect(result[2].renderer.url).to.equal(JX_OTHER_OUTSTREAM_RENDERER_URL);
// should know to use default outstream renderer
@@ -450,6 +456,7 @@ describe('jixie Adapter', function () {
expect(result[3].vastXml).to.include('')
expect(result[3].trackingUrlBase).to.include('sync');
expect(result[3].renderer.id).to.equal('demoslot2-div')
+ expect(result[3].meta.advertiserDomains.length).to.equal(0)
expect(result[3].renderer.url).to.equal(JX_OUTSTREAM_RENDERER_URL)
setLocalStorageSpy.restore();
diff --git a/test/spec/modules/justpremiumBidAdapter_spec.js b/test/spec/modules/justpremiumBidAdapter_spec.js
index 7cc154254ff..cb3648cba44 100644
--- a/test/spec/modules/justpremiumBidAdapter_spec.js
+++ b/test/spec/modules/justpremiumBidAdapter_spec.js
@@ -103,7 +103,8 @@ describe('justpremium adapter', function () {
'width': 970,
'price': 0.52,
'format': 'lb',
- 'adm': 'creative code'
+ 'adm': 'creative code',
+ 'adomain': ['justpremium.com']
}]
},
'pass': {
@@ -123,7 +124,10 @@ describe('justpremium adapter', function () {
netRevenue: true,
currency: 'USD',
ttl: 60000,
- format: 'lb'
+ format: 'lb',
+ meta: {
+ advertiserDomains: ['justpremium.com']
+ },
}
]
@@ -140,6 +144,7 @@ describe('justpremium adapter', function () {
expect(result[0].creativeId).to.equal(3213123)
expect(result[0].netRevenue).to.equal(true)
expect(result[0].format).to.equal('lb')
+ expect(result[0].meta.advertiserDomains[0]).to.equal('justpremium.com')
})
it('Verify wrong server response', function () {
diff --git a/test/spec/modules/komoonaBidAdapter_spec.js b/test/spec/modules/komoonaBidAdapter_spec.js
deleted file mode 100644
index 3d62f91cae6..00000000000
--- a/test/spec/modules/komoonaBidAdapter_spec.js
+++ /dev/null
@@ -1,164 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/komoonaBidAdapter.js';
-
-describe('Komoona.com Adapter Tests', function () {
- const bidsRequest = [
- {
- bidder: 'komoona',
- params: {
- placementId: '170577',
- hbid: 'abc12345678',
- },
- placementCode: 'div-gpt-ad-1460505748561-0',
- transactionId: '9f801c02-bbe8-4683-8ed4-bc816ea186bb',
- sizes: [
- [300, 250]
- ],
- bidId: '2faedf1095f815',
- bidderRequestId: '18065867f8ae39',
- auctionId: '529e1518-b872-45cf-807c-2d41dfa5bcd3'
- },
- {
- bidder: 'komoona',
- params: {
- placementId: '281277',
- hbid: 'abc12345678',
- floorPrice: 0.5
- },
- placementCode: 'div-gpt-ad-1460505748561-0',
- transactionId: '9f801c02-bbe8-4683-8ed4-bc816ea186bb',
- sizes: [
- [728, 90]
- ],
- bidId: '3c34e2367a3f59',
- bidderRequestId: '18065867f8ae39',
- auctionId: '529e1518-b872-45cf-807c-2d41dfa5bcd3'
- }];
-
- const bidsResponse = {
- body: {
- bids: [
- {
- placementid: '170577',
- uuid: '2faedf1095f815',
- width: 300,
- height: 250,
- cpm: 0.51,
- creative: '',
- ttl: 360,
- currency: 'USD',
- netRevenue: true,
- creativeId: 'd30b58c2ba'
- }
- ]
- }
- };
-
- it('Verifies komoonaAdapter bidder code', function () {
- expect(spec.code).to.equal('komoona');
- });
-
- it('Verifies komoonaAdapter bid request validation', function () {
- expect(spec.isBidRequestValid(bidsRequest[0])).to.equal(true);
- expect(spec.isBidRequestValid(bidsRequest[1])).to.equal(true);
- expect(spec.isBidRequestValid({})).to.equal(false);
- expect(spec.isBidRequestValid({ params: {} })).to.equal(false);
- expect(spec.isBidRequestValid({ params: { hbid: 12345 } })).to.equal(false);
- expect(spec.isBidRequestValid({ params: { placementid: 12345 } })).to.equal(false);
- expect(spec.isBidRequestValid({ params: { hbid: 12345, placementId: 67890 } })).to.equal(true);
- expect(spec.isBidRequestValid({ params: { hbid: 12345, placementId: 67890, floorPrice: 0.8 } })).to.equal(true);
- });
-
- it('Verify komoonaAdapter build request', function () {
- var startTime = new Date().getTime();
-
- const request = spec.buildRequests(bidsRequest);
- expect(request.url).to.equal('https://bidder.komoona.com/v1/GetSBids');
- expect(request.method).to.equal('POST');
- const requestData = JSON.parse(request.data);
-
- // bids object
- let bids = requestData.bids;
- expect(bids).to.have.lengthOf(2);
-
- // first bid request: no floor price
- expect(bids[0].uuid).to.equal('2faedf1095f815');
- expect(bids[0].floorprice).to.be.undefined;
- expect(bids[0].placementid).to.equal('170577');
- expect(bids[0].hbid).to.equal('abc12345678');
- expect(bids[0].trid).to.equal('9f801c02-bbe8-4683-8ed4-bc816ea186bb');
- expect(bids[0].sizes).to.have.lengthOf(1);
- expect(bids[0].sizes[0][0]).to.equal(300);
- expect(bids[0].sizes[0][1]).to.equal(250);
-
- // second bid request: with floor price
- expect(bids[1].uuid).to.equal('3c34e2367a3f59');
- expect(bids[1].floorprice).to.equal(0.5);
- expect(bids[1].placementid).to.equal('281277');
- expect(bids[1].hbid).to.equal('abc12345678');
- expect(bids[1].trid).to.equal('9f801c02-bbe8-4683-8ed4-bc816ea186bb');
- expect(bids[1]).to.have.property('sizes')
- .that.is.an('array')
- .of.length(1)
- .that.deep.equals([[728, 90]]);
-
- // kbConf object
- let kbConf = requestData.kbConf;
- expect(kbConf.hdbdid).to.equal(bids[0].hbid);
- expect(kbConf.hdbdid).to.equal(bids[1].hbid);
- expect(kbConf.encode_bid).to.be.undefined;
- // kbConf timezone and cb
- expect(kbConf.cb).not.to.be.undefined;
- expect(kbConf.ts_as).to.be.above(startTime - 1);
- expect(kbConf.tz).to.equal(new Date().getTimezoneOffset());
- // kbConf bid ids
- expect(kbConf.hb_placement_bidids)
- .to.have.property(bids[0].placementid)
- .that.equal(bids[0].uuid);
- expect(kbConf.hb_placement_bidids)
- .to.have.property(bids[1].placementid)
- .that.equal(bids[1].uuid);
- // kbConf floor price
- expect(kbConf.hb_floors).not.to.have.property(bids[0].placementid)
- expect(kbConf.hb_floors).to.have.property(bids[1].placementid).that.equal(bids[1].floorprice);
- // kbConf placement ids
- expect(kbConf.hb_placements).to.have.lengthOf(2);
- expect(kbConf.hb_placements[0]).to.equal(bids[0].placementid);
- expect(kbConf.hb_placements[1]).to.equal(bids[1].placementid);
- });
-
- it('Verify komoonaAdapter build response', function () {
- const request = spec.buildRequests(bidsRequest);
- const bids = spec.interpretResponse(bidsResponse, request);
-
- // 'server' return single bid
- expect(bids).to.have.lengthOf(1);
-
- // verify bid object
- const bid = bids[0];
- const responseBids = bidsResponse.body.bids;
-
- expect(bid.cpm).to.equal(responseBids[0].cpm);
- expect(bid.ad).to.equal(responseBids[0].creative);
- expect(bid.requestId).equal(responseBids[0].uuid);
- expect(bid.uuid).equal(responseBids[0].uuid);
- expect(bid.width).to.equal(responseBids[0].width);
- expect(bid.height).to.equal(responseBids[0].height);
- expect(bid.ttl).to.equal(responseBids[0].ttl);
- expect(bid.currency).to.equal('USD');
- expect(bid.netRevenue).to.equal(true);
- expect(bid.creativeId).to.equal(responseBids[0].creativeId);
- });
-
- it('Verifies komoonaAdapter sync options', function () {
- // user sync disabled
- expect(spec.getUserSyncs({})).to.be.undefined;
- expect(spec.getUserSyncs({ iframeEnabled: false })).to.be.undefined;
- // user sync enabled
- const options = spec.getUserSyncs({ iframeEnabled: true });
- expect(options).to.not.be.undefined;
- expect(options).to.have.lengthOf(1);
- expect(options[0].type).to.equal('iframe');
- expect(options[0].url).to.equal('https://s.komoona.com/sync/usync.html');
- });
-});
diff --git a/test/spec/modules/krushmediaBidAdapter_spec.js b/test/spec/modules/krushmediaBidAdapter_spec.js
deleted file mode 100644
index 3af9ed64c43..00000000000
--- a/test/spec/modules/krushmediaBidAdapter_spec.js
+++ /dev/null
@@ -1,329 +0,0 @@
-import {expect} from 'chai';
-import {spec} from '../../../modules/krushmediaBidAdapter.js';
-import { BANNER, VIDEO, NATIVE } from '../../../src/mediaTypes.js';
-
-describe('KrushmediabBidAdapter', function () {
- const bid = {
- bidId: '23fhj33i987f',
- bidder: 'krushmedia',
- mediaTypes: {
- [BANNER]: {
- sizes: [[300, 250]]
- }
- },
- params: {
- key: 783,
- traffic: BANNER
- }
- };
-
- const bidderRequest = {
- refererInfo: {
- referer: 'test.com'
- }
- };
-
- describe('isBidRequestValid', function () {
- it('Should return true if there are bidId, params and key parameters present', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
- });
- it('Should return false if at least one of parameters is not present', function () {
- delete bid.params.key;
- expect(spec.isBidRequestValid(bid)).to.be.false;
- });
- });
-
- describe('buildRequests', function () {
- let serverRequest = spec.buildRequests([bid], bidderRequest);
- it('Creates a ServerRequest object with method, URL and data', function () {
- expect(serverRequest).to.exist;
- expect(serverRequest.method).to.exist;
- expect(serverRequest.url).to.exist;
- expect(serverRequest.data).to.exist;
- });
- it('Returns POST method', function () {
- expect(serverRequest.method).to.equal('POST');
- });
- it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://ads4.krushmedia.com/?c=rtb&m=hb');
- });
- it('Returns valid data if array of bids is valid', function () {
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'language', 'secure', 'host', 'page', 'placements');
- expect(data.deviceWidth).to.be.a('number');
- expect(data.deviceHeight).to.be.a('number');
- expect(data.language).to.be.a('string');
- expect(data.secure).to.be.within(0, 1);
- expect(data.host).to.be.a('string');
- expect(data.page).to.be.a('string');
- expect(data.gdpr).to.not.exist;
- expect(data.ccpa).to.not.exist;
- let placement = data['placements'][0];
- expect(placement).to.have.keys('key', 'bidId', 'traffic', 'sizes', 'schain');
- expect(placement.key).to.equal(783);
- expect(placement.bidId).to.equal('23fhj33i987f');
- expect(placement.traffic).to.equal(BANNER);
- expect(placement.schain).to.be.an('object');
- expect(placement.sizes).to.be.an('array');
- });
-
- it('Returns valid data for mediatype video', function () {
- const playerSize = [300, 300];
- bid.mediaTypes = {};
- bid.params.traffic = VIDEO;
- bid.mediaTypes[VIDEO] = {
- playerSize
- };
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- let placement = data['placements'][0];
- expect(placement).to.be.an('object');
- expect(placement).to.have.keys('key', 'bidId', 'traffic', 'wPlayer', 'hPlayer', 'schain');
- expect(placement.traffic).to.equal(VIDEO);
- expect(placement.wPlayer).to.equal(playerSize[0]);
- expect(placement.hPlayer).to.equal(playerSize[1]);
- });
-
- it('Returns valid data for mediatype native', function () {
- const native = {
- title: {
- required: true
- },
- body: {
- required: true
- },
- icon: {
- required: true,
- size: [64, 64]
- }
- };
-
- bid.mediaTypes = {};
- bid.params.traffic = NATIVE;
- bid.mediaTypes[NATIVE] = native;
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data).to.be.an('object');
- let placement = data['placements'][0];
- expect(placement).to.be.an('object');
- expect(placement).to.have.keys('key', 'bidId', 'traffic', 'native', 'schain');
- expect(placement.traffic).to.equal(NATIVE);
- expect(placement.native).to.equal(native);
- });
-
- it('Returns data with gdprConsent and without uspConsent', function () {
- bidderRequest.gdprConsent = 'test';
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data.gdpr).to.exist;
- expect(data.gdpr).to.be.a('string');
- expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
- expect(data.ccpa).to.not.exist;
- delete bidderRequest.gdprConsent;
- });
-
- it('Returns data with uspConsent and without gdprConsent', function () {
- bidderRequest.uspConsent = 'test';
- serverRequest = spec.buildRequests([bid], bidderRequest);
- let data = serverRequest.data;
- expect(data.ccpa).to.exist;
- expect(data.ccpa).to.be.a('string');
- expect(data.ccpa).to.equal(bidderRequest.uspConsent);
- expect(data.gdpr).to.not.exist;
- });
-
- it('Returns empty data if no valid requests are passed', function () {
- serverRequest = spec.buildRequests([]);
- let data = serverRequest.data;
- expect(data.placements).to.be.an('array').that.is.empty;
- });
- });
- describe('interpretResponse', function () {
- it('Should interpret banner response', function () {
- const banner = {
- body: [{
- mediaType: 'banner',
- width: 300,
- height: 250,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let bannerResponses = spec.interpretResponse(banner);
- expect(bannerResponses).to.be.an('array').that.is.not.empty;
- let dataItem = bannerResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.width).to.equal(300);
- expect(dataItem.height).to.equal(250);
- expect(dataItem.ad).to.equal('Test');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret video response', function () {
- const video = {
- body: [{
- vastUrl: 'test.com',
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let videoResponses = spec.interpretResponse(video);
- expect(videoResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = videoResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
- 'netRevenue', 'currency', 'dealId', 'mediaType');
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.5);
- expect(dataItem.vastUrl).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should interpret native response', function () {
- const native = {
- body: [{
- mediaType: 'native',
- native: {
- clickUrl: 'test.com',
- title: 'Test',
- image: 'test.com',
- impressionTrackers: ['test.com'],
- },
- ttl: 120,
- cpm: 0.4,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let nativeResponses = spec.interpretResponse(native);
- expect(nativeResponses).to.be.an('array').that.is.not.empty;
-
- let dataItem = nativeResponses[0];
- expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native');
- expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
- expect(dataItem.requestId).to.equal('23fhj33i987f');
- expect(dataItem.cpm).to.equal(0.4);
- expect(dataItem.native.clickUrl).to.equal('test.com');
- expect(dataItem.native.title).to.equal('Test');
- expect(dataItem.native.image).to.equal('test.com');
- expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
- expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
- expect(dataItem.ttl).to.equal(120);
- expect(dataItem.creativeId).to.equal('2');
- expect(dataItem.netRevenue).to.be.true;
- expect(dataItem.currency).to.equal('USD');
- });
- it('Should return an empty array if invalid banner response is passed', function () {
- const invBanner = {
- body: [{
- width: 300,
- cpm: 0.4,
- ad: 'Test',
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
-
- let serverResponses = spec.interpretResponse(invBanner);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid video response is passed', function () {
- const invVideo = {
- body: [{
- mediaType: 'video',
- cpm: 0.5,
- requestId: '23fhj33i987f',
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invVideo);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid native response is passed', function () {
- const invNative = {
- body: [{
- mediaType: 'native',
- clickUrl: 'test.com',
- title: 'Test',
- impressionTrackers: ['test.com'],
- ttl: 120,
- requestId: '23fhj33i987f',
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- }]
- };
- let serverResponses = spec.interpretResponse(invNative);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- it('Should return an empty array if invalid response is passed', function () {
- const invalid = {
- body: [{
- ttl: 120,
- creativeId: '2',
- netRevenue: true,
- currency: 'USD',
- dealId: '1'
- }]
- };
- let serverResponses = spec.interpretResponse(invalid);
- expect(serverResponses).to.be.an('array').that.is.empty;
- });
- });
- describe('getUserSyncs', function() {
- it('Should return array of objects with proper sync config , include GDPR', function() {
- const syncData = spec.getUserSyncs({}, {}, {
- consentString: 'ALL',
- gdprApplies: true,
- }, {});
- expect(syncData).to.be.an('array').which.is.not.empty;
- expect(syncData[0]).to.be.an('object')
- expect(syncData[0].type).to.be.a('string')
- expect(syncData[0].type).to.equal('iframe')
- expect(syncData[0].url).to.be.a('string')
- expect(syncData[0].url).to.equal('https://cs.krushmedia.com/html?src=pbjs&gdpr=1&gdpr_consent=ALL')
- });
- it('Should return array of objects with proper sync config , include CCPA', function() {
- const syncData = spec.getUserSyncs({}, {}, {}, {
- consentString: '1NNN'
- });
- expect(syncData).to.be.an('array').which.is.not.empty;
- expect(syncData[0]).to.be.an('object')
- expect(syncData[0].type).to.be.a('string')
- expect(syncData[0].type).to.equal('iframe')
- expect(syncData[0].url).to.be.a('string')
- expect(syncData[0].url).to.equal('https://cs.krushmedia.com/html?src=pbjs&ccpa_consent=1NNN')
- });
- });
-});
diff --git a/test/spec/modules/kubientBidAdapter_spec.js b/test/spec/modules/kubientBidAdapter_spec.js
index 1df4370b2ba..5449de0c4de 100644
--- a/test/spec/modules/kubientBidAdapter_spec.js
+++ b/test/spec/modules/kubientBidAdapter_spec.js
@@ -1,14 +1,20 @@
import { expect, assert } from 'chai';
import { spec } from 'modules/kubientBidAdapter.js';
+import { BANNER, VIDEO } from '../../../src/mediaTypes.js';
describe('KubientAdapter', function () {
- let bid = {
+ let bidBanner = {
bidId: '2dd581a2b6281d',
bidder: 'kubient',
bidderRequestId: '145e1d6a7837c9',
params: {
- zoneid: '5678',
- floor: 0.05,
+ zoneid: '5678'
+ },
+ getFloor: function(params) {
+ return {
+ floor: 0.05,
+ currency: 'USD'
+ };
},
auctionId: '74f78609-a92d-4cf1-869f-1b244bbfb5d2',
mediaTypes: {
@@ -18,7 +24,44 @@ describe('KubientAdapter', function () {
},
transactionId: '3bb2f6da-87a6-4029-aeb0-bfe951372e62',
schain: {
- ver: '1.0',
+ ver: '1.1',
+ complete: 1,
+ nodes: [
+ {
+ asi: 'example.com',
+ sid: '0',
+ hp: 1,
+ rid: 'bidrequestid',
+ domain: 'example.com'
+ }
+ ]
+ }
+ };
+ let bidVideo = {
+ bidId: '1dd581a2b6281d',
+ bidder: 'kubient',
+ bidderRequestId: '245e1d6a7837c9',
+ params: {
+ zoneid: '5676'
+ },
+ getFloor: function(params) {
+ return {
+ floor: 1.0,
+ currency: 'USD'
+ };
+ },
+ auctionId: '74f78609-a92d-4cf1-869f-1b244bbfb5d1',
+ mediaTypes: {
+ video: {
+ context: 'instream',
+ playerSize: [640, 480],
+ mimes: ['video/mp4'],
+ protocols: [1]
+ }
+ },
+ transactionId: '3bb2f6da-87a6-4029-aeb0-bfe951372e61',
+ schain: {
+ ver: '1.1',
complete: 1,
nodes: [
{
@@ -48,11 +91,10 @@ describe('KubientAdapter', function () {
consentString: consentString,
gdprApplies: true
},
- uspConsent: uspConsentData,
- bids: [bid]
+ uspConsent: uspConsentData
};
- describe('buildRequests', function () {
- let serverRequests = spec.buildRequests([bid], bidderRequest);
+ describe('buildRequestBanner', function () {
+ let serverRequests = spec.buildRequests([bidBanner], Object.assign({}, bidderRequest, {bids: [bidBanner]}));
it('Creates a ServerRequest object with method, URL and data', function () {
expect(serverRequests).to.be.an('array');
});
@@ -67,7 +109,7 @@ describe('KubientAdapter', function () {
expect(serverRequest.method).to.equal('POST');
});
it('Returns valid URL', function () {
- expect(serverRequest.url).to.equal('https://kssp.kbntx.ch/pbjs');
+ expect(serverRequest.url).to.equal('https://kssp.kbntx.ch/kubprebidjs');
});
it('Returns valid data if array of bids is valid', function () {
let data = JSON.parse(serverRequest.data);
@@ -82,13 +124,53 @@ describe('KubientAdapter', function () {
expect(data.uspConsent).to.exist.and.to.equal(uspConsentData);
for (let j = 0; j < data['adSlots'].length; j++) {
let adSlot = data['adSlots'][i];
- expect(adSlot).to.have.all.keys('bidId', 'zoneId', 'floor', 'sizes', 'schain', 'mediaTypes');
- expect(adSlot.bidId).to.be.a('string');
- expect(adSlot.zoneId).to.be.a('string');
+ expect(adSlot).to.have.all.keys('bidId', 'zoneId', 'floor', 'banner', 'schain');
+ expect(adSlot.bidId).to.be.a('string').and.to.equal(bidBanner.bidId);
+ expect(adSlot.zoneId).to.be.a('string').and.to.equal(bidBanner.params.zoneid);
expect(adSlot.floor).to.be.a('number');
- expect(adSlot.sizes).to.be.an('array');
expect(adSlot.schain).to.be.an('object');
- expect(adSlot.mediaTypes).to.be.an('object');
+ expect(adSlot.banner).to.be.an('object');
+ }
+ });
+ }
+ });
+ describe('buildRequestVideo', function () {
+ let serverRequests = spec.buildRequests([bidVideo], Object.assign({}, bidderRequest, {bids: [bidVideo]}));
+ it('Creates a ServerRequest object with method, URL and data', function () {
+ expect(serverRequests).to.be.an('array');
+ });
+ for (let i = 0; i < serverRequests.length; i++) {
+ let serverRequest = serverRequests[i];
+ it('Creates a ServerRequest object with method, URL and data', function () {
+ expect(serverRequest.method).to.be.a('string');
+ expect(serverRequest.url).to.be.a('string');
+ expect(serverRequest.data).to.be.a('string');
+ });
+ it('Returns POST method', function () {
+ expect(serverRequest.method).to.equal('POST');
+ });
+ it('Returns valid URL', function () {
+ expect(serverRequest.url).to.equal('https://kssp.kbntx.ch/kubprebidjs');
+ });
+ it('Returns valid data if array of bids is valid', function () {
+ let data = JSON.parse(serverRequest.data);
+ expect(data).to.be.an('object');
+ expect(data).to.have.all.keys('v', 'requestId', 'adSlots', 'gdpr', 'referer', 'tmax', 'consent', 'consentGiven', 'uspConsent');
+ expect(data.v).to.exist.and.to.be.a('string');
+ expect(data.requestId).to.exist.and.to.be.a('string');
+ expect(data.referer).to.be.a('string');
+ expect(data.tmax).to.exist.and.to.be.a('number');
+ expect(data.gdpr).to.exist.and.to.be.within(0, 1);
+ expect(data.consent).to.equal(consentString);
+ expect(data.uspConsent).to.exist.and.to.equal(uspConsentData);
+ for (let j = 0; j < data['adSlots'].length; j++) {
+ let adSlot = data['adSlots'][i];
+ expect(adSlot).to.have.all.keys('bidId', 'zoneId', 'floor', 'video', 'schain');
+ expect(adSlot.bidId).to.be.a('string').and.to.equal(bidVideo.bidId);
+ expect(adSlot.zoneId).to.be.a('string').and.to.equal(bidVideo.params.zoneid);
+ expect(adSlot.floor).to.be.a('number');
+ expect(adSlot.schain).to.be.an('object');
+ expect(adSlot.video).to.be.an('object');
}
});
}
@@ -96,14 +178,18 @@ describe('KubientAdapter', function () {
describe('isBidRequestValid', function () {
it('Should return true when required params are found', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
+ expect(spec.isBidRequestValid(bidBanner)).to.be.true;
+ expect(spec.isBidRequestValid(bidVideo)).to.be.true;
});
it('Should return false when required params are not found', function () {
- expect(spec.isBidRequestValid(bid)).to.be.true;
+ expect(spec.isBidRequestValid(bidBanner)).to.be.true;
+ expect(spec.isBidRequestValid(bidVideo)).to.be.true;
});
it('Should return false when params are not found', function () {
- delete bid.params;
- expect(spec.isBidRequestValid(bid)).to.be.false;
+ delete bidBanner.params;
+ expect(spec.isBidRequestValid(bidBanner)).to.be.false;
+ delete bidVideo.params;
+ expect(spec.isBidRequestValid(bidVideo)).to.be.false;
});
});
@@ -124,7 +210,57 @@ describe('KubientAdapter', function () {
h: 250,
cur: 'USD',
netRevenue: false,
- ttl: 360
+ ttl: 360,
+ meta: {adomain: ['google.com', 'yahoo.com']}
+ }
+ ]
+ }
+ ]
+ }
+ };
+ let bannerResponses = spec.interpretResponse(serverResponse);
+ expect(bannerResponses).to.be.an('array').that.is.not.empty;
+ let dataItem = bannerResponses[0];
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'ad', 'creativeId', 'width', 'height', 'currency', 'netRevenue', 'ttl', 'meta');
+ expect(dataItem.requestId).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.seatbid[0].bid[0].bidId);
+ expect(dataItem.cpm).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[0].price);
+ expect(dataItem.ad).to.exist.and.to.be.a('string').and.to.have.string(serverResponse.body.seatbid[0].bid[0].adm);
+ expect(dataItem.creativeId).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.seatbid[0].bid[0].creativeId);
+ expect(dataItem.width).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[0].w);
+ expect(dataItem.height).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[0].h);
+ expect(dataItem.currency).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.seatbid[0].bid[0].cur);
+ expect(dataItem.netRevenue).to.exist.and.to.be.a('boolean').and.to.equal(serverResponse.body.seatbid[0].bid[0].netRevenue);
+ expect(dataItem.ttl).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[0].ttl);
+ expect(dataItem.meta).to.exist.and.to.be.a('object');
+ expect(dataItem.meta.advertiserDomains).to.exist.and.to.be.a('array').and.to.equal(serverResponse.body.seatbid[0].bid[0].meta.adomain);
+ });
+
+ it('Should return no ad when not given a server response', function () {
+ const ads = spec.interpretResponse(null);
+ expect(ads).to.be.an('array').and.to.have.length(0);
+ });
+ });
+
+ describe('interpretResponse Video', function () {
+ it('Should interpret response', function () {
+ const serverResponse = {
+ body:
+ {
+ seatbid: [
+ {
+ bid: [
+ {
+ bidId: '000',
+ price: 1.5,
+ adm: 'test
',
+ creativeId: 'creativeId',
+ w: 300,
+ h: 250,
+ mediaType: VIDEO,
+ cur: 'USD',
+ netRevenue: false,
+ ttl: 360,
+ meta: {adomain: ['google.com', 'yahoo.com']}
}
]
}
@@ -134,7 +270,7 @@ describe('KubientAdapter', function () {
let bannerResponses = spec.interpretResponse(serverResponse);
expect(bannerResponses).to.be.an('array').that.is.not.empty;
let dataItem = bannerResponses[0];
- expect(dataItem).to.have.all.keys('requestId', 'cpm', 'ad', 'creativeId', 'width', 'height', 'currency', 'netRevenue', 'ttl');
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'ad', 'creativeId', 'width', 'height', 'currency', 'netRevenue', 'ttl', 'meta', 'mediaType', 'vastXml');
expect(dataItem.requestId).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.seatbid[0].bid[0].bidId);
expect(dataItem.cpm).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[0].price);
expect(dataItem.ad).to.exist.and.to.be.a('string').and.to.have.string(serverResponse.body.seatbid[0].bid[0].adm);
@@ -144,6 +280,10 @@ describe('KubientAdapter', function () {
expect(dataItem.currency).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.seatbid[0].bid[0].cur);
expect(dataItem.netRevenue).to.exist.and.to.be.a('boolean').and.to.equal(serverResponse.body.seatbid[0].bid[0].netRevenue);
expect(dataItem.ttl).to.exist.and.to.be.a('number').and.to.equal(serverResponse.body.seatbid[0].bid[0].ttl);
+ expect(dataItem.meta).to.exist.and.to.be.a('object');
+ expect(dataItem.meta.advertiserDomains).to.exist.and.to.be.a('array').and.to.equal(serverResponse.body.seatbid[0].bid[0].meta.adomain);
+ expect(dataItem.mediaType).to.exist.and.to.equal(VIDEO);
+ expect(dataItem.vastXml).to.exist.and.to.be.a('string').and.to.equal(serverResponse.body.seatbid[0].bid[0].adm);
});
it('Should return no ad when not given a server response', function () {
diff --git a/test/spec/modules/lemmaBidAdapter_spec.js b/test/spec/modules/lemmaBidAdapter_spec.js
deleted file mode 100644
index a3a70a39731..00000000000
--- a/test/spec/modules/lemmaBidAdapter_spec.js
+++ /dev/null
@@ -1,426 +0,0 @@
-import { expect } from 'chai';
-import { spec } from 'modules/lemmaBidAdapter.js';
-import * as utils from 'src/utils.js';
-const constants = require('src/constants.json');
-
-describe('lemmaBidAdapter', function() {
- var bidRequests;
- var videoBidRequests;
- var bidResponses;
- beforeEach(function() {
- bidRequests = [{
- bidder: 'lemma',
- mediaType: 'banner',
- mediaTypes: {
- banner: {
- sizes: [
- [300, 250],
- [300, 600]
- ],
- }
- },
- params: {
- pubId: 1001,
- adunitId: 1,
- currency: 'AUD',
- bidFloor: 1.3,
- geo: {
- lat: '12.3',
- lon: '23.7',
- }
- },
- sizes: [
- [300, 250],
- [300, 600]
- ]
- }];
- videoBidRequests = [{
- code: 'video1',
- mediaType: 'video',
- mediaTypes: {
- video: {
- playerSize: [640, 480],
- context: 'instream'
- }
- },
- bidder: 'lemma',
- params: {
- pubId: 1001,
- adunitId: 1,
- bidFloor: 1.3,
- video: {
- mimes: ['video/mp4', 'video/x-flv'],
- skippable: true,
- minduration: 5,
- maxduration: 30
- }
- }
- }];
- bidResponses = {
- 'body': {
- 'id': '93D3BAD6-E2E2-49FB-9D89-920B1761C865',
- 'seatbid': [{
- 'bid': [{
- 'id': '74858439-49D7-4169-BA5D-44A046315B2F',
- 'impid': '22bddb28db77d',
- 'price': 1.3,
- 'adm': 'lemma"Connecting Advertisers and Publishers directly"
',
- 'adomain': ['amazon.com'],
- 'iurl': 'https://thetradedesk-t-general.s3.amazonaws.com/AdvertiserLogos/vgl908z.png',
- 'cid': '22918',
- 'crid': 'v55jutrh',
- 'h': 250,
- 'w': 300,
- 'ext': {}
- }]
- }]
- }
- };
- });
- describe('implementation', function() {
- describe('Bid validations', function() {
- it('valid bid case', function() {
- var validBid = {
- bidder: 'lemma',
- params: {
- pubId: 1001,
- adunitId: 1
- }
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(true);
- });
- it('invalid bid case', function() {
- var isValid = spec.isBidRequestValid();
- expect(isValid).to.equal(false);
- });
- it('invalid bid case: pubId not passed', function() {
- var validBid = {
- bidder: 'lemma',
- params: {
- adunitId: 1
- }
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- });
- it('invalid bid case: pubId is not number', function() {
- var validBid = {
- bidder: 'lemma',
- params: {
- pubId: '301',
- adunitId: 1
- }
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- });
- it('invalid bid case: adunitId is not passed', function() {
- var validBid = {
- bidder: 'lemma',
- params: {
- pubId: 1001
- }
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- });
- it('invalid bid case: video bid request mimes is not passed', function() {
- var validBid = {
- bidder: 'lemma',
- params: {
- pubId: 1001,
- adunitId: 1,
- video: {
- skippable: true,
- minduration: 5,
- maxduration: 30
- }
- }
- },
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- validBid.params.video.mimes = [];
- isValid = spec.isBidRequestValid(validBid);
- expect(isValid).to.equal(false);
- });
- });
- describe('Request formation', function() {
- it('buildRequests function should not modify original bidRequests object', function() {
- var originalBidRequests = utils.deepClone(bidRequests);
- var request = spec.buildRequests(bidRequests);
- expect(bidRequests).to.deep.equal(originalBidRequests);
- });
- it('Endpoint checking', function() {
- var request = spec.buildRequests(bidRequests);
- expect(request.url).to.equal('https://ads.lemmatechnologies.com/lemma/servad?pid=1001&aid=1');
- expect(request.method).to.equal('POST');
- });
- it('Request params check', function() {
- var request = spec.buildRequests(bidRequests);
- var data = JSON.parse(request.data);
- expect(data.site.domain).to.be.a('string'); // domain should be set
- expect(data.site.publisher.id).to.equal(bidRequests[0].params.pubId.toString()); // publisher Id
- expect(data.imp[0].tagid).to.equal('1'); // tagid
- expect(data.imp[0].bidfloorcur).to.equal(bidRequests[0].params.currency);
- expect(data.imp[0].bidfloor).to.equal(bidRequests[0].params.bidFloor);
- });
- it('Request params check without mediaTypes object', function() {
- var bidRequests = [{
- bidder: 'lemma',
- params: {
- pubId: 1001,
- adunitId: 1,
- currency: 'AUD'
- },
- sizes: [
- [300, 250],
- [300, 600]
- ]
- }];
- var request = spec.buildRequests(bidRequests);
- var data = JSON.parse(request.data);
- expect(data.imp[0].banner.w).to.equal(300); // width
- expect(data.imp[0].banner.h).to.equal(250); // height
- expect(data.imp[0].banner.format).exist.and.to.be.an('array');
- expect(data.imp[0].banner.format[0]).exist.and.to.be.an('object');
- expect(data.imp[0].banner.format[0].w).to.equal(300); // width
- expect(data.imp[0].banner.format[0].h).to.equal(600); // height
- });
- it('Request params check: without tagId', function() {
- delete bidRequests[0].params.adunitId;
- var request = spec.buildRequests(bidRequests);
- var data = JSON.parse(request.data);
- expect(data.site.domain).to.be.a('string'); // domain should be set
- expect(data.site.publisher.id).to.equal(bidRequests[0].params.pubId.toString()); // publisher Id
- expect(data.imp[0].tagid).to.equal(undefined); // tagid
- expect(data.imp[0].bidfloorcur).to.equal(bidRequests[0].params.currency);
- expect(data.imp[0].bidfloor).to.equal(bidRequests[0].params.bidFloor);
- });
- it('Request params multi size format object check', function() {
- var bidRequests = [{
- bidder: 'lemma',
- mediaTypes: {
- banner: {
- sizes: [
- [300, 250],
- [300, 600]
- ],
- }
- },
- params: {
- pubId: 1001,
- adunitId: 1,
- currency: 'AUD'
- },
- sizes: [
- [300, 250],
- [300, 600]
- ]
- }];
- /* case 1 - size passed in adslot */
- var request = spec.buildRequests(bidRequests);
- var data = JSON.parse(request.data);
- expect(data.imp[0].banner.w).to.equal(300); // width
- expect(data.imp[0].banner.h).to.equal(250); // height
- /* case 2 - size passed in adslot as well as in sizes array */
- bidRequests[0].sizes = [
- [300, 600],
- [300, 250]
- ];
- bidRequests[0].mediaTypes = {
- banner: {
- sizes: [
- [300, 600],
- [300, 250]
- ]
- }
- };
- request = spec.buildRequests(bidRequests);
- data = JSON.parse(request.data);
- expect(data.imp[0].banner.w).to.equal(300); // width
- expect(data.imp[0].banner.h).to.equal(600); // height
- /* case 3 - size passed in sizes but not in adslot */
- bidRequests[0].params.adunitId = 1;
- bidRequests[0].sizes = [
- [300, 250],
- [300, 600]
- ];
- bidRequests[0].mediaTypes = {
- banner: {
- sizes: [
- [300, 250],
- [300, 600]
- ]
- }
- };
- request = spec.buildRequests(bidRequests);
- data = JSON.parse(request.data);
- expect(data.imp[0].banner.w).to.equal(300); // width
- expect(data.imp[0].banner.h).to.equal(250); // height
- expect(data.imp[0].banner.format).exist.and.to.be.an('array');
- expect(data.imp[0].banner.format[0]).exist.and.to.be.an('object');
- expect(data.imp[0].banner.format[0].w).to.equal(300); // width
- expect(data.imp[0].banner.format[0].h).to.equal(250); // height
- });
- it('Request params currency check', function() {
- var bidRequest = [{
- bidder: 'lemma',
- mediaTypes: {
- banner: {
- sizes: [
- [300, 250],
- [300, 600]
- ],
- }
- },
- params: {
- pubId: 1001,
- adunitId: 1,
- currency: 'AUD'
- },
- sizes: [
- [300, 250],
- [300, 600]
- ]
- }];
- /* case 1 -
- currency specified in adunits
- output: imp[0] use currency specified in bidRequests[0].params.currency
- */
- var request = spec.buildRequests(bidRequest);
- var data = JSON.parse(request.data);
- expect(data.imp[0].bidfloorcur).to.equal(bidRequests[0].params.currency);
- /* case 2 -
- currency specified in adunit
- output: imp[0] use default currency - USD
- */
- delete bidRequest[0].params.currency;
- request = spec.buildRequests(bidRequest);
- data = JSON.parse(request.data);
- expect(data.imp[0].bidfloorcur).to.equal('USD');
- });
- it('Request params check for video ad', function() {
- var request = spec.buildRequests(videoBidRequests);
- var data = JSON.parse(request.data);
- expect(data.imp[0].video).to.exist;
- expect(data.imp[0].tagid).to.equal('1');
- expect(data.imp[0]['video']['mimes']).to.exist.and.to.be.an('array');
- expect(data.imp[0]['video']['mimes'][0]).to.equal(videoBidRequests[0].params.video['mimes'][0]);
- expect(data.imp[0]['video']['mimes'][1]).to.equal(videoBidRequests[0].params.video['mimes'][1]);
- expect(data.imp[0]['video']['minduration']).to.equal(videoBidRequests[0].params.video['minduration']);
- expect(data.imp[0]['video']['maxduration']).to.equal(videoBidRequests[0].params.video['maxduration']);
- expect(data.imp[0]['video']['w']).to.equal(videoBidRequests[0].mediaTypes.video.playerSize[0]);
- expect(data.imp[0]['video']['h']).to.equal(videoBidRequests[0].mediaTypes.video.playerSize[1]);
- });
- describe('setting imp.floor using floorModule', function() {
- /*
- Use the minimum value among floor from floorModule per mediaType
- If params.bidFloor is set then take max(floor, min(floors from floorModule))
- set imp.bidfloor only if it is more than 0
- */
-
- let newRequest;
- let floorModuleTestData;
- let getFloor = function(req) {
- return floorModuleTestData[req.mediaType];
- };
-
- beforeEach(() => {
- floorModuleTestData = {
- 'banner': {
- 'currency': 'AUD',
- 'floor': 1.50
- },
- 'video': {
- 'currency': 'AUD',
- 'floor': 2.00
- }
- };
- newRequest = utils.deepClone(bidRequests);
- newRequest[0].getFloor = getFloor;
- });
-
- it('bidfloor should be undefined if calculation is <= 0', function() {
- floorModuleTestData.banner.floor = 0; // lowest of them all
- newRequest[0].params.bidFloor = undefined;
- let request = spec.buildRequests(newRequest);
- let data = JSON.parse(request.data);
- data = data.imp[0];
- expect(data.bidfloor).to.equal(undefined);
- });
-
- it('ignore floormodule o/p if floor is not number', function() {
- floorModuleTestData.banner.floor = 'INR';
- newRequest[0].params.bidFloor = undefined;
- let request = spec.buildRequests(newRequest);
- let data = JSON.parse(request.data);
- data = data.imp[0];
- expect(data.bidfloor).to.equal(undefined); // video will be lowest now
- });
-
- it('ignore floormodule o/p if currency is not matched', function() {
- floorModuleTestData.banner.currency = 'INR';
- newRequest[0].params.bidFloor = undefined;
- let request = spec.buildRequests(newRequest);
- let data = JSON.parse(request.data);
- data = data.imp[0];
- expect(data.bidfloor).to.equal(undefined); // video will be lowest now
- });
-
- it('bidFloor is not passed, use minimum from floorModule', function() {
- newRequest[0].params.bidFloor = undefined;
- let request = spec.buildRequests(newRequest);
- let data = JSON.parse(request.data);
- data = data.imp[0];
- expect(data.bidfloor).to.equal(1.5);
- });
-
- it('bidFloor is passed as 1, use min of floorModule as it is highest', function() {
- newRequest[0].params.bidFloor = '1.0';// yes, we want it as a string
- let request = spec.buildRequests(newRequest);
- let data = JSON.parse(request.data);
- data = data.imp[0];
- expect(data.bidfloor).to.equal(1.5);
- });
- });
- describe('Response checking', function() {
- it('should check for valid response values', function() {
- var request = spec.buildRequests(bidRequests);
- var data = JSON.parse(request.data);
- var response = spec.interpretResponse(bidResponses, request);
- expect(response).to.be.an('array').with.length.above(0);
- expect(response[0].requestId).to.equal(bidResponses.body.seatbid[0].bid[0].impid);
- expect(response[0].cpm).to.equal((bidResponses.body.seatbid[0].bid[0].price).toFixed(2));
- expect(response[0].width).to.equal(bidResponses.body.seatbid[0].bid[0].w);
- expect(response[0].height).to.equal(bidResponses.body.seatbid[0].bid[0].h);
- if (bidResponses.body.seatbid[0].bid[0].crid) {
- expect(response[0].creativeId).to.equal(bidResponses.body.seatbid[0].bid[0].crid);
- } else {
- expect(response[0].creativeId).to.equal(bidResponses.body.seatbid[0].bid[0].id);
- }
- expect(response[0].dealId).to.equal(bidResponses.body.seatbid[0].bid[0].dealid);
- expect(response[0].currency).to.equal('USD');
- expect(response[0].netRevenue).to.equal(false);
- expect(response[0].ttl).to.equal(300);
- });
- });
- });
- describe('getUserSyncs', function() {
- const syncurl_iframe = 'https://sync.lemmatechnologies.com/js/usersync.html?pid=1001';
- let sandbox;
- beforeEach(function() {
- sandbox = sinon.sandbox.create();
- });
- afterEach(function() {
- sandbox.restore();
- });
-
- it('execute as per config', function() {
- expect(spec.getUserSyncs({ iframeEnabled: true }, {}, undefined, undefined)).to.deep.equal([{
- type: 'iframe', url: syncurl_iframe
- }]);
- });
- });
- });
-});
diff --git a/test/spec/modules/lifestreetBidAdapter_spec.js b/test/spec/modules/lifestreetBidAdapter_spec.js
deleted file mode 100644
index d66727da644..00000000000
--- a/test/spec/modules/lifestreetBidAdapter_spec.js
+++ /dev/null
@@ -1,232 +0,0 @@
-import { expect } from 'chai';
-import { BANNER, VIDEO } from 'src/mediaTypes.js';
-import { spec } from 'modules/lifestreetBidAdapter.js';
-
-describe('lifestreetBidAdapter', function() {
- let bidRequests;
- let videoBidRequests;
- let bidResponses;
- let videoBidResponses;
- beforeEach(function() {
- bidRequests = [
- {
- bidder: 'lifestreet',
- params: {
- slot: 'slot166704',
- adkey: '78c',
- ad_size: '160x600'
- },
- mediaTypes: {
- banner: {
- sizes: [
- [160, 600],
- [300, 600]
- ]
- }
- },
- sizes: [
- [160, 600],
- [300, 600]
- ]
- }
- ];
-
- bidResponses = {
- body: {
- cpm: 0.1,
- netRevenue: true,
- content_type: 'display_flash',
- width: 160,
- currency: 'USD',
- ttl: 86400,
- content: '