From fc904874260d578a29ba75fe77109046f4cc6f64 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Wed, 26 Apr 2017 11:58:32 -0600 Subject: [PATCH 001/111] initial implementation of module system --- gulpHelpers.js | 78 ++++++++++++++++++++++---- gulpfile.js | 54 ++++++++++++++++-- moduleConfig.json | 5 ++ package.json | 4 ++ src/dependencyResolver.js | 65 ++++++++++++++++++++++ src/modules.js | 112 ++++++++++++++++++++++++++++++++++++++ src/prebid.js | 13 ++++- webpack.conf.js | 7 +-- yarn.lock | 87 ++++++++++++++++++++++++++--- 9 files changed, 393 insertions(+), 32 deletions(-) create mode 100644 moduleConfig.json create mode 100644 src/dependencyResolver.js create mode 100644 src/modules.js diff --git a/gulpHelpers.js b/gulpHelpers.js index 6091dc4c495..494e8876a2c 100644 --- a/gulpHelpers.js +++ b/gulpHelpers.js @@ -4,6 +4,25 @@ const path = require('path'); const argv = require('yargs').argv; const MANIFEST = 'package.json'; const exec = require('child_process').exec; +const through = require('through2'); +const _ = require('lodash'); + +const MODULE_PATH = './modules'; +const BUILD_PATH = './build/dist'; +const DEV_PATH = './build/dev'; + + +// get only subdirectories that contain package.json with 'main' property +function isModuleDirectory(filePath) { + try { + const manifestPath = path.join(filePath, MANIFEST); + if (fs.statSync(manifestPath).isFile()) { + const module = require(manifestPath); + return module && module.main; + } + } + catch (error) {} +} module.exports = { parseBrowserArgs: function (argv) { @@ -21,6 +40,53 @@ module.exports = { .replace(/\/>/g, '\\/>'); }, + getModules: _.memoize(function() { + try { + return fs.readdirSync(MODULE_PATH) + .reduce((memo, file) => { + let moduleName = file.split(new RegExp('[.' + path.sep + ']'))[0]; + let filePath = path.join(MODULE_PATH, file); + let modulePath = path.join(__dirname, filePath) + if (fs.lstatSync(filePath).isDirectory()) { + modulePath = path.join(__dirname, filePath, "index.js") + } + memo[modulePath] = moduleName; + return memo; + }, {}); + } catch(err) {} + return {}; + }), + + getBuiltModules: function(dev, names) { + var modules = this.getModuleNames(); + if(Array.isArray(names)) { + modules = _.intersection(modules, names); + } + return modules.map(name => path.join(__dirname, dev ? DEV_PATH : BUILD_PATH, name + '.js')); + }, + + getBuiltPrebid: function(dev) { + return path.join(__dirname, dev ? DEV_PATH : BUILD_PATH, 'prebid' + '.js'); + }, + + getModulePaths: function() { + let modules = this.getModules(); + return Object.keys(modules); + }, + + getModuleNames: function() { + return _.values(this.getModules()); + }, + + nameModules: function() { + var modules = this.getModules(); + return through.obj(function(file, enc, done) { + file.named = modules[file.path] ? modules[file.path] : 'prebid'; + this.push(file); + done(); + }) + }, + /* * Get source files for analytics subdirectories in top-level `analytics` * directory adjacent to Prebid.js. @@ -37,18 +103,6 @@ module.exports = { const module = require(path.join(directory, moduleDirectory, MANIFEST)); return path.join(directory, moduleDirectory, module.main); }); - - // get only subdirectories that contain package.json with 'main' property - function isModuleDirectory(filePath) { - try { - const manifestPath = path.join(filePath, MANIFEST); - if (fs.statSync(manifestPath).isFile()) { - const module = require(manifestPath); - return module && module.main; - } - } - catch (error) {} - } }, createEnd2EndTestReport : function(targetDestinationDir) { diff --git a/gulpfile.js b/gulpfile.js index 46334996870..77041c1bf9c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,3 +1,7 @@ +'use strict'; + +var _ = require('lodash'); +var argv = require('yargs').argv; var gulp = require('gulp'); var argv = require('yargs').argv; var gutil = require('gulp-util'); @@ -14,11 +18,14 @@ var del = require('del'); var gulpJsdoc2md = require('gulp-jsdoc-to-markdown'); var concat = require('gulp-concat'); var header = require('gulp-header'); +var footer = require('gulp-footer'); var zip = require('gulp-zip'); var replace = require('gulp-replace'); var shell = require('gulp-shell'); var optimizejs = require('gulp-optimize-js'); -const eslint = require('gulp-eslint'); +var eslint = require('gulp-eslint'); +var gulpif = require('gulp-if'); +var fs = require('fs'); var CI_MODE = process.env.NODE_ENV === 'ci'; var prebid = require('./package.json'); @@ -46,10 +53,47 @@ gulp.task('clean', function () { .pipe(clean()); }); +gulp.task('bundle', function() { + var modules = (argv.modules || '').split(',').filter(module => !!module), + allModules = helpers.getModuleNames(); + + // var configFile = argv.moduleConfig ? argv.moduleConfig : path.join(__dirname, './moduleConfig.json'); + + if(modules.length === 0) { + modules = allModules; + } else { + let diff = _.difference(modules, allModules); + if(diff.length !== 0) { + throw new gutil.PluginError({ + plugin: 'bundle', + message: 'invalid modules: ' + diff.join(', ') + }); + } + } + + return gulp.src( + [helpers.getBuiltPrebid(argv.dev)].concat( + helpers.getBuiltModules(argv.dev, modules) + ) + ).pipe(concat(argv.bundleName ? argv.bundleName : 'bundle.js', {newLine: ''})) + .pipe(gulpif(!argv.manualEnable, footer('<%= global %>.enableModules(<%= config %>);', { + global: prebid.globalVarName, + config: JSON.stringify(_.pick( + JSON.parse( + fs.readFileSync(argv.config ? argv.config : './moduleConfig.json', 'utf8') + ), + modules + )) + }))) + .pipe(gulp.dest('build/' + (argv.dev ? 'dev' : 'dist'))); +}); + gulp.task('devpack', ['clean'], function () { webpackConfig.devtool = 'source-map'; const analyticsSources = helpers.getAnalyticsSources(analyticsDirectory); - return gulp.src([].concat(analyticsSources, 'src/prebid.js')) + const moduleSources = helpers.getModulePaths(); + return gulp.src([].concat(moduleSources, analyticsSources, 'src/prebid.js')) + .pipe(helpers.nameModules()) .pipe(webpack(webpackConfig)) .pipe(replace('$prebid.version$', prebid.version)) .pipe(gulp.dest('build/dev')) @@ -66,11 +110,13 @@ gulp.task('webpack', ['clean'], function () { webpackConfig.devtool = null; const analyticsSources = helpers.getAnalyticsSources(analyticsDirectory); - return gulp.src([].concat(analyticsSources, 'src/prebid.js')) + const moduleSources = helpers.getModulePaths(); + return gulp.src([].concat(moduleSources, analyticsSources, 'src/prebid.js')) + .pipe(helpers.nameModules()) .pipe(webpack(webpackConfig)) .pipe(replace('$prebid.version$', prebid.version)) .pipe(uglify()) - .pipe(header(banner, { prebid: prebid })) + .pipe(gulpif(file => file.basename === 'prebid.js', header(banner, { prebid: prebid }))) .pipe(optimizejs()) .pipe(gulp.dest('build/dist')) .pipe(connect.reload()); diff --git a/moduleConfig.json b/moduleConfig.json new file mode 100644 index 00000000000..9f60ec41604 --- /dev/null +++ b/moduleConfig.json @@ -0,0 +1,5 @@ +{ + "express": { + "enabled": true + } +} \ No newline at end of file diff --git a/package.json b/package.json index f4c751dea7b..eae4f15fe7b 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,10 @@ "gulp-concat": "^2.6.0", "gulp-connect": "^2.0.6", "gulp-eslint": "^3.0.1", + "gulp-footer": "^1.0.5", "gulp-header": "^1.7.1", + "gulp-if": "^2.0.2", + "gulp-jscs": "^3.0.2", "gulp-jsdoc-to-markdown": "^1.2.1", "gulp-karma": "0.0.4", "gulp-mocha": "^2.2.0", @@ -94,6 +97,7 @@ "requirejs": "^2.1.20", "sinon": "^1.12.1", "string-replace-webpack-plugin": "0.0.3", + "through2": "^2.0.3", "uglify-js": "^2.8.10", "url-parse": "^1.0.5", "webpack": "^1.12.3", diff --git a/src/dependencyResolver.js b/src/dependencyResolver.js new file mode 100644 index 00000000000..f20ab8289a7 --- /dev/null +++ b/src/dependencyResolver.js @@ -0,0 +1,65 @@ +/** + * @license + * Toposort - Topological sorting for node.js + * Copyright (c) 2012 by Marcel Klehr , 2017 @snapwich + * MIT LICENSE + */ + +export function CyclicDependency(node) { + this.name = 'CylclicDependency'; + this.module = node; + this.stack = (new Error()).stack; +} +CyclicDependency.prototype = new Error(); + +export function UnknownDependency(node) { + this.name = 'UnknownDependency'; + this.module = node; + this.stack = (new Error()).stack; +} +UnknownDependency.prototype = new Error(); + +export function resolve(nodes, edges) { + var cursor = nodes.length, + sorted = new Array(cursor), + visited = {}, + i = cursor; + + while (i--) { + if (!visited[i]) { + visit(nodes[i], i, []); + } + } + + return sorted.reverse(); + + function visit(node, i, predecessors) { + if(predecessors.indexOf(node) >= 0) { + throw new CyclicDependency(node); + } + + if (!~nodes.indexOf(node)) { + throw new UnknownDependency(node); + } + + if (visited[i]) { + return; + } + visited[i] = true; + + // outgoing edges + var outgoing = edges.filter(function(edge){ + return edge[0] === node; + }); + i = outgoing.length; + if (i) { + let preds = predecessors.concat(node); + do { + let child = outgoing[--i][1]; + visit(child, nodes.indexOf(child), preds); + } while (i); + } + + sorted[--cursor] = node; + } +} diff --git a/src/modules.js b/src/modules.js new file mode 100644 index 00000000000..24801c8113e --- /dev/null +++ b/src/modules.js @@ -0,0 +1,112 @@ + +import { resolve, CyclicDependency, UnknownDependency } from './dependencyResolver'; + +import { createNew as createNewAdapter } from './adapters/adapter'; +import { AnalyticsAdapter } from './adapters/analytics/AnalyticsAdapter'; +import bidfactory from 'src/bidfactory'; +import bidmanager from 'src/bidmanager'; +import * as utils from 'src/utils'; +import { loadScript } from 'src/adloader'; +import { ajax } from 'src/ajax'; +import * as CONSTANTS from 'src/constants'; + +var loaded = false, + registry = {}; + +/** + * + * @param name + * @param dependencies + * @param factory + */ +export function module(name, dependencies, factory) { + if (typeof dependencies === 'function') { + factory = dependencies; + dependencies = []; + } + + if (typeof name !== "string") { + utils.logError('module missing name'); + } else if (Array.isArray(dependencies) && typeof factory === 'function') { + if (registry[name]) { + utils.logWarn(`module ${name} redefined`); + } + + registry[name] = { + name, + dependencies, + factory + }; + + return factory; + } else { + utils.logError(`bad module definition for '${name}'`); + } + + return false; +} + +/** + * + * @param config + */ +export function enableModules(config = {}) { + var loadOrder, + results = {}, + names = Object.keys(registry); + + if (loaded) { + utils.logWarn('attempted to enableModules multiple times'); + return; + } + + try { + loadOrder = resolve( + names, + names.reduce((memo, name) => memo.concat( + registry[name].dependencies.reduce((memo, dependency) => ( + memo.push([name, dependency]), memo + ), []) + ), []) + ); + + } catch(e) { + if (e instanceof CyclicDependency) { + utils.logError(`cyclic dependency found with module ${e.module}`, null, e); + } else if (e instanceof UnknownDependency) { + utils.logError(`module not found: ${e.module}`, null, e); + } else { + utils.logError('error resolving module dependencies', null, e); + } + return false; + } + + loadOrder.forEach(name => { + let module = registry[name]; + try { + results[name] = module.factory.apply( + module, + module.dependencies.map( + dependency => results[dependency] + ).concat( + [{ + pbjs: $$PREBID_GLOBAL$$, + createNewAdapter, + AnalyticsAdapter, + bidfactory, + bidmanager, + utils, + loadScript, + ajax, + CONSTANTS, + config: config[name] + }] + ) + ); + } catch(e) { + utils.logWarn(`error executing module: ${name}`); + } + }); + + loaded = true; +} diff --git a/src/prebid.js b/src/prebid.js index 03762858d27..9637e19e0c5 100644 --- a/src/prebid.js +++ b/src/prebid.js @@ -2,6 +2,7 @@ import { getGlobal } from './prebidGlobal'; import { flatten, uniques, isGptPubadsDefined, adUnitsFilter } from './utils'; +import { module, enableModules } from "./modules"; import { videoAdUnit, hasNonVideoBidder } from './video'; import { nativeAdUnit, nativeBidder, hasNonNativeBidder } from './native'; import './polyfill'; @@ -777,6 +778,12 @@ $$PREBID_GLOBAL$$.setS2SConfig = function(options) { adaptermanager.setS2SConfig(config); }; -$$PREBID_GLOBAL$$.cmd.push(() => listenMessagesFromCreative()); -processQueue($$PREBID_GLOBAL$$.cmd); -processQueue($$PREBID_GLOBAL$$.que); + +// expose public module API +Object.assign($$PREBID_GLOBAL$$, { + module, + enableModules +}); + +$$PREBID_GLOBAL$$.que.push(() => listenMessagesFromCreative()); + diff --git a/webpack.conf.js b/webpack.conf.js index 60aed503740..42ada98ad11 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -3,9 +3,6 @@ var StringReplacePlugin = require('string-replace-webpack-plugin'); var path = require('path'); module.exports = { - output: { - filename: 'prebid.js' - }, devtool: 'source-map', resolve: { modulesDirectories: ['', 'node_modules', 'src'] @@ -17,7 +14,7 @@ module.exports = { loaders: [ { test: /\.js$/, - include: /(src|test)/, + include: /(src|modules|test)/, exclude: path.resolve(__dirname, 'node_modules'), loader: 'babel', // 'babel-loader' is also a legal name to reference query: { @@ -59,7 +56,7 @@ module.exports = { }, { test: /\.js$/, - include: /(src|test|integrationExamples)/, + include: /(src|test|modules|integrationExamples)/, loader: StringReplacePlugin.replace({ replacements: [ { diff --git a/yarn.lock b/yarn.lock index f47012ba413..11c7f1b9381 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2012,6 +2012,15 @@ duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" +duplexify@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + dependencies: + end-of-stream "1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -2038,11 +2047,11 @@ encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" -end-of-stream@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" +end-of-stream@1.0.0, end-of-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" dependencies: - once "^1.4.0" + once "~1.3.0" end-of-stream@~0.1.5: version "0.1.5" @@ -2386,7 +2395,7 @@ event-emitter@~0.3.5: d "1" es5-ext "~0.10.14" -event-stream@^3.3.2: +event-stream@*, event-stream@^3.3.2: version "3.3.4" resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" dependencies: @@ -2719,6 +2728,10 @@ forever-agent@~0.6.0, forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" +fork-stream@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" + form-data@~0.1.0: version "0.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12" @@ -3139,6 +3152,14 @@ gulp-eslint@^3.0.1: eslint "^3.0.0" gulp-util "^3.0.6" +gulp-footer@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/gulp-footer/-/gulp-footer-1.0.5.tgz#e84ca777e266be7bbc2d45d2df0e7eba8dfa3e54" + dependencies: + event-stream "*" + gulp-util "*" + lodash.assign "*" + gulp-header@^1.7.1: version "1.8.8" resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.8.tgz#4509c64677aab56b5ee8e4669a79b1655933a49e" @@ -3148,6 +3169,23 @@ gulp-header@^1.7.1: object-assign "*" through2 "^2.0.0" +gulp-if@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-2.0.2.tgz#a497b7e7573005041caa2bc8b7dda3c80444d629" + dependencies: + gulp-match "^1.0.3" + ternary-stream "^2.0.1" + through2 "^2.0.1" + +gulp-jscs@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gulp-jscs/-/gulp-jscs-3.0.2.tgz#dc7fbb01ce2bfc8325bba7cbbf95d65e43530478" + dependencies: + gulp-util "^3.0.4" + jscs "^2.1.1" + through2 "^2.0.0" + tildify "^1.0.0" + gulp-jsdoc-to-markdown@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/gulp-jsdoc-to-markdown/-/gulp-jsdoc-to-markdown-1.2.2.tgz#bd0e267e3972bc169e7bdb992f967823b023fefd" @@ -3165,6 +3203,12 @@ gulp-karma@0.0.4: optimist "~0.6.0" xtend "~2.1.1" +gulp-match@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.0.3.tgz#91c7c0d7f29becd6606d57d80a7f8776a87aba8e" + dependencies: + minimatch "^3.0.3" + gulp-mocha@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-2.2.0.tgz#1ce5eba4b94b40c7436afec3c4982c8eea894192" @@ -4402,10 +4446,18 @@ lodash._stack@^4.0.0: version "4.1.3" resolved "https://registry.yarnpkg.com/lodash._stack/-/lodash._stack-4.1.3.tgz#751aa76c1b964b047e76d14fc72a093fcb5e2dd0" -lodash.assign@^4.0.3, lodash.assign@^4.0.6: +lodash.assign@*, lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" +lodash.assign@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + lodash.assignwith@^4.0.7: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" @@ -4732,6 +4784,12 @@ merge-descriptors@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" +merge-stream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + method-override@~2.3.5: version "2.3.8" resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.8.tgz#178234bf4bab869f89df9444b06fc6147b44828c" @@ -5189,7 +5247,7 @@ on-headers@~1.0.0, on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@1.x, once@^1.3.0, once@^1.3.3, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -6564,6 +6622,10 @@ stream-http@^2.3.1: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + stream-to-buffer@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9" @@ -6787,6 +6849,15 @@ temp@^0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" +ternary-stream@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.0.1.tgz#064e489b4b5bf60ba6a6b7bc7f2f5c274ecf8269" + dependencies: + duplexify "^3.5.0" + fork-stream "^0.0.4" + merge-stream "^1.0.0" + through2 "^2.0.1" + test-value@^1.0.1, test-value@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/test-value/-/test-value-1.1.0.tgz#a09136f72ec043d27c893707c2b159bfad7de93f" @@ -6840,7 +6911,7 @@ through2@^0.5.0: readable-stream "~1.0.17" xtend "~3.0.0" -through2@^2.0.0, through2@^2.0.1: +through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" dependencies: From 83902ac9fcfc7f06fba6ae65f468a13a34b1369e Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 2 May 2017 14:46:50 -0600 Subject: [PATCH 002/111] express module --- modules/express.js | 205 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 modules/express.js diff --git a/modules/express.js b/modules/express.js new file mode 100644 index 00000000000..869a49992a4 --- /dev/null +++ b/modules/express.js @@ -0,0 +1,205 @@ +$$PREBID_GLOBAL$$.module('express', function ({ + pbjs, + utils, + config +}) { + + if (!config.enabled) { + utils.logWarn('config.enabled not set, not loading ' + this.name); + return; + } + utils.logMessage('loading ' + this.name); + + var adUnits = config.adUnits || pbjs.adUnits || []; + + if(adUnits.length === 0) { + utils.logWarn('no valid adUnits found, not loading ' + this.name); + } + + // put adUnits in a more performant hash lookup by code. + var adUnitsCache = adUnits.reduce(function(cache, adUnit) { + if(adUnit.code && adUnit.bids) { + cache[adUnit.code] = adUnit; + } else { + utils.logError('misconfigured adUnit', null, adUnit); + } + return cache; + }, {}); + + window.googletag = window.googletag || {}; + window.googletag.cmd = window.googletag.cmd || []; + window.googletag.cmd.push(function () { + // verify all necessary gpt functions exist + var gpt = window.googletag; + var pads = gpt.pubads; + if (!gpt.display || !gpt.enableServices || typeof pads !== 'function' || + !pads().refresh || !pads().disableInitialLoad || !pads().getSlots || !pads().enableSingleRequest) { + utils.logError('could not bind to gpt googletag api'); + return; + } + utils.logMessage('running'); + + + // function to convert google tag slot sizes to [[w,h],...] + function mapGptSlotSizes(aGPTSlotSizes) { + var aSlotSizes = []; + for (var i = 0; i < aGPTSlotSizes.length; i++) { + try { + aSlotSizes.push([aGPTSlotSizes[i].getWidth(), aGPTSlotSizes[i].getHeight()]); + } catch (e) { + utils.logWarn('slot size ' + aGPTSlotSizes[i].toString() + ' not supported by' + this.name); + } + } + return aSlotSizes; + } + + // a helper function to verify slots or get slots if not present + function defaultSlots(slots) { + return Array.isArray(slots) ? + slots.slice() : + googletag.pubads().getSlots().slice(); + } + + // maps gpt slots to adUnits, matches are copied to new array and removed from passed array. + function pickAdUnits(gptSlots) { + var adUnits = []; + // traverse backwards (since gptSlots is mutated) to find adUnits in cache and remove non-mapped slots + for(var i = gptSlots.length - 1; i > -1; i--) { + var gptSlot = gptSlots[i], + elemId = gptSlot.getSlotElementId(), + adUnit = adUnitsCache[elemId]; + + if(adUnit) { + adUnit._gptSlot = gptSlot; + adUnit.sizes = adUnit.sizes || mapGptSlotSizes(gptSlot.getSizes()); + adUnits.push(adUnit); + gptSlots.splice(i, 1); + } + } + + return adUnits; + } + + // store original gpt functions that will be overridden + var fGptDisplay = gpt.display; + var fGptEnableServices = gpt.enableServices; + var fGptRefresh = pads().refresh; + var fGptDisableInitialLoad = pads().disableInitialLoad; + var fGptEnableSingleRequest = pads().enableSingleRequest; + + // override googletag.enableServices() + // - make sure fGptDisableInitialLoad() has been called so we can + // better control when slots are displayed, then call original + // fGptEnableServices() + gpt.enableServices = function () { + if (!bInitialLoadDisabled) { + fGptDisableInitialLoad.apply(pads()); + } + return fGptEnableServices.apply(gpt, arguments); + }; + + // override googletag.display() + // - call the real fGptDisplay(). this won't initiate auctions because we've disabled initial load + // - define all corresponding rubicon slots + // - if disableInitialLoad() has been called by the pub, done + // - else run an auction and call the real fGptRefresh() to + // initiate the DFP request + gpt.display = function (sElementId) { + utils.logInfo('display:', sElementId); + // call original gpt display() function + fGptDisplay.apply(gpt, arguments); + + // if not SRA mode, get only the gpt slot corresponding to sEementId + var aGptSlots; + if (!bEnabledSRA) { + aGptSlots = googletag.pubads().getSlots().filter(function (oGptSlot) { + return oGptSlot.getSlotElementId() === sElementId; + }); + } + + aGptSlots = defaultSlots(aGptSlots).filter(function(gptSlot) { + return !gptSlot._displayed; + }); + + aGptSlots.forEach(function(gptSlot) { + gptSlot._displayed = true; + }); + + var adUnits = pickAdUnits(/* mutated: */ aGptSlots); + + if(!bInitialLoadDisabled) { + if(aGptSlots.length) { + fGptRefresh.apply(pads(), [aGptSlots]); + } + + if(adUnits.length ) { + pbjs.requestBids({ + adUnits: adUnits, + bidsBackHandler: function () { + pbjs.setTargetingForGPTAsync(); + fGptRefresh.apply(pads(), [ + adUnits.map(function(adUnit) { + return adUnit._gptSlot; + }) + ]); + } + }); + } + } + + }; + + // override gpt refresh() function + // - run auctions for provided gpt slots, then initiate ad-server call + pads().refresh = function (aGptSlots, options) { + utils.logInfo('refresh:', aGptSlots); + // get already displayed adUnits from aGptSlots if provided, else all defined gptSlots + aGptSlots = defaultSlots(aGptSlots); + var adUnits = pickAdUnits(/* mutated: */ aGptSlots).filter(function (adUnit) { + return adUnit._gptSlot._displayed; + }); + + if(aGptSlots.length) { + fGptRefresh.apply(pads(), [aGptSlots, options]); + } + + if(adUnits.length) { + pbjs.requestBids({ + adUnits: adUnits, + bidsBackHandler: function () { + pbjs.setTargetingForGPTAsync(); + fGptRefresh.apply(pads(), [ + adUnits.map(function(adUnit) { + return adUnit._gptSlot + }), + options + ]); + } + }); + } + }; + + // override gpt disableInitialLoad function + // Register that initial load was called, meaning calls to display() + // should not initiate an ad-server request. Instead a call to + // refresh() will be needed to iniate the request. + // We will assume the pub is using this the correct way, calling it + // before enableServices() + var bInitialLoadDisabled = false; + pads().disableInitialLoad = function () { + bInitialLoadDisabled = true; + return fGptDisableInitialLoad.apply(window.googletag.pubads(), arguments); + }; + + // override gpt useSingleRequest function + // Register that SRA has been turned on + // We will assume the pub is using this the correct way, calling it + // before enableServices() + var bEnabledSRA = false; + pads().enableSingleRequest = function () { + bEnabledSRA = true; + return fGptEnableSingleRequest.apply(window.googletag.pubads(), arguments); + }; + }); + +}); \ No newline at end of file From 3ec0738a8afde8d30252140d5babb3dd398fa1a0 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 4 May 2017 13:17:44 -0600 Subject: [PATCH 003/111] conversion of rubicon adapter to module system --- karma.conf.js | 14 +- modules/rubiconAdapter.js | 390 +++++++++++ src/modules.js | 90 +-- test/helpers/testModule.js | 18 + test/spec/modules/rubiconAdapter_spec.js | 789 +++++++++++++++++++++++ 5 files changed, 1258 insertions(+), 43 deletions(-) create mode 100644 modules/rubiconAdapter.js create mode 100644 test/helpers/testModule.js create mode 100644 test/spec/modules/rubiconAdapter_spec.js diff --git a/karma.conf.js b/karma.conf.js index 3da7b378cbd..e711d9b5647 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,13 +1,13 @@ // Karma configuration // Generated on Thu Aug 07 2014 09:45:28 GMT-0700 (PDT) var webpackConfig = require('./webpack.conf'); -webpackConfig.module.postLoaders = [ - { - test: /\.js$/, - exclude: /(node_modules)|(test)|(integrationExamples)|(build)|polyfill.js|(src\/adapters\/analytics\/ga.js)/, - loader: 'istanbul-instrumenter' - } -]; +// webpackConfig.module.postLoaders = [ +// { +// test: /\.js$/, +// exclude: /(node_modules)|(test)|(integrationExamples)|(build)|polyfill.js|(src\/adapters\/analytics\/ga.js)/, +// loader: 'istanbul-instrumenter' +// } +// ]; var CI_MODE = process.env.NODE_ENV === 'ci'; diff --git a/modules/rubiconAdapter.js b/modules/rubiconAdapter.js new file mode 100644 index 00000000000..5387c9729fb --- /dev/null +++ b/modules/rubiconAdapter.js @@ -0,0 +1,390 @@ +$$PREBID_GLOBAL$$.module('rubiconAdapter', function({ + createNewAdapter, + bidfactory, + bidmanager, + adaptermanager, + utils, + ajax, + constants: { + STATUS + } +}) { + const RUBICON_BIDDER_CODE = 'rubicon'; + +// use deferred function call since version isn't defined yet at this point + function getIntegration() { + return 'pbjs_lite_' + $$PREBID_GLOBAL$$.version; + } + +// use protocol relative urls for http or https + const FASTLANE_ENDPOINT = '//fastlane.rubiconproject.com/a/api/fastlane.json'; + const VIDEO_ENDPOINT = '//fastlane-adv.rubiconproject.com/v1/auction/video'; + + const TIMEOUT_BUFFER = 500; + + var sizeMap = { + 1: '468x60', + 2: '728x90', + 8: '120x600', + 9: '160x600', + 10: '300x600', + 15: '300x250', + 16: '336x280', + 19: '300x100', + 43: '320x50', + 44: '300x50', + 48: '300x300', + 54: '300x1050', + 55: '970x90', + 57: '970x250', + 58: '1000x90', + 59: '320x80', + 61: '1000x1000', + 65: '640x480', + 67: '320x480', + 68: '1800x1000', + 72: '320x320', + 73: '320x160', + 83: '480x300', + 94: '970x310', + 96: '970x210', + 101: '480x320', + 102: '768x1024', + 113: '1000x300', + 117: '320x100', + 125: '800x250', + 126: '200x600' + }; + utils._each(sizeMap, (item, key) => sizeMap[item] = key); + + function RubiconAdapter() { + + function _callBids(bidderRequest) { + var bids = bidderRequest.bids || []; + + bids.forEach(bid => { + try { + // Video endpoint only accepts POST calls + if (bid.mediaType === 'video') { + ajax( + VIDEO_ENDPOINT, + { + success: bidCallback, + error: bidError + }, + buildVideoRequestPayload(bid, bidderRequest), + { + withCredentials: true + } + ); + } else { + ajax( + buildOptimizedCall(bid), + { + success: bidCallback, + error: bidError + }, + undefined, + { + withCredentials: true + } + ); + } + } catch (err) { + utils.logError('Error sending rubicon request for placement code ' + bid.placementCode, null, err); + addErrorBid(); + } + + function bidCallback(responseText) { + try { + utils.logMessage('XHR callback function called for ad ID: ' + bid.bidId); + handleRpCB(responseText, bid); + } catch (err) { + if (typeof err === 'string') { + utils.logWarn(`${err} when processing rubicon response for placement code ${bid.placementCode}`); + } else { + utils.logError('Error processing rubicon response for placement code ' + bid.placementCode, null, err); + } + addErrorBid(); + } + } + + function bidError(err, xhr) { + utils.logError('Request for rubicon responded with:', xhr.status, err); + addErrorBid(); + } + + function addErrorBid() { + let badBid = bidfactory.createBid(STATUS.NO_BID, bid); + badBid.bidderCode = bid.bidder; + bidmanager.addBidResponse(bid.placementCode, badBid); + } + }); + } + + function _getScreenResolution() { + return [window.screen.width, window.screen.height].join('x'); + } + + function buildVideoRequestPayload(bid, bidderRequest) { + bid.startTime = new Date().getTime(); + + let params = bid.params; + + if (!params || typeof params.video !== 'object') { + throw 'Invalid Video Bid'; + } + + let size; + if (params.video.playerWidth && params.video.playerHeight) { + size = [ + params.video.playerWidth, + params.video.playerHeight + ]; + } else if ( + Array.isArray(bid.sizes) && bid.sizes.length > 0 && + Array.isArray(bid.sizes[0]) && bid.sizes[0].length > 1 + ) { + size = bid.sizes[0]; + } else { + throw 'Invalid Video Bid - No size provided'; + } + + let postData = { + page_url: !params.referrer ? utils.getTopWindowUrl() : params.referrer, + resolution: _getScreenResolution(), + account_id: params.accountId, + integration: getIntegration(), + timeout: bidderRequest.timeout - (Date.now() - bidderRequest.auctionStart + TIMEOUT_BUFFER), + stash_creatives: true, + ae_pass_through_parameters: params.video.aeParams, + slots: [] + }; + + // Define the slot object + let slotData = { + site_id: params.siteId, + zone_id: params.zoneId, + position: params.position || 'btf', + floor: parseFloat(params.floor) > 0.01 ? params.floor : 0.01, + element_id: bid.placementCode, + name: bid.placementCode, + language: params.video.language, + width: size[0], + height: size[1] + }; + + // check and add inventory, keywords, visitor and size_id data + if (params.video.size_id) { + slotData.size_id = params.video.size_id; + } else { + throw 'Invalid Video Bid - Invalid Ad Type!'; + } + + if (params.inventory && typeof params.inventory === 'object') { + slotData.inventory = params.inventory; + } + + if (params.keywords && Array.isArray(params.keywords)) { + slotData.keywords = params.keywords; + } + + if (params.visitor && typeof params.visitor === 'object') { + slotData.visitor = params.visitor; + } + + postData.slots.push(slotData); + + return (JSON.stringify(postData)); + } + + function buildOptimizedCall(bid) { + bid.startTime = new Date().getTime(); + + var { + accountId, + siteId, + zoneId, + position, + floor, + keywords, + visitor, + inventory, + userId, + referrer: pageUrl + } = bid.params; + + // defaults + floor = (floor = parseFloat(floor)) > 0.01 ? floor : 0.01; + position = position || 'btf'; + + // use rubicon sizes if provided, otherwise adUnit.sizes + var parsedSizes = RubiconAdapter.masSizeOrdering(Array.isArray(bid.params.sizes) ? + bid.params.sizes.map(size => (sizeMap[size] || '').split('x')) : bid.sizes + ); + + if (parsedSizes.length < 1) { + throw 'no valid sizes'; + } + + if (!/^\d+$/.test(accountId)) { + throw 'invalid accountId provided'; + } + + // using array to honor ordering. if order isn't important (it shouldn't be), an object would probably be preferable + var queryString = [ + 'account_id', accountId, + 'site_id', siteId, + 'zone_id', zoneId, + 'size_id', parsedSizes[0], + 'alt_size_ids', parsedSizes.slice(1).join(',') || undefined, + 'p_pos', position, + 'rp_floor', floor, + 'tk_flint', getIntegration(), + 'p_screen_res', _getScreenResolution(), + 'kw', keywords, + 'tk_user_key', userId + ]; + + if (visitor !== null && typeof visitor === 'object') { + utils._each(visitor, (item, key) => queryString.push(`tg_v.${key}`, item)); + } + + if (inventory !== null && typeof inventory === 'object') { + utils._each(inventory, (item, key) => queryString.push(`tg_i.${key}`, item)); + } + + queryString.push( + 'rand', Math.random(), + 'rf', !pageUrl ? utils.getTopWindowUrl() : pageUrl + ); + + return queryString.reduce( + (memo, curr, index) => + index % 2 === 0 && queryString[index + 1] !== undefined ? + memo + curr + '=' + encodeURIComponent(queryString[index + 1]) + '&' : memo, + FASTLANE_ENDPOINT + '?' + ).slice(0, -1); // remove trailing & + } + + let _renderCreative = (script, impId) => ` + + + +
+ +
+ +`; + + function handleRpCB(responseText, bidRequest) { + var responseObj = JSON.parse(responseText), // can throw + ads = responseObj.ads, + adResponseKey = bidRequest.placementCode; + + // check overall response + if (typeof responseObj !== 'object' || responseObj.status !== 'ok') { + throw 'bad response'; + } + + // video ads array is wrapped in an object + if (bidRequest.mediaType === 'video' && typeof ads === 'object') { + ads = ads[adResponseKey]; + } + + // check the ad response + if (!Array.isArray(ads) || ads.length < 1) { + throw 'invalid ad response'; + } + + // if there are multiple ads, sort by CPM + ads = ads.sort(_adCpmSort); + + ads.forEach(ad => { + if (ad.status !== 'ok') { + throw 'bad ad status'; + } + + //store bid response + //bid status is good (indicating 1) + var bid = bidfactory.createBid(STATUS.GOOD, bidRequest); + bid.creative_id = ad.ad_id; + bid.bidderCode = bidRequest.bidder; + bid.cpm = ad.cpm || 0; + bid.dealId = ad.deal; + if (bidRequest.mediaType === 'video') { + bid.width = bidRequest.params.video.playerWidth; + bid.height = bidRequest.params.video.playerHeight; + bid.vastUrl = ad.creative_depot_url; + bid.descriptionUrl = ad.impression_id; + bid.impression_id = ad.impression_id; + } else { + bid.ad = _renderCreative(ad.script, ad.impression_id); + [bid.width, bid.height] = sizeMap[ad.size_id].split('x').map(num => Number(num)); + } + + // add server-side targeting + bid.rubiconTargeting = (Array.isArray(ad.targeting) ? ad.targeting : []) + .reduce((memo, item) => { + memo[item.key] = item.values[0]; + return memo; + }, {'rpfl_elemid': bidRequest.placementCode}); + + try { + bidmanager.addBidResponse(bidRequest.placementCode, bid); + } catch (err) { + utils.logError('Error from addBidResponse', null, err); + } + }); + } + + function _adCpmSort(adA, adB) { + return (adB.cpm || 0.0) - (adA.cpm || 0.0); + } + + return Object.assign(createNewAdapter(RUBICON_BIDDER_CODE), { + callBids: _callBids, + createNew: RubiconAdapter.createNew + }); + } + + RubiconAdapter.masSizeOrdering = function (sizes) { + const MAS_SIZE_PRIORITY = [15, 2, 9]; + + return utils.parseSizesInput(sizes) + // map sizes while excluding non-matches + .reduce((result, size) => { + let mappedSize = parseInt(sizeMap[size], 10); + if (mappedSize) { + result.push(mappedSize); + } + return result; + }, []) + .sort((first, second) => { + // sort by MAS_SIZE_PRIORITY priority order + let firstPriority = MAS_SIZE_PRIORITY.indexOf(first), + secondPriority = MAS_SIZE_PRIORITY.indexOf(second); + + if (firstPriority > -1 || secondPriority > -1) { + if (firstPriority === -1) { + return 1; + } + if (secondPriority === -1) { + return -1; + } + return firstPriority - secondPriority; + } + + // and finally ascending order + return first - second; + }); + }; + + RubiconAdapter.createNew = function () { + return new RubiconAdapter(); + }; + + adaptermanager.registerBidAdapter(new RubiconAdapter, RUBICON_BIDDER_CODE); + adaptermanager.aliasBidAdapter(RUBICON_BIDDER_CODE, 'rubiconLite'); + return RubiconAdapter; +}); \ No newline at end of file diff --git a/src/modules.js b/src/modules.js index 24801c8113e..807afc5459e 100644 --- a/src/modules.js +++ b/src/modules.js @@ -8,7 +8,8 @@ import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; import { loadScript } from 'src/adloader'; import { ajax } from 'src/ajax'; -import * as CONSTANTS from 'src/constants'; +import * as constants from 'src/constants'; +import * as adaptermanager from 'src/adaptermanager'; var loaded = false, registry = {}; @@ -20,30 +21,17 @@ var loaded = false, * @param factory */ export function module(name, dependencies, factory) { - if (typeof dependencies === 'function') { - factory = dependencies; - dependencies = []; + if (registry[name]) { + utils.logWarn(`redefining module '${name}'`); } - if (typeof name !== "string") { - utils.logError('module missing name'); - } else if (Array.isArray(dependencies) && typeof factory === 'function') { - if (registry[name]) { - utils.logWarn(`module ${name} redefined`); - } - - registry[name] = { - name, - dependencies, - factory - }; + let module = createModule(name, dependencies, factory); - return factory; - } else { - utils.logError(`bad module definition for '${name}'`); + if(module) { + registry[name] = module; } - return false; + return module; } /** @@ -84,29 +72,59 @@ export function enableModules(config = {}) { loadOrder.forEach(name => { let module = registry[name]; try { - results[name] = module.factory.apply( - module, - module.dependencies.map( - dependency => results[dependency] - ).concat( - [{ + results[name] = bootstrap(module, {config: config[name]}, results); + } catch(e) { + utils.logWarn(`error executing module: ${name}`); + } + }); + + loaded = true; +} + +export function createModule(name, dependencies, factory) { + if (typeof dependencies === 'function') { + factory = dependencies; + dependencies = []; + } + + if (typeof name !== "string") { + utils.logError('module missing name'); + } else if (Array.isArray(dependencies) && typeof factory === 'function') { + return { + name, + dependencies, + factory + }; + } else { + utils.logError(`bad module definition for '${name}'`); + } + + return false; +} + +export function bootstrap(module, overrides = {}, results = {}) { + return module.factory.apply( + module, + module.dependencies.map( + dependency => results[dependency] + ).concat( + [ + Object.assign( + { pbjs: $$PREBID_GLOBAL$$, createNewAdapter, AnalyticsAdapter, bidfactory, bidmanager, + adaptermanager, utils, loadScript, ajax, - CONSTANTS, - config: config[name] - }] + constants + }, + overrides ) - ); - } catch(e) { - utils.logWarn(`error executing module: ${name}`); - } - }); - - loaded = true; + ] + ) + ); } diff --git a/test/helpers/testModule.js b/test/helpers/testModule.js new file mode 100644 index 00000000000..c6bb0ba6bcd --- /dev/null +++ b/test/helpers/testModule.js @@ -0,0 +1,18 @@ +import { createModule, bootstrap } from 'src/modules'; + +export function getModule(setCb) { + var tmp = window.$$PREBID_GLOBAL$$; + var testModule = {}; + + window.$$PREBID_GLOBAL$$ = { + module: function() { + testModule = createModule.apply(null, arguments); + } + }; + + setCb(); + + window.$$PREBID_GLOBAL$$ = tmp; + + return bootstrap.bind(null, testModule); +} diff --git a/test/spec/modules/rubiconAdapter_spec.js b/test/spec/modules/rubiconAdapter_spec.js new file mode 100644 index 00000000000..fd5c0002c31 --- /dev/null +++ b/test/spec/modules/rubiconAdapter_spec.js @@ -0,0 +1,789 @@ +import { expect } from 'chai'; +import adloader from 'src/adloader'; +import adapterManager from 'src/adaptermanager'; +import bidManager from 'src/bidmanager'; +import {parse as parseQuery} from 'querystring'; +import { getModule } from '../../helpers/testModule'; + +var CONSTANTS = require('src/constants.json'); + +const INTEGRATION = `pbjs_lite_v$prebid.version$`; // $prebid.version$ will be substituted in by gulp in built prebid + +var RubiconAdapter = getModule(function() { + require('../../../modules/rubiconAdapter'); +})(); + +describe('the rubicon adapter', () => { + + let sandbox, + adUnit, + bidderRequest; + + function createVideoBidderRequest() { + let bid = bidderRequest.bids[0]; + bid.mediaType = 'video'; + bid.params.video = { + 'language': 'en', + 'p_aso.video.ext.skip': true, + 'p_aso.video.ext.skipdelay': 15, + 'playerHeight': 320, + 'playerWidth': 640, + 'size_id': 201, + 'aeParams': { + 'p_aso.video.ext.skip': '1', + 'p_aso.video.ext.skipdelay': '15' + } + }; + } + + function createVideoBidderRequestNoVideo() { + let bid = bidderRequest.bids[0]; + bid.mediaType = 'video'; + bid.params.video = ''; + } + + function createVideoBidderRequestNoPlayer() { + let bid = bidderRequest.bids[0]; + bid.mediaType = 'video'; + bid.params.video = { + 'language': 'en', + 'p_aso.video.ext.skip': true, + 'p_aso.video.ext.skipdelay': 15, + 'size_id': 201, + 'aeParams': { + 'p_aso.video.ext.skip': '1', + 'p_aso.video.ext.skipdelay': '15' + } + }; + } + + beforeEach(() => { + sandbox = sinon.sandbox.create(); + + adUnit = { + code: '/19968336/header-bid-tag-0', + sizes: [[300, 250], [320, 50]], + mediaType: 'video', + bids: [ + { + bidder: 'rubicon', + params: { + accountId: '14062', + siteId: '70608', + zoneId: '335918', + userId: '12346', + keywords: ['a','b','c'], + inventory: { + rating:'5-star', + prodtype:'tech' + }, + visitor: { + ucat:'new', + lastsearch:'iphone' + }, + position: 'atf', + referrer: 'localhost' + } + } + ] + }; + + bidderRequest = { + bidderCode: 'rubicon', + requestId: 'c45dd708-a418-42ec-b8a7-b70a6c6fab0a', + bidderRequestId: '178e34bad3658f', + bids: [ + { + bidder: 'rubicon', + params: { + accountId: '14062', + siteId: '70608', + zoneId: '335918', + userId: '12346', + keywords: ['a','b','c'], + inventory: { + rating:'5-star', + prodtype:'tech' + }, + visitor: { + ucat:'new', + lastsearch:'iphone' + }, + position: 'atf', + referrer: 'localhost' + }, + placementCode: '/19968336/header-bid-tag-0', + sizes: [[300, 250], [320, 50]], + bidId: '2ffb201a808da7', + bidderRequestId: '178e34bad3658f', + requestId: 'c45dd708-a418-42ec-b8a7-b70a6c6fab0a' + } + ], + start: 1472239426002, + auctionStart: 1472239426000, + timeout: 5000 + }; + + }); + + afterEach(() => { + sandbox.restore(); + }); + + describe('callBids public interface', () => { + + let rubiconAdapter = adapterManager.bidderRegistry['rubicon']; + + it('should receive a well-formed bidRequest from the adaptermanager', () => { + + sandbox.stub(rubiconAdapter, 'callBids'); + + adapterManager.callBids({ + adUnits: [clone(adUnit)] + }); + + let bidderRequest = rubiconAdapter.callBids.getCall(0).args[0]; + + expect(bidderRequest).to.have.property('bids') + .that.is.an('array') + .with.lengthOf(1); + + expect(bidderRequest).to.have.deep.property('bids[0]') + .to.have.property('bidder', 'rubicon'); + + expect(bidderRequest).to.have.deep.property('bids[0]') + .to.have.property('mediaType', 'video'); + + expect(bidderRequest).to.have.deep.property('bids[0]') + .to.have.property('placementCode', adUnit.code); + + expect(bidderRequest).to.have.deep.property('bids[0]') + .with.property('sizes') + .that.is.an('array') + .with.lengthOf(2) + .that.deep.equals(adUnit.sizes); + + expect(bidderRequest).to.have.deep.property('bids[0]') + .with.property('params') + .that.deep.equals(adUnit.bids[0].params) + + }); + + }); + + describe('MAS mapping / ordering', () => { + + let masSizeOrdering = RubiconAdapter.masSizeOrdering; + + it('should not include values without a proper mapping', () => { + // two invalid sizes included: [42, 42], [1, 1] + let ordering = masSizeOrdering([[320, 50], [42, 42], [300, 250], [640, 480], [1, 1], [336, 280]]); + + expect(ordering).to.deep.equal([15, 16, 43, 65]); + }); + + it('should sort values without any MAS priority sizes in regular ascending order', () => { + let ordering = masSizeOrdering([[320, 50], [640, 480], [336, 280], [200, 600]]); + + expect(ordering).to.deep.equal([16, 43, 65, 126]); + }); + + it('should sort MAS priority sizes in the proper order w/ rest ascending', () => { + let ordering = masSizeOrdering([[320, 50], [160,600], [640, 480], [300, 250],[336, 280], [200, 600]]); + expect(ordering).to.deep.equal([15, 9, 16, 43, 65, 126]); + + ordering = masSizeOrdering([[320, 50], [300, 250], [160,600], [640, 480],[336, 280], [200, 600], [728, 90]]); + expect(ordering).to.deep.equal([15, 2, 9, 16, 43, 65, 126]); + + ordering = masSizeOrdering([[120, 600], [320, 50], [160,600], [640, 480],[336, 280], [200, 600], [728, 90]]); + expect(ordering).to.deep.equal([2, 9, 8, 16, 43, 65, 126]); + }); + + }); + + describe('callBids implementation', () => { + + let rubiconAdapter; + + describe('for requests', () => { + + let xhr, + bids; + + beforeEach(() => { + rubiconAdapter = new RubiconAdapter(); + + bids = []; + + xhr = sandbox.useFakeXMLHttpRequest(); + + sandbox.stub(bidManager, 'addBidResponse', (elemId, bid) => { + bids.push(bid); + }); + }); + + afterEach(() => { + xhr.restore(); + }); + + describe('to fastlane', () => { + + it('should make a well-formed request', () => { + + rubiconAdapter.callBids(bidderRequest); + + let request = xhr.requests[0]; + + let [path, query] = request.url.split('?'); + query = parseQuery(query); + + expect(path).to.equal( + '//fastlane.rubiconproject.com/a/api/fastlane.json' + ); + + let expectedQuery = { + 'account_id': '14062', + 'site_id': '70608', + 'zone_id': '335918', + 'size_id': '15', + 'alt_size_ids': '43', + 'p_pos': 'atf', + 'rp_floor': '0.01', + 'tk_flint': INTEGRATION, + 'p_screen_res': /\d+x\d+/, + 'tk_user_key': '12346', + 'kw': 'a,b,c', + 'tg_v.ucat': 'new', + 'tg_v.lastsearch': 'iphone', + 'tg_i.rating': '5-star', + 'tg_i.prodtype': 'tech', + 'rf': 'localhost' + }; + + // test that all values above are both present and correct + Object.keys(expectedQuery).forEach(key => { + let value = expectedQuery[key]; + if(value instanceof RegExp) { + expect(query[key]).to.match(value); + } else { + expect(query[key]).to.equal(value); + } + }); + + expect(query).to.have.property('rand'); + + }); + + it('should use rubicon sizes if present', () => { + + var sizesBidderRequest = clone(bidderRequest); + sizesBidderRequest.bids[0].params.sizes = [55, 57, 59]; + + rubiconAdapter.callBids(sizesBidderRequest); + + let query = parseQuery(xhr.requests[0].url.split('?')[1]); + + expect(query['size_id']).to.equal('55'); + expect(query['alt_size_ids']).to.equal('57,59'); + + }); + + it('should not send a request and register an error bid if no valid sizes', () => { + + var sizesBidderRequest = clone(bidderRequest); + sizesBidderRequest.bids[0].sizes = [[620,250],[300,251]]; + + rubiconAdapter.callBids(sizesBidderRequest); + + expect(xhr.requests.length).to.equal(0); + + expect(bidManager.addBidResponse.calledOnce).to.equal(true); + expect(bids).to.be.lengthOf(1); + expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); + + }); + + it('should not send a request and register an error if no account id is present', () => { + + var noAccountBidderRequest = clone(bidderRequest); + delete noAccountBidderRequest.bids[0].params.accountId; + + rubiconAdapter.callBids(noAccountBidderRequest); + + expect(xhr.requests.length).to.equal(0); + expect(bidManager.addBidResponse.calledOnce).to.equal(true); + expect(bids).to.be.lengthOf(1); + expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); + + }); + + it('should allow a floor override', () => { + + var floorBidderRequest = clone(bidderRequest); + floorBidderRequest.bids[0].params.floor = 2; + + rubiconAdapter.callBids(floorBidderRequest); + + let query = parseQuery(xhr.requests[0].url.split('?')[1]); + + expect(query['rp_floor']).to.equal('2'); + + }); + + }); + + describe('for video requests', () => { + + /* + beforeEach(() => { + createVideoBidderRequest(); + + sandbox.stub(Date, 'now', () => + bidderRequest.auctionStart + 100 + ); + }); + */ + + it('should make a well-formed video request', () => { + createVideoBidderRequest(); + + sandbox.stub(Date, 'now', () => + bidderRequest.auctionStart + 100 + ); + + rubiconAdapter.callBids(bidderRequest); + + let request = xhr.requests[0]; + + let url = request.url; + let post = JSON.parse(request.requestBody); + + expect(url).to.equal('//fastlane-adv.rubiconproject.com/v1/auction/video'); + + expect(post).to.have.property('page_url').that.is.a('string'); + expect(post.resolution).to.match(/\d+x\d+/); + expect(post.account_id).to.equal('14062'); + expect(post.integration).to.equal(INTEGRATION); + expect(post).to.have.property('timeout').that.is.a('number'); + expect(post.timeout < 5000).to.equal(true); + expect(post.stash_creatives).to.equal(true); + + expect(post).to.have.property('ae_pass_through_parameters'); + expect(post.ae_pass_through_parameters) + .to.have.property('p_aso.video.ext.skip') + .that.equals('1'); + expect(post.ae_pass_through_parameters) + .to.have.property('p_aso.video.ext.skipdelay') + .that.equals('15'); + + expect(post).to.have.property('slots') + .with.length.of(1); + + let slot = post.slots[0]; + + expect(slot.site_id).to.equal('70608'); + expect(slot.zone_id).to.equal('335918'); + expect(slot.position).to.equal('atf'); + expect(slot.floor).to.equal(.01); + expect(slot.element_id).to.equal(bidderRequest.bids[0].placementCode); + expect(slot.name).to.equal(bidderRequest.bids[0].placementCode); + expect(slot.language).to.equal('en'); + expect(slot.width).to.equal(640); + expect(slot.height).to.equal(320); + expect(slot.size_id).to.equal(201); + + expect(slot).to.have.property('inventory').that.is.an('object'); + expect(slot.inventory).to.have.property('rating').that.equals('5-star'); + expect(slot.inventory).to.have.property('prodtype').that.equals('tech'); + + expect(slot).to.have.property('keywords') + .that.is.an('array') + .of.length(3) + .that.deep.equals(['a', 'b', 'c']); + + expect(slot).to.have.property('visitor').that.is.an('object'); + expect(slot.visitor).to.have.property('ucat').that.equals('new'); + expect(slot.visitor).to.have.property('lastsearch').that.equals('iphone'); + + }); + + it('should allow a floor price override', () => { + createVideoBidderRequest(); + + sandbox.stub(Date, 'now', () => + bidderRequest.auctionStart + 100 + ); + + var floorBidderRequest = clone(bidderRequest); + + // enter an explicit floor price // + floorBidderRequest.bids[0].params.floor = 3.25; + + rubiconAdapter.callBids(floorBidderRequest); + + let request = xhr.requests[0]; + let post = JSON.parse(request.requestBody); + + let floor = post.slots[0].floor; + + expect(floor).to.equal(3.25); + + }); + + it('should trap when no video object is passed in', () => { + createVideoBidderRequestNoVideo(); + sandbox.stub(Date, 'now', () => + bidderRequest.auctionStart + 100 + ); + + var floorBidderRequest = clone(bidderRequest); + + rubiconAdapter.callBids(floorBidderRequest); + + expect(xhr.requests.length).to.equal(0); + }); + + it('should get size from bid.sizes too', () => { + createVideoBidderRequestNoPlayer(); + sandbox.stub(Date, 'now', () => + bidderRequest.auctionStart + 100 + ); + + var floorBidderRequest = clone(bidderRequest); + + rubiconAdapter.callBids(floorBidderRequest); + + let request = xhr.requests[0]; + let post = JSON.parse(request.requestBody); + + expect(post.slots[0].width).to.equal(300); + expect(post.slots[0].height).to.equal(250); + }); + + }); + + }); + + + + + describe('response handler', () => { + let bids, + server, + addBidResponseAction; + + beforeEach(() => { + bids = []; + + server = sinon.fakeServer.create(); + + sandbox.stub(bidManager, 'addBidResponse', (elemId, bid) => { + bids.push(bid); + if(addBidResponseAction) { + addBidResponseAction(); + addBidResponseAction = undefined; + } + }); + }); + + afterEach(() => { + server.restore(); + }); + + describe('for fastlane', () => { + + it('should handle a success response and sort by cpm', () => { + + server.respondWith(JSON.stringify({ + 'status': 'ok', + 'account_id': 14062, + 'site_id': 70608, + 'zone_id': 530022, + 'size_id': 15, + 'alt_size_ids': [ + 43 + ], + 'tracking': '', + 'inventory': {}, + 'ads': [ + { + 'status': 'ok', + 'impression_id': '153dc240-8229-4604-b8f5-256933b9374c', + 'size_id': '15', + 'ad_id': '6', + 'advertiser': 7, + 'network': 8, + 'creative_id': 9, + 'type': 'script', + 'script': 'alert(\'foo\')', + 'campaign_id': 10, + 'cpm': 0.811, + 'targeting': [ + { + 'key': 'rpfl_14062', + 'values': [ + '15_tier_all_test' + ] + } + ] + }, + { + 'status': 'ok', + 'impression_id': '153dc240-8229-4604-b8f5-256933b9374d', + 'size_id': '43', + 'ad_id': '7', + 'advertiser': 7, + 'network': 8, + 'creative_id': 9, + 'type': 'script', + 'script': 'alert(\'foo\')', + 'campaign_id': 10, + 'cpm': 0.911, + 'targeting': [ + { + 'key': 'rpfl_14062', + 'values': [ + '43_tier_all_test' + ] + } + ] + } + ] + })); + + rubiconAdapter.callBids(bidderRequest); + + server.respond(); + + expect(bidManager.addBidResponse.calledTwice).to.equal(true); + + expect(bids).to.be.lengthOf(2); + + expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD); + expect(bids[0].bidderCode).to.equal('rubicon'); + expect(bids[0].width).to.equal(320); + expect(bids[0].height).to.equal(50); + expect(bids[0].cpm).to.equal(0.911); + expect(bids[0].ad).to.contain(`alert('foo')`) + .and.to.contain(``) + .and.to.contain(`
`); + expect(bids[0].rubiconTargeting.rpfl_elemid).to.equal('/19968336/header-bid-tag-0'); + expect(bids[0].rubiconTargeting.rpfl_14062).to.equal('43_tier_all_test'); + + expect(bids[1].getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD); + expect(bids[1].bidderCode).to.equal('rubicon'); + expect(bids[1].width).to.equal(300); + expect(bids[1].height).to.equal(250); + expect(bids[1].cpm).to.equal(0.811); + expect(bids[1].ad).to.contain(`alert('foo')`) + .and.to.contain(``) + .and.to.contain(`
`); + expect(bids[1].rubiconTargeting.rpfl_elemid).to.equal('/19968336/header-bid-tag-0'); + expect(bids[1].rubiconTargeting.rpfl_14062).to.equal('15_tier_all_test'); + }); + + it('should be fine with a CPM of 0', () => { + server.respondWith(JSON.stringify({ + 'status': 'ok', + 'account_id': 14062, + 'site_id': 70608, + 'zone_id': 530022, + 'size_id': 15, + 'alt_size_ids': [ + 43 + ], + 'tracking': '', + 'inventory': {}, + 'ads': [{ + 'status': 'ok', + 'cpm': 0, + 'size_id': 15 + }] + })); + + rubiconAdapter.callBids(bidderRequest); + + server.respond(); + + expect(bidManager.addBidResponse.calledOnce).to.equal(true); + expect(bids).to.be.lengthOf(1); + expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD); + }); + + it('should handle an error with no ads returned', () => { + server.respondWith(JSON.stringify({ + 'status': 'ok', + 'account_id': 14062, + 'site_id': 70608, + 'zone_id': 530022, + 'size_id': 15, + 'alt_size_ids': [ + 43 + ], + 'tracking': '', + 'inventory': {}, + 'ads': [] + })); + + rubiconAdapter.callBids(bidderRequest); + + server.respond(); + + expect(bidManager.addBidResponse.calledOnce).to.equal(true); + expect(bids).to.be.lengthOf(1); + expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); + }); + + it('should handle an error with bad status', () => { + server.respondWith(JSON.stringify({ + 'status': 'ok', + 'account_id': 14062, + 'site_id': 70608, + 'zone_id': 530022, + 'size_id': 15, + 'alt_size_ids': [ + 43 + ], + 'tracking': '', + 'inventory': {}, + 'ads': [{ + 'status': 'not_ok', + }] + })); + + rubiconAdapter.callBids(bidderRequest); + + server.respond(); + + expect(bidManager.addBidResponse.calledOnce).to.equal(true); + expect(bids).to.be.lengthOf(1); + expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); + }); + + it('should handle an error because of malformed json response', () => { + server.respondWith('{test{'); + + rubiconAdapter.callBids(bidderRequest); + + server.respond(); + + expect(bidManager.addBidResponse.calledOnce).to.equal(true); + expect(bids).to.be.lengthOf(1); + expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); + }); + + it('should handle error contacting endpoint', () => { + server.respondWith([404, {}, ""]); + + rubiconAdapter.callBids(bidderRequest); + + server.respond(); + + expect(bidManager.addBidResponse.calledOnce).to.equal(true); + expect(bids).to.be.lengthOf(1); + expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); + }); + + it('should not register an error bid when a success call to addBidResponse throws an error', () => { + + server.respondWith(JSON.stringify({ + 'status': 'ok', + 'account_id': 14062, + 'site_id': 70608, + 'zone_id': 530022, + 'size_id': 15, + 'alt_size_ids': [ + 43 + ], + 'tracking': '', + 'inventory': {}, + 'ads': [{ + 'status': 'ok', + 'cpm': .8, + 'size_id': 15 + }] + })); + + addBidResponseAction = function() { + throw new Error('test error'); + }; + + rubiconAdapter.callBids(bidderRequest); + + server.respond(); + + // was calling twice for same bid, but should only call once + expect(bidManager.addBidResponse.calledOnce).to.equal(true); + expect(bids).to.be.lengthOf(1); + + }); + + }); + + describe('for video', () => { + + beforeEach(() => { + createVideoBidderRequest(); + }); + + it('should register a successful bid', () => { + + server.respondWith(JSON.stringify({ + 'status': 'ok', + 'ads': { + '/19968336/header-bid-tag-0': [ + { + 'status': 'ok', + 'cpm': 1, + 'tier': 'tier0200', + 'targeting': { + 'rpfl_8000': '201_tier0200', + 'rpfl_elemid': '/19968336/header-bid-tag-0' + }, + 'impression_id': 'a40fe16e-d08d-46a9-869d-2e1573599e0c', + 'site_id': 88888, + 'zone_id': 54321, + 'creative_type': 'video', + 'creative_depot_url': 'https://fastlane-adv.rubiconproject.com/v1/creative/a40fe16e-d08d-46a9-869d-2e1573599e0c.xml', + 'ad_id': 999999, + 'size_id': 201, + 'advertiser': 12345 + } + ] + }, + 'account_id': 7780 + })); + + rubiconAdapter.callBids(bidderRequest); + + server.respond(); + + // was calling twice for same bid, but should only call once + expect(bidManager.addBidResponse.calledOnce).to.equal(true); + + expect(bids).to.be.lengthOf(1); + + expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD); + expect(bids[0].bidderCode).to.equal('rubicon'); + expect(bids[0].creative_id).to.equal(999999); + expect(bids[0].cpm).to.equal(1); + expect(bids[0].descriptionUrl).to.equal('a40fe16e-d08d-46a9-869d-2e1573599e0c'); + expect(bids[0].vastUrl).to.equal( + 'https://fastlane-adv.rubiconproject.com/v1/creative/a40fe16e-d08d-46a9-869d-2e1573599e0c.xml' + ); + expect(bids[0].impression_id).to.equal('a40fe16e-d08d-46a9-869d-2e1573599e0c'); + + }); + + }); + + }); + + + }); + +}); + +function clone(obj) { + return JSON.parse(JSON.stringify(obj)); +} From 5c4fa2826349a0b939226aeb6dc6e74368e41ccf Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 5 May 2017 11:15:44 -0600 Subject: [PATCH 004/111] use var instead of let in node scripts --- gulpHelpers.js | 8 ++++---- gulpfile.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gulpHelpers.js b/gulpHelpers.js index 494e8876a2c..483e52dd693 100644 --- a/gulpHelpers.js +++ b/gulpHelpers.js @@ -44,9 +44,9 @@ module.exports = { try { return fs.readdirSync(MODULE_PATH) .reduce((memo, file) => { - let moduleName = file.split(new RegExp('[.' + path.sep + ']'))[0]; - let filePath = path.join(MODULE_PATH, file); - let modulePath = path.join(__dirname, filePath) + var moduleName = file.split(new RegExp('[.' + path.sep + ']'))[0]; + var filePath = path.join(MODULE_PATH, file); + var modulePath = path.join(__dirname, filePath) if (fs.lstatSync(filePath).isDirectory()) { modulePath = path.join(__dirname, filePath, "index.js") } @@ -70,7 +70,7 @@ module.exports = { }, getModulePaths: function() { - let modules = this.getModules(); + var modules = this.getModules(); return Object.keys(modules); }, diff --git a/gulpfile.js b/gulpfile.js index 77041c1bf9c..efb417d7c5c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -62,7 +62,7 @@ gulp.task('bundle', function() { if(modules.length === 0) { modules = allModules; } else { - let diff = _.difference(modules, allModules); + var diff = _.difference(modules, allModules); if(diff.length !== 0) { throw new gutil.PluginError({ plugin: 'bundle', From a3ebda22911993998024ef16845f3bb51cb27a83 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Wed, 17 May 2017 13:23:24 -0600 Subject: [PATCH 005/111] example of using modules for concatenation through webpack code-splitting --- karma.conf.js | 17 +- modules/rubiconAdapter.js | 694 +++++++++++------------ test/spec/modules/rubiconAdapter_spec.js | 6 +- webpack.conf.js | 7 +- 4 files changed, 361 insertions(+), 363 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index e711d9b5647..3751b73e4dc 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,13 +1,16 @@ // Karma configuration // Generated on Thu Aug 07 2014 09:45:28 GMT-0700 (PDT) var webpackConfig = require('./webpack.conf'); -// webpackConfig.module.postLoaders = [ -// { -// test: /\.js$/, -// exclude: /(node_modules)|(test)|(integrationExamples)|(build)|polyfill.js|(src\/adapters\/analytics\/ga.js)/, -// loader: 'istanbul-instrumenter' -// } -// ]; +webpackConfig.module.postLoaders = [ + { + test: /\.js$/, + exclude: /(node_modules)|(test)|(integrationExamples)|(build)|polyfill.js|(src\/adapters\/analytics\/ga.js)/, + loader: 'istanbul-instrumenter' + } +]; + +// remove optimize plugin for tests +webpackConfig.plugins.pop(); var CI_MODE = process.env.NODE_ENV === 'ci'; diff --git a/modules/rubiconAdapter.js b/modules/rubiconAdapter.js index 5387c9729fb..986e53259f4 100644 --- a/modules/rubiconAdapter.js +++ b/modules/rubiconAdapter.js @@ -1,273 +1,269 @@ -$$PREBID_GLOBAL$$.module('rubiconAdapter', function({ - createNewAdapter, - bidfactory, - bidmanager, - adaptermanager, - utils, - ajax, - constants: { - STATUS - } -}) { - const RUBICON_BIDDER_CODE = 'rubicon'; +import * as Adapter from 'src/adapters/adapter'; +import bidfactory from 'src/bidfactory'; +import bidmanager from 'src/bidmanager'; +import * as utils from 'src/utils'; +import { ajax } from 'src/ajax'; +import { STATUS } from 'src/constants'; + +const RUBICON_BIDDER_CODE = 'rubicon'; // use deferred function call since version isn't defined yet at this point - function getIntegration() { - return 'pbjs_lite_' + $$PREBID_GLOBAL$$.version; - } +function getIntegration() { + return 'pbjs_lite_' + $$PREBID_GLOBAL$$.version; +} // use protocol relative urls for http or https - const FASTLANE_ENDPOINT = '//fastlane.rubiconproject.com/a/api/fastlane.json'; - const VIDEO_ENDPOINT = '//fastlane-adv.rubiconproject.com/v1/auction/video'; - - const TIMEOUT_BUFFER = 500; - - var sizeMap = { - 1: '468x60', - 2: '728x90', - 8: '120x600', - 9: '160x600', - 10: '300x600', - 15: '300x250', - 16: '336x280', - 19: '300x100', - 43: '320x50', - 44: '300x50', - 48: '300x300', - 54: '300x1050', - 55: '970x90', - 57: '970x250', - 58: '1000x90', - 59: '320x80', - 61: '1000x1000', - 65: '640x480', - 67: '320x480', - 68: '1800x1000', - 72: '320x320', - 73: '320x160', - 83: '480x300', - 94: '970x310', - 96: '970x210', - 101: '480x320', - 102: '768x1024', - 113: '1000x300', - 117: '320x100', - 125: '800x250', - 126: '200x600' - }; - utils._each(sizeMap, (item, key) => sizeMap[item] = key); - - function RubiconAdapter() { - - function _callBids(bidderRequest) { - var bids = bidderRequest.bids || []; - - bids.forEach(bid => { - try { - // Video endpoint only accepts POST calls - if (bid.mediaType === 'video') { - ajax( - VIDEO_ENDPOINT, - { - success: bidCallback, - error: bidError - }, - buildVideoRequestPayload(bid, bidderRequest), - { - withCredentials: true - } - ); - } else { - ajax( - buildOptimizedCall(bid), - { - success: bidCallback, - error: bidError - }, - undefined, - { - withCredentials: true - } - ); - } - } catch (err) { - utils.logError('Error sending rubicon request for placement code ' + bid.placementCode, null, err); - addErrorBid(); - } - - function bidCallback(responseText) { - try { - utils.logMessage('XHR callback function called for ad ID: ' + bid.bidId); - handleRpCB(responseText, bid); - } catch (err) { - if (typeof err === 'string') { - utils.logWarn(`${err} when processing rubicon response for placement code ${bid.placementCode}`); - } else { - utils.logError('Error processing rubicon response for placement code ' + bid.placementCode, null, err); - } - addErrorBid(); - } - } - - function bidError(err, xhr) { - utils.logError('Request for rubicon responded with:', xhr.status, err); - addErrorBid(); - } - - function addErrorBid() { - let badBid = bidfactory.createBid(STATUS.NO_BID, bid); - badBid.bidderCode = bid.bidder; - bidmanager.addBidResponse(bid.placementCode, badBid); - } - }); +const FASTLANE_ENDPOINT = '//fastlane.rubiconproject.com/a/api/fastlane.json'; +const VIDEO_ENDPOINT = '//fastlane-adv.rubiconproject.com/v1/auction/video'; + +const TIMEOUT_BUFFER = 500; + +var sizeMap = { + 1:'468x60', + 2:'728x90', + 8:'120x600', + 9:'160x600', + 10:'300x600', + 15:'300x250', + 16:'336x280', + 19:'300x100', + 43:'320x50', + 44:'300x50', + 48:'300x300', + 54:'300x1050', + 55:'970x90', + 57:'970x250', + 58:'1000x90', + 59:'320x80', + 61:'1000x1000', + 65:'640x480', + 67:'320x480', + 68:'1800x1000', + 72:'320x320', + 73:'320x160', + 83:'480x300', + 94:'970x310', + 96:'970x210', + 101:'480x320', + 102:'768x1024', + 113:'1000x300', + 117:'320x100', + 125:'800x250', + 126:'200x600' +}; +utils._each(sizeMap, (item, key) => sizeMap[item] = key); + +function RubiconAdapter() { + + function _callBids(bidderRequest) { + var bids = bidderRequest.bids || []; + + bids.forEach(bid => { + try { + // Video endpoint only accepts POST calls + if (bid.mediaType === 'video') { + ajax( + VIDEO_ENDPOINT, + { + success: bidCallback, + error: bidError + }, + buildVideoRequestPayload(bid, bidderRequest), + { + withCredentials: true + } + ); + } else { + ajax( + buildOptimizedCall(bid), + { + success: bidCallback, + error: bidError + }, + undefined, + { + withCredentials: true + } + ); } - - function _getScreenResolution() { - return [window.screen.width, window.screen.height].join('x'); + } catch(err) { + utils.logError('Error sending rubicon request for placement code ' + bid.placementCode, null, err); + addErrorBid(); + } + + function bidCallback(responseText) { + try { + utils.logMessage('XHR callback function called for ad ID: ' + bid.bidId); + handleRpCB(responseText, bid); + } catch (err) { + if (typeof err === 'string') { + utils.logWarn(`${err} when processing rubicon response for placement code ${bid.placementCode}`); + } else { + utils.logError('Error processing rubicon response for placement code ' + bid.placementCode, null, err); + } + addErrorBid(); } + } + + function bidError(err, xhr) { + utils.logError('Request for rubicon responded with:', xhr.status, err); + addErrorBid(); + } + + function addErrorBid() { + let badBid = bidfactory.createBid(STATUS.NO_BID, bid); + badBid.bidderCode = bid.bidder; + bidmanager.addBidResponse(bid.placementCode, badBid); + } + }); + } - function buildVideoRequestPayload(bid, bidderRequest) { - bid.startTime = new Date().getTime(); + function _getScreenResolution() { + return [window.screen.width, window.screen.height].join('x'); + } - let params = bid.params; + function buildVideoRequestPayload(bid, bidderRequest) { + bid.startTime = new Date().getTime(); - if (!params || typeof params.video !== 'object') { - throw 'Invalid Video Bid'; - } + let params = bid.params; - let size; - if (params.video.playerWidth && params.video.playerHeight) { - size = [ - params.video.playerWidth, - params.video.playerHeight - ]; - } else if ( - Array.isArray(bid.sizes) && bid.sizes.length > 0 && - Array.isArray(bid.sizes[0]) && bid.sizes[0].length > 1 - ) { - size = bid.sizes[0]; - } else { - throw 'Invalid Video Bid - No size provided'; - } + if(!params || typeof params.video !== 'object') { + throw 'Invalid Video Bid'; + } - let postData = { - page_url: !params.referrer ? utils.getTopWindowUrl() : params.referrer, - resolution: _getScreenResolution(), - account_id: params.accountId, - integration: getIntegration(), - timeout: bidderRequest.timeout - (Date.now() - bidderRequest.auctionStart + TIMEOUT_BUFFER), - stash_creatives: true, - ae_pass_through_parameters: params.video.aeParams, - slots: [] - }; - - // Define the slot object - let slotData = { - site_id: params.siteId, - zone_id: params.zoneId, - position: params.position || 'btf', - floor: parseFloat(params.floor) > 0.01 ? params.floor : 0.01, - element_id: bid.placementCode, - name: bid.placementCode, - language: params.video.language, - width: size[0], - height: size[1] - }; - - // check and add inventory, keywords, visitor and size_id data - if (params.video.size_id) { - slotData.size_id = params.video.size_id; - } else { - throw 'Invalid Video Bid - Invalid Ad Type!'; - } + let size; + if(params.video.playerWidth && params.video.playerHeight) { + size = [ + params.video.playerWidth, + params.video.playerHeight + ]; + } else if( + Array.isArray(bid.sizes) && bid.sizes.length > 0 && + Array.isArray(bid.sizes[0]) && bid.sizes[0].length > 1 + ) { + size = bid.sizes[0]; + } else { + throw 'Invalid Video Bid - No size provided'; + } - if (params.inventory && typeof params.inventory === 'object') { - slotData.inventory = params.inventory; - } + let postData = { + page_url: !params.referrer ? utils.getTopWindowUrl() : params.referrer, + resolution: _getScreenResolution(), + account_id: params.accountId, + integration: getIntegration(), + timeout: bidderRequest.timeout - (Date.now() - bidderRequest.auctionStart + TIMEOUT_BUFFER), + stash_creatives: true, + ae_pass_through_parameters: params.video.aeParams, + slots: [] + }; - if (params.keywords && Array.isArray(params.keywords)) { - slotData.keywords = params.keywords; - } + // Define the slot object + let slotData = { + site_id: params.siteId, + zone_id: params.zoneId, + position: params.position || 'btf', + floor: parseFloat(params.floor) > 0.01 ? params.floor : 0.01, + element_id: bid.placementCode, + name: bid.placementCode, + language: params.video.language, + width: size[0], + height: size[1] + }; - if (params.visitor && typeof params.visitor === 'object') { - slotData.visitor = params.visitor; - } + // check and add inventory, keywords, visitor and size_id data + if(params.video.size_id) { + slotData.size_id = params.video.size_id; + } else { + throw 'Invalid Video Bid - Invalid Ad Type!'; + } - postData.slots.push(slotData); + if(params.inventory && typeof params.inventory === 'object') { + slotData.inventory = params.inventory; + } - return (JSON.stringify(postData)); - } + if(params.keywords && Array.isArray(params.keywords)) { + slotData.keywords = params.keywords; + } - function buildOptimizedCall(bid) { - bid.startTime = new Date().getTime(); - - var { - accountId, - siteId, - zoneId, - position, - floor, - keywords, - visitor, - inventory, - userId, - referrer: pageUrl - } = bid.params; - - // defaults - floor = (floor = parseFloat(floor)) > 0.01 ? floor : 0.01; - position = position || 'btf'; - - // use rubicon sizes if provided, otherwise adUnit.sizes - var parsedSizes = RubiconAdapter.masSizeOrdering(Array.isArray(bid.params.sizes) ? - bid.params.sizes.map(size => (sizeMap[size] || '').split('x')) : bid.sizes - ); - - if (parsedSizes.length < 1) { - throw 'no valid sizes'; - } + if(params.visitor && typeof params.visitor === 'object') { + slotData.visitor = params.visitor; + } - if (!/^\d+$/.test(accountId)) { - throw 'invalid accountId provided'; - } + postData.slots.push(slotData); - // using array to honor ordering. if order isn't important (it shouldn't be), an object would probably be preferable - var queryString = [ - 'account_id', accountId, - 'site_id', siteId, - 'zone_id', zoneId, - 'size_id', parsedSizes[0], - 'alt_size_ids', parsedSizes.slice(1).join(',') || undefined, - 'p_pos', position, - 'rp_floor', floor, - 'tk_flint', getIntegration(), - 'p_screen_res', _getScreenResolution(), - 'kw', keywords, - 'tk_user_key', userId - ]; - - if (visitor !== null && typeof visitor === 'object') { - utils._each(visitor, (item, key) => queryString.push(`tg_v.${key}`, item)); - } + return(JSON.stringify(postData)); + } - if (inventory !== null && typeof inventory === 'object') { - utils._each(inventory, (item, key) => queryString.push(`tg_i.${key}`, item)); - } + function buildOptimizedCall(bid) { + bid.startTime = new Date().getTime(); + + var { + accountId, + siteId, + zoneId, + position, + floor, + keywords, + visitor, + inventory, + userId, + referrer: pageUrl + } = bid.params; + + // defaults + floor = (floor = parseFloat(floor)) > 0.01 ? floor : 0.01; + position = position || 'btf'; + + // use rubicon sizes if provided, otherwise adUnit.sizes + var parsedSizes = RubiconAdapter.masSizeOrdering(Array.isArray(bid.params.sizes) ? + bid.params.sizes.map(size => (sizeMap[size] || '').split('x')) : bid.sizes + ); + + if(parsedSizes.length < 1) { + throw 'no valid sizes'; + } - queryString.push( - 'rand', Math.random(), - 'rf', !pageUrl ? utils.getTopWindowUrl() : pageUrl - ); - - return queryString.reduce( - (memo, curr, index) => - index % 2 === 0 && queryString[index + 1] !== undefined ? - memo + curr + '=' + encodeURIComponent(queryString[index + 1]) + '&' : memo, - FASTLANE_ENDPOINT + '?' - ).slice(0, -1); // remove trailing & - } + if(!/^\d+$/.test(accountId)) { + throw 'invalid accountId provided'; + } + + // using array to honor ordering. if order isn't important (it shouldn't be), an object would probably be preferable + var queryString = [ + 'account_id', accountId, + 'site_id', siteId, + 'zone_id', zoneId, + 'size_id', parsedSizes[0], + 'alt_size_ids', parsedSizes.slice(1).join(',') || undefined, + 'p_pos', position, + 'rp_floor', floor, + 'tk_flint', getIntegration(), + 'p_screen_res', _getScreenResolution(), + 'kw', keywords, + 'tk_user_key', userId + ]; + + if(visitor !== null && typeof visitor === 'object') { + utils._each(visitor, (item, key) => queryString.push(`tg_v.${key}`, item)); + } - let _renderCreative = (script, impId) => ` + if(inventory !== null && typeof inventory === 'object') { + utils._each(inventory, (item, key) => queryString.push(`tg_i.${key}`, item)); + } + + queryString.push( + 'rand', Math.random(), + 'rf', !pageUrl ? utils.getTopWindowUrl() : pageUrl + ); + + return queryString.reduce( + (memo, curr, index) => + index % 2 === 0 && queryString[index + 1] !== undefined ? + memo + curr + '=' + encodeURIComponent(queryString[index + 1]) + '&' : memo, + FASTLANE_ENDPOINT + '?' + ).slice(0, -1); // remove trailing & + } + + let _renderCreative = (script, impId) => ` @@ -277,114 +273,112 @@ $$PREBID_GLOBAL$$.module('rubiconAdapter', function({ `; - function handleRpCB(responseText, bidRequest) { - var responseObj = JSON.parse(responseText), // can throw - ads = responseObj.ads, - adResponseKey = bidRequest.placementCode; + function handleRpCB(responseText, bidRequest) { + var responseObj = JSON.parse(responseText), // can throw + ads = responseObj.ads, + adResponseKey = bidRequest.placementCode; - // check overall response - if (typeof responseObj !== 'object' || responseObj.status !== 'ok') { - throw 'bad response'; - } + // check overall response + if(typeof responseObj !== 'object' || responseObj.status !== 'ok') { + throw 'bad response'; + } - // video ads array is wrapped in an object - if (bidRequest.mediaType === 'video' && typeof ads === 'object') { - ads = ads[adResponseKey]; - } + // video ads array is wrapped in an object + if (bidRequest.mediaType === 'video' && typeof ads === 'object') { + ads = ads[adResponseKey]; + } - // check the ad response - if (!Array.isArray(ads) || ads.length < 1) { - throw 'invalid ad response'; - } + // check the ad response + if(!Array.isArray(ads) || ads.length < 1) { + throw 'invalid ad response'; + } - // if there are multiple ads, sort by CPM - ads = ads.sort(_adCpmSort); - - ads.forEach(ad => { - if (ad.status !== 'ok') { - throw 'bad ad status'; - } - - //store bid response - //bid status is good (indicating 1) - var bid = bidfactory.createBid(STATUS.GOOD, bidRequest); - bid.creative_id = ad.ad_id; - bid.bidderCode = bidRequest.bidder; - bid.cpm = ad.cpm || 0; - bid.dealId = ad.deal; - if (bidRequest.mediaType === 'video') { - bid.width = bidRequest.params.video.playerWidth; - bid.height = bidRequest.params.video.playerHeight; - bid.vastUrl = ad.creative_depot_url; - bid.descriptionUrl = ad.impression_id; - bid.impression_id = ad.impression_id; - } else { - bid.ad = _renderCreative(ad.script, ad.impression_id); - [bid.width, bid.height] = sizeMap[ad.size_id].split('x').map(num => Number(num)); - } - - // add server-side targeting - bid.rubiconTargeting = (Array.isArray(ad.targeting) ? ad.targeting : []) - .reduce((memo, item) => { - memo[item.key] = item.values[0]; - return memo; - }, {'rpfl_elemid': bidRequest.placementCode}); - - try { - bidmanager.addBidResponse(bidRequest.placementCode, bid); - } catch (err) { - utils.logError('Error from addBidResponse', null, err); - } - }); - } + // if there are multiple ads, sort by CPM + ads = ads.sort(_adCpmSort); + + ads.forEach(ad => { + if(ad.status !== 'ok') { + throw 'bad ad status'; + } + + //store bid response + //bid status is good (indicating 1) + var bid = bidfactory.createBid(STATUS.GOOD, bidRequest); + bid.creative_id = ad.ad_id; + bid.bidderCode = bidRequest.bidder; + bid.cpm = ad.cpm || 0; + bid.dealId = ad.deal; + if (bidRequest.mediaType === 'video') { + bid.width = bidRequest.params.video.playerWidth; + bid.height = bidRequest.params.video.playerHeight; + bid.vastUrl = ad.creative_depot_url; + bid.descriptionUrl = ad.impression_id; + bid.impression_id = ad.impression_id; + } else { + bid.ad = _renderCreative(ad.script, ad.impression_id); + [bid.width, bid.height] = sizeMap[ad.size_id].split('x').map(num => Number(num)); + } + + // add server-side targeting + bid.rubiconTargeting = (Array.isArray(ad.targeting) ? ad.targeting : []) + .reduce((memo, item) => { + memo[item.key] = item.values[0]; + return memo; + }, {'rpfl_elemid': bidRequest.placementCode}); + + try { + bidmanager.addBidResponse(bidRequest.placementCode, bid); + } catch (err) { + utils.logError('Error from addBidResponse', null, err); + } + }); + } - function _adCpmSort(adA, adB) { - return (adB.cpm || 0.0) - (adA.cpm || 0.0); - } + function _adCpmSort(adA, adB) { + return (adB.cpm || 0.0) - (adA.cpm || 0.0); + } - return Object.assign(createNewAdapter(RUBICON_BIDDER_CODE), { - callBids: _callBids, - createNew: RubiconAdapter.createNew - }); - } + return Object.assign(Adapter.createNew(RUBICON_BIDDER_CODE), { + callBids: _callBids, + createNew: RubiconAdapter.createNew + }); +} + +RubiconAdapter.masSizeOrdering = function(sizes) { + const MAS_SIZE_PRIORITY = [15, 2, 9]; + + return utils.parseSizesInput(sizes) + // map sizes while excluding non-matches + .reduce((result, size) => { + let mappedSize = parseInt(sizeMap[size], 10); + if(mappedSize) { + result.push(mappedSize); + } + return result; + }, []) + .sort((first, second) => { + // sort by MAS_SIZE_PRIORITY priority order + let firstPriority = MAS_SIZE_PRIORITY.indexOf(first), + secondPriority = MAS_SIZE_PRIORITY.indexOf(second); + + if(firstPriority > -1 || secondPriority > -1) { + if(firstPriority === -1) { + return 1; + } + if(secondPriority === -1) { + return -1; + } + return firstPriority - secondPriority; + } - RubiconAdapter.masSizeOrdering = function (sizes) { - const MAS_SIZE_PRIORITY = [15, 2, 9]; - - return utils.parseSizesInput(sizes) - // map sizes while excluding non-matches - .reduce((result, size) => { - let mappedSize = parseInt(sizeMap[size], 10); - if (mappedSize) { - result.push(mappedSize); - } - return result; - }, []) - .sort((first, second) => { - // sort by MAS_SIZE_PRIORITY priority order - let firstPriority = MAS_SIZE_PRIORITY.indexOf(first), - secondPriority = MAS_SIZE_PRIORITY.indexOf(second); - - if (firstPriority > -1 || secondPriority > -1) { - if (firstPriority === -1) { - return 1; - } - if (secondPriority === -1) { - return -1; - } - return firstPriority - secondPriority; - } - - // and finally ascending order - return first - second; - }); - }; + // and finally ascending order + return first - second; + }); +}; - RubiconAdapter.createNew = function () { - return new RubiconAdapter(); - }; +RubiconAdapter.createNew = function() { + return new RubiconAdapter(); +}; - adaptermanager.registerBidAdapter(new RubiconAdapter, RUBICON_BIDDER_CODE); - adaptermanager.aliasBidAdapter(RUBICON_BIDDER_CODE, 'rubiconLite'); - return RubiconAdapter; -}); \ No newline at end of file +adaptermanager.registerBidAdapter(new RubiconAdapter, RUBICON_BIDDER_CODE); +adaptermanager.aliasBidAdapter(RUBICON_BIDDER_CODE, 'rubiconLite'); diff --git a/test/spec/modules/rubiconAdapter_spec.js b/test/spec/modules/rubiconAdapter_spec.js index fd5c0002c31..1e45c7c0ffb 100644 --- a/test/spec/modules/rubiconAdapter_spec.js +++ b/test/spec/modules/rubiconAdapter_spec.js @@ -2,17 +2,13 @@ import { expect } from 'chai'; import adloader from 'src/adloader'; import adapterManager from 'src/adaptermanager'; import bidManager from 'src/bidmanager'; +import RubiconAdapter from 'src/adapters/rubicon'; import {parse as parseQuery} from 'querystring'; -import { getModule } from '../../helpers/testModule'; var CONSTANTS = require('src/constants.json'); const INTEGRATION = `pbjs_lite_v$prebid.version$`; // $prebid.version$ will be substituted in by gulp in built prebid -var RubiconAdapter = getModule(function() { - require('../../../modules/rubiconAdapter'); -})(); - describe('the rubicon adapter', () => { let sandbox, diff --git a/webpack.conf.js b/webpack.conf.js index 42ada98ad11..0196846c16e 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -1,6 +1,7 @@ var prebid = require('./package.json'); var StringReplacePlugin = require('string-replace-webpack-plugin'); var path = require('path'); +var webpack = require('webpack'); module.exports = { devtool: 'source-map', @@ -10,6 +11,9 @@ module.exports = { resolveLoader: { modulesDirectories: ['loaders', 'node_modules'] }, + output: { + jsonpFunction: 'pbjsSeg' + }, module: { loaders: [ { @@ -71,6 +75,7 @@ module.exports = { ] }, plugins: [ - new StringReplacePlugin() + new StringReplacePlugin(), + new webpack.optimize.CommonsChunkPlugin('prebid.js') ] }; From 53485de09c5f053f1061e8b11b4e3f4fe97bc49f Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 25 May 2017 10:48:04 -0600 Subject: [PATCH 006/111] fixes for webpack code-splitting --- gulpHelpers.js | 2 +- gulpfile.js | 17 +++------ moduleConfig.json | 5 --- src/prebid.js | 94 +++++++++++++++++++++++------------------------ 4 files changed, 53 insertions(+), 65 deletions(-) delete mode 100644 moduleConfig.json diff --git a/gulpHelpers.js b/gulpHelpers.js index 483e52dd693..bd09a43cf21 100644 --- a/gulpHelpers.js +++ b/gulpHelpers.js @@ -81,7 +81,7 @@ module.exports = { nameModules: function() { var modules = this.getModules(); return through.obj(function(file, enc, done) { - file.named = modules[file.path] ? modules[file.path] : 'prebid'; + file.named = modules[file.path] ? modules[file.path] : 'prebid.js'; this.push(file); done(); }) diff --git a/gulpfile.js b/gulpfile.js index efb417d7c5c..4a6884d357d 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -57,8 +57,6 @@ gulp.task('bundle', function() { var modules = (argv.modules || '').split(',').filter(module => !!module), allModules = helpers.getModuleNames(); - // var configFile = argv.moduleConfig ? argv.moduleConfig : path.join(__dirname, './moduleConfig.json'); - if(modules.length === 0) { modules = allModules; } else { @@ -76,15 +74,12 @@ gulp.task('bundle', function() { helpers.getBuiltModules(argv.dev, modules) ) ).pipe(concat(argv.bundleName ? argv.bundleName : 'bundle.js', {newLine: ''})) - .pipe(gulpif(!argv.manualEnable, footer('<%= global %>.enableModules(<%= config %>);', { - global: prebid.globalVarName, - config: JSON.stringify(_.pick( - JSON.parse( - fs.readFileSync(argv.config ? argv.config : './moduleConfig.json', 'utf8') - ), - modules - )) - }))) + .pipe(gulpif(!argv.manualEnable, footer( + '<%= global %>.processQueue(<%= global %>.que);<%= global %>.processQueue(<%= global %>.cmd)', + { + global: prebid.globalVarName + } + ))) .pipe(gulp.dest('build/' + (argv.dev ? 'dev' : 'dist'))); }); diff --git a/moduleConfig.json b/moduleConfig.json deleted file mode 100644 index 9f60ec41604..00000000000 --- a/moduleConfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "express": { - "enabled": true - } -} \ No newline at end of file diff --git a/src/prebid.js b/src/prebid.js index 9637e19e0c5..97fae92893b 100644 --- a/src/prebid.js +++ b/src/prebid.js @@ -78,54 +78,6 @@ $$PREBID_GLOBAL$$.adUnits = $$PREBID_GLOBAL$$.adUnits || []; // delay to request cookie sync to stay out of critical path $$PREBID_GLOBAL$$.cookieSyncDelay = $$PREBID_GLOBAL$$.cookieSyncDelay || 100; - -/** - * This queue lets users load Prebid asynchronously, but run functions the same way regardless of whether it gets loaded - * before or after their script executes. For example, given the code: - * - * - * - * - * If the page's script runs before prebid loads, then their function gets added to the queue, and executed - * by prebid once it's done loading. If it runs after prebid loads, then this monkey-patch causes their - * function to execute immediately. - * - * @param {function} cmd A function which takes no arguments. This is guaranteed to run exactly once, and only after - * the Prebid script has been fully loaded. - * @alias module:$$PREBID_GLOBAL$$.cmd.push - */ -$$PREBID_GLOBAL$$.cmd.push = function(cmd) { - if (typeof cmd === objectType_function) { - try { - cmd.call(); - } catch (e) { - utils.logError('Error processing command :' + e.message); - } - } else { - utils.logError('Commands written into $$PREBID_GLOBAL$$.cmd.push must be wrapped in a function'); - } -}; - -$$PREBID_GLOBAL$$.que.push = $$PREBID_GLOBAL$$.cmd.push; - -function processQueue(queue) { - queue.forEach(function(cmd) { - if (typeof cmd.called === objectType_undefined) { - try { - cmd.call(); - cmd.called = true; - } - catch (e) { - utils.logError('Error processing command :', 'prebid.js', e); - } - } - }); -} - function checkDefinedPlacement(id) { var placementCodes = $$PREBID_GLOBAL$$._bidsRequested.map(bidSet => bidSet.bids.map(bid => bid.placementCode)) .reduce(flatten) @@ -787,3 +739,49 @@ Object.assign($$PREBID_GLOBAL$$, { $$PREBID_GLOBAL$$.que.push(() => listenMessagesFromCreative()); +/** + * This queue lets users load Prebid asynchronously, but run functions the same way regardless of whether it gets loaded + * before or after their script executes. For example, given the code: + * + * + * + * + * If the page's script runs before prebid loads, then their function gets added to the queue, and executed + * by prebid once it's done loading. If it runs after prebid loads, then this monkey-patch causes their + * function to execute immediately. + * + * @param {function} cmd A function which takes no arguments. This is guaranteed to run exactly once, and only after + * the Prebid script has been fully loaded. + * @alias module:$$PREBID_GLOBAL$$.cmd.push + */ +$$PREBID_GLOBAL$$.cmd.push = function(cmd) { + if (typeof cmd === objectType_function) { + try { + cmd.call(); + } catch (e) { + utils.logError('Error processing command :' + e.message); + } + } else { + utils.logError('Commands written into $$PREBID_GLOBAL$$.cmd.push must be wrapped in a function'); + } +}; + +$$PREBID_GLOBAL$$.que.push = $$PREBID_GLOBAL$$.cmd.push; + +$$PREBID_GLOBAL$$.processQueue = function processQueue(queue) { + queue.forEach(function(cmd) { + if (typeof cmd.called === objectType_undefined) { + try { + cmd.call(); + cmd.called = true; + } + catch (e) { + utils.logError('Error processing command :', 'prebid.js', e); + } + } + }); +} From 86008bb1ebb172ba156c2f2f91fc84b77ea027b5 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Wed, 31 May 2017 09:31:35 -0600 Subject: [PATCH 007/111] changes including config through setConfig and getConfig callback --- gulpfile.js | 4 +- modules/rubiconAdapter.js | 173 ++++++++++------- src/adapter.js | 24 +++ src/config.js | 49 +++++ src/dependencyResolver.js | 65 ------- src/modules.js | 130 ------------- src/prebid.js | 16 +- test/helpers/testModule.js | 18 -- test/spec/modules/rubiconAdapter_spec.js | 227 +++++++++++++++-------- webpack.conf.js | 2 +- 10 files changed, 340 insertions(+), 368 deletions(-) create mode 100644 src/adapter.js create mode 100644 src/config.js delete mode 100644 src/dependencyResolver.js delete mode 100644 src/modules.js delete mode 100644 test/helpers/testModule.js diff --git a/gulpfile.js b/gulpfile.js index 4a6884d357d..97855c88bde 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -74,9 +74,7 @@ gulp.task('bundle', function() { helpers.getBuiltModules(argv.dev, modules) ) ).pipe(concat(argv.bundleName ? argv.bundleName : 'bundle.js', {newLine: ''})) - .pipe(gulpif(!argv.manualEnable, footer( - '<%= global %>.processQueue(<%= global %>.que);<%= global %>.processQueue(<%= global %>.cmd)', - { + .pipe(gulpif(!argv.manualEnable, footer('<%= global %>.processQueue();', { global: prebid.globalVarName } ))) diff --git a/modules/rubiconAdapter.js b/modules/rubiconAdapter.js index 986e53259f4..accd7cfa478 100644 --- a/modules/rubiconAdapter.js +++ b/modules/rubiconAdapter.js @@ -1,9 +1,11 @@ -import * as Adapter from 'src/adapters/adapter'; +import * as Adapter from 'src/adapter'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; +import adaptermanager from 'src/adaptermanager'; import * as utils from 'src/utils'; import { ajax } from 'src/ajax'; import { STATUS } from 'src/constants'; +import { getConfig } from 'src/config'; const RUBICON_BIDDER_CODE = 'rubicon'; @@ -12,49 +14,66 @@ function getIntegration() { return 'pbjs_lite_' + $$PREBID_GLOBAL$$.version; } +function isSecure() { + return location.protocol === 'https:'; +} + // use protocol relative urls for http or https const FASTLANE_ENDPOINT = '//fastlane.rubiconproject.com/a/api/fastlane.json'; const VIDEO_ENDPOINT = '//fastlane-adv.rubiconproject.com/v1/auction/video'; const TIMEOUT_BUFFER = 500; +var ACCOUNT_ID; +getConfig('rubiconAdapter', config => ACCOUNT_ID = config.accountId); + + var sizeMap = { - 1:'468x60', - 2:'728x90', - 8:'120x600', - 9:'160x600', - 10:'300x600', - 15:'300x250', - 16:'336x280', - 19:'300x100', - 43:'320x50', - 44:'300x50', - 48:'300x300', - 54:'300x1050', - 55:'970x90', - 57:'970x250', - 58:'1000x90', - 59:'320x80', - 61:'1000x1000', - 65:'640x480', - 67:'320x480', - 68:'1800x1000', - 72:'320x320', - 73:'320x160', - 83:'480x300', - 94:'970x310', - 96:'970x210', - 101:'480x320', - 102:'768x1024', - 113:'1000x300', - 117:'320x100', - 125:'800x250', - 126:'200x600' + 1: '468x60', + 2: '728x90', + 8: '120x600', + 9: '160x600', + 10: '300x600', + 15: '300x250', + 16: '336x280', + 19: '300x100', + 31: '980x120', + 32: '250x360', + 33: '180x500', + 35: '980x150', + 37: '468x400', + 38: '930x180', + 43: '320x50', + 44: '300x50', + 48: '300x300', + 54: '300x1050', + 55: '970x90', + 57: '970x250', + 58: '1000x90', + 59: '320x80', + 61: '1000x1000', + 65: '640x480', + 67: '320x480', + 68: '1800x1000', + 72: '320x320', + 73: '320x160', + 78: '980x240', + 79: '980x300', + 80: '980x400', + 83: '480x300', + 94: '970x310', + 96: '970x210', + 101: '480x320', + 102: '768x1024', + 103: '480x280', + 113: '1000x300', + 117: '320x100', + 125: '800x250', + 126: '200x600' }; utils._each(sizeMap, (item, key) => sizeMap[item] = key); function RubiconAdapter() { - function _callBids(bidderRequest) { var bids = bidderRequest.bids || []; @@ -86,7 +105,7 @@ function RubiconAdapter() { } ); } - } catch(err) { + } catch (err) { utils.logError('Error sending rubicon request for placement code ' + bid.placementCode, null, err); addErrorBid(); } @@ -122,22 +141,38 @@ function RubiconAdapter() { return [window.screen.width, window.screen.height].join('x'); } + function _getDigiTrustQueryParams() { + function getDigiTrustId() { + let digiTrustUser = window.DigiTrust && window.DigiTrust.getUser({member: 'T9QSFKPDN9'}); + return digiTrustUser && digiTrustUser.success && digiTrustUser.identity || null; + } + let digiTrustId = getDigiTrustId(); + // Verify there is an ID and this user has not opted out + if (!digiTrustId || digiTrustId.privacy && digiTrustId.privacy.optout) { + return []; + } + return [ + 'dt.id', digiTrustId.id, + 'dt.keyv', digiTrustId.keyv + ]; + } + function buildVideoRequestPayload(bid, bidderRequest) { bid.startTime = new Date().getTime(); let params = bid.params; - if(!params || typeof params.video !== 'object') { + if (!params || typeof params.video !== 'object') { throw 'Invalid Video Bid'; } let size; - if(params.video.playerWidth && params.video.playerHeight) { + if (params.video.playerWidth && params.video.playerHeight) { size = [ params.video.playerWidth, params.video.playerHeight ]; - } else if( + } else if ( Array.isArray(bid.sizes) && bid.sizes.length > 0 && Array.isArray(bid.sizes[0]) && bid.sizes[0].length > 1 ) { @@ -146,10 +181,10 @@ function RubiconAdapter() { throw 'Invalid Video Bid - No size provided'; } - let postData = { + let postData = { page_url: !params.referrer ? utils.getTopWindowUrl() : params.referrer, - resolution: _getScreenResolution(), - account_id: params.accountId, + resolution: _getScreenResolution(), + account_id: params.accountId || ACCOUNT_ID, integration: getIntegration(), timeout: bidderRequest.timeout - (Date.now() - bidderRequest.auctionStart + TIMEOUT_BUFFER), stash_creatives: true, @@ -171,27 +206,27 @@ function RubiconAdapter() { }; // check and add inventory, keywords, visitor and size_id data - if(params.video.size_id) { + if (params.video.size_id) { slotData.size_id = params.video.size_id; } else { throw 'Invalid Video Bid - Invalid Ad Type!'; } - if(params.inventory && typeof params.inventory === 'object') { + if (params.inventory && typeof params.inventory === 'object') { slotData.inventory = params.inventory; } - if(params.keywords && Array.isArray(params.keywords)) { + if (params.keywords && Array.isArray(params.keywords)) { slotData.keywords = params.keywords; } - if(params.visitor && typeof params.visitor === 'object') { + if (params.visitor && typeof params.visitor === 'object') { slotData.visitor = params.visitor; } postData.slots.push(slotData); - return(JSON.stringify(postData)); + return (JSON.stringify(postData)); } function buildOptimizedCall(bid) { @@ -215,38 +250,39 @@ function RubiconAdapter() { position = position || 'btf'; // use rubicon sizes if provided, otherwise adUnit.sizes - var parsedSizes = RubiconAdapter.masSizeOrdering(Array.isArray(bid.params.sizes) ? - bid.params.sizes.map(size => (sizeMap[size] || '').split('x')) : bid.sizes + var parsedSizes = RubiconAdapter.masSizeOrdering(Array.isArray(bid.params.sizes) + ? bid.params.sizes.map(size => (sizeMap[size] || '').split('x')) : bid.sizes ); - if(parsedSizes.length < 1) { + if (parsedSizes.length < 1) { throw 'no valid sizes'; } - if(!/^\d+$/.test(accountId)) { + if (!/^\d+$/.test(accountId) && !ACCOUNT_ID) { throw 'invalid accountId provided'; } // using array to honor ordering. if order isn't important (it shouldn't be), an object would probably be preferable var queryString = [ - 'account_id', accountId, + 'account_id', accountId || ACCOUNT_ID, 'site_id', siteId, 'zone_id', zoneId, 'size_id', parsedSizes[0], 'alt_size_ids', parsedSizes.slice(1).join(',') || undefined, 'p_pos', position, 'rp_floor', floor, + 'rp_secure', isSecure() ? '1' : '0', 'tk_flint', getIntegration(), 'p_screen_res', _getScreenResolution(), 'kw', keywords, 'tk_user_key', userId ]; - if(visitor !== null && typeof visitor === 'object') { + if (visitor !== null && typeof visitor === 'object') { utils._each(visitor, (item, key) => queryString.push(`tg_v.${key}`, item)); } - if(inventory !== null && typeof inventory === 'object') { + if (inventory !== null && typeof inventory === 'object') { utils._each(inventory, (item, key) => queryString.push(`tg_i.${key}`, item)); } @@ -255,10 +291,12 @@ function RubiconAdapter() { 'rf', !pageUrl ? utils.getTopWindowUrl() : pageUrl ); + queryString = queryString.concat(_getDigiTrustQueryParams()); + return queryString.reduce( (memo, curr, index) => - index % 2 === 0 && queryString[index + 1] !== undefined ? - memo + curr + '=' + encodeURIComponent(queryString[index + 1]) + '&' : memo, + index % 2 === 0 && queryString[index + 1] !== undefined + ? memo + curr + '=' + encodeURIComponent(queryString[index + 1]) + '&' : memo, FASTLANE_ENDPOINT + '?' ).slice(0, -1); // remove trailing & } @@ -275,11 +313,11 @@ function RubiconAdapter() { function handleRpCB(responseText, bidRequest) { var responseObj = JSON.parse(responseText), // can throw - ads = responseObj.ads, - adResponseKey = bidRequest.placementCode; + ads = responseObj.ads, + adResponseKey = bidRequest.placementCode; // check overall response - if(typeof responseObj !== 'object' || responseObj.status !== 'ok') { + if (typeof responseObj !== 'object' || responseObj.status !== 'ok') { throw 'bad response'; } @@ -289,7 +327,7 @@ function RubiconAdapter() { } // check the ad response - if(!Array.isArray(ads) || ads.length < 1) { + if (!Array.isArray(ads) || ads.length < 1) { throw 'invalid ad response'; } @@ -297,12 +335,12 @@ function RubiconAdapter() { ads = ads.sort(_adCpmSort); ads.forEach(ad => { - if(ad.status !== 'ok') { + if (ad.status !== 'ok') { throw 'bad ad status'; } - //store bid response - //bid status is good (indicating 1) + // store bid response + // bid status is good (indicating 1) var bid = bidfactory.createBid(STATUS.GOOD, bidRequest); bid.creative_id = ad.ad_id; bid.bidderCode = bidRequest.bidder; @@ -351,7 +389,7 @@ RubiconAdapter.masSizeOrdering = function(sizes) { // map sizes while excluding non-matches .reduce((result, size) => { let mappedSize = parseInt(sizeMap[size], 10); - if(mappedSize) { + if (mappedSize) { result.push(mappedSize); } return result; @@ -359,13 +397,13 @@ RubiconAdapter.masSizeOrdering = function(sizes) { .sort((first, second) => { // sort by MAS_SIZE_PRIORITY priority order let firstPriority = MAS_SIZE_PRIORITY.indexOf(first), - secondPriority = MAS_SIZE_PRIORITY.indexOf(second); + secondPriority = MAS_SIZE_PRIORITY.indexOf(second); - if(firstPriority > -1 || secondPriority > -1) { - if(firstPriority === -1) { + if (firstPriority > -1 || secondPriority > -1) { + if (firstPriority === -1) { return 1; } - if(secondPriority === -1) { + if (secondPriority === -1) { return -1; } return firstPriority - secondPriority; @@ -382,3 +420,6 @@ RubiconAdapter.createNew = function() { adaptermanager.registerBidAdapter(new RubiconAdapter, RUBICON_BIDDER_CODE); adaptermanager.aliasBidAdapter(RUBICON_BIDDER_CODE, 'rubiconLite'); + +module.exports = RubiconAdapter; + diff --git a/src/adapter.js b/src/adapter.js new file mode 100644 index 00000000000..5e5ea47cb18 --- /dev/null +++ b/src/adapter.js @@ -0,0 +1,24 @@ +function Adapter(code) { + var bidderCode = code; + + function setBidderCode(code) { + bidderCode = code; + } + + function getBidderCode() { + return bidderCode; + } + + function callBids() { + } + + return { + callBids: callBids, + setBidderCode: setBidderCode, + getBidderCode: getBidderCode + }; +} + +exports.createNew = function (bidderCode) { + return new Adapter(bidderCode); +}; diff --git a/src/config.js b/src/config.js new file mode 100644 index 00000000000..1ef1a4def98 --- /dev/null +++ b/src/config.js @@ -0,0 +1,49 @@ + +import { logWarn, logError } from 'utils'; + +const CONFIG_ATTR = 'data-prebid-config'; + +var scripts = document.querySelectorAll(`script[${CONFIG_ATTR}]`); +var scriptConfig = {}; +var config = {}; +var configHandlers = {}; + +for (let i = 0; i < scripts.length; i++) { + try { + let script = scripts[i]; + let attrConfig = script.getAttribute(CONFIG_ATTR); + + if (attrConfig) { + Object.assign(scriptConfig, JSON.parse(attrConfig)); + } + } catch (e) { + logError(`Error parsing ${CONFIG_ATTR}`, null, e); + } +} + +export function setConfig(setConfig) { + Object.assign(config, setConfig); + + Object.keys(setConfig).forEach(property => { + if (Array.isArray(configHandlers[property])) { + configHandlers[property].forEach(handler => { + if (!config[property]) { + logWarn(`no config found for ${property}`); + } + + handler(config[property]); + }) + } + }); +} + +export function getConfig(property, handler) { + if (!configHandlers[property]) { + configHandlers[property] = []; + } + configHandlers[property].push(handler); +} + +export function getScriptConfig(property) { + return scriptConfig[property]; +} diff --git a/src/dependencyResolver.js b/src/dependencyResolver.js deleted file mode 100644 index f20ab8289a7..00000000000 --- a/src/dependencyResolver.js +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @license - * Toposort - Topological sorting for node.js - * Copyright (c) 2012 by Marcel Klehr , 2017 @snapwich - * MIT LICENSE - */ - -export function CyclicDependency(node) { - this.name = 'CylclicDependency'; - this.module = node; - this.stack = (new Error()).stack; -} -CyclicDependency.prototype = new Error(); - -export function UnknownDependency(node) { - this.name = 'UnknownDependency'; - this.module = node; - this.stack = (new Error()).stack; -} -UnknownDependency.prototype = new Error(); - -export function resolve(nodes, edges) { - var cursor = nodes.length, - sorted = new Array(cursor), - visited = {}, - i = cursor; - - while (i--) { - if (!visited[i]) { - visit(nodes[i], i, []); - } - } - - return sorted.reverse(); - - function visit(node, i, predecessors) { - if(predecessors.indexOf(node) >= 0) { - throw new CyclicDependency(node); - } - - if (!~nodes.indexOf(node)) { - throw new UnknownDependency(node); - } - - if (visited[i]) { - return; - } - visited[i] = true; - - // outgoing edges - var outgoing = edges.filter(function(edge){ - return edge[0] === node; - }); - i = outgoing.length; - if (i) { - let preds = predecessors.concat(node); - do { - let child = outgoing[--i][1]; - visit(child, nodes.indexOf(child), preds); - } while (i); - } - - sorted[--cursor] = node; - } -} diff --git a/src/modules.js b/src/modules.js deleted file mode 100644 index 807afc5459e..00000000000 --- a/src/modules.js +++ /dev/null @@ -1,130 +0,0 @@ - -import { resolve, CyclicDependency, UnknownDependency } from './dependencyResolver'; - -import { createNew as createNewAdapter } from './adapters/adapter'; -import { AnalyticsAdapter } from './adapters/analytics/AnalyticsAdapter'; -import bidfactory from 'src/bidfactory'; -import bidmanager from 'src/bidmanager'; -import * as utils from 'src/utils'; -import { loadScript } from 'src/adloader'; -import { ajax } from 'src/ajax'; -import * as constants from 'src/constants'; -import * as adaptermanager from 'src/adaptermanager'; - -var loaded = false, - registry = {}; - -/** - * - * @param name - * @param dependencies - * @param factory - */ -export function module(name, dependencies, factory) { - if (registry[name]) { - utils.logWarn(`redefining module '${name}'`); - } - - let module = createModule(name, dependencies, factory); - - if(module) { - registry[name] = module; - } - - return module; -} - -/** - * - * @param config - */ -export function enableModules(config = {}) { - var loadOrder, - results = {}, - names = Object.keys(registry); - - if (loaded) { - utils.logWarn('attempted to enableModules multiple times'); - return; - } - - try { - loadOrder = resolve( - names, - names.reduce((memo, name) => memo.concat( - registry[name].dependencies.reduce((memo, dependency) => ( - memo.push([name, dependency]), memo - ), []) - ), []) - ); - - } catch(e) { - if (e instanceof CyclicDependency) { - utils.logError(`cyclic dependency found with module ${e.module}`, null, e); - } else if (e instanceof UnknownDependency) { - utils.logError(`module not found: ${e.module}`, null, e); - } else { - utils.logError('error resolving module dependencies', null, e); - } - return false; - } - - loadOrder.forEach(name => { - let module = registry[name]; - try { - results[name] = bootstrap(module, {config: config[name]}, results); - } catch(e) { - utils.logWarn(`error executing module: ${name}`); - } - }); - - loaded = true; -} - -export function createModule(name, dependencies, factory) { - if (typeof dependencies === 'function') { - factory = dependencies; - dependencies = []; - } - - if (typeof name !== "string") { - utils.logError('module missing name'); - } else if (Array.isArray(dependencies) && typeof factory === 'function') { - return { - name, - dependencies, - factory - }; - } else { - utils.logError(`bad module definition for '${name}'`); - } - - return false; -} - -export function bootstrap(module, overrides = {}, results = {}) { - return module.factory.apply( - module, - module.dependencies.map( - dependency => results[dependency] - ).concat( - [ - Object.assign( - { - pbjs: $$PREBID_GLOBAL$$, - createNewAdapter, - AnalyticsAdapter, - bidfactory, - bidmanager, - adaptermanager, - utils, - loadScript, - ajax, - constants - }, - overrides - ) - ] - ) - ); -} diff --git a/src/prebid.js b/src/prebid.js index 97fae92893b..6f334448e8e 100644 --- a/src/prebid.js +++ b/src/prebid.js @@ -2,7 +2,6 @@ import { getGlobal } from './prebidGlobal'; import { flatten, uniques, isGptPubadsDefined, adUnitsFilter } from './utils'; -import { module, enableModules } from "./modules"; import { videoAdUnit, hasNonVideoBidder } from './video'; import { nativeAdUnit, nativeBidder, hasNonNativeBidder } from './native'; import './polyfill'; @@ -12,6 +11,7 @@ import { listenMessagesFromCreative } from './secureCreatives'; import { syncCookies } from 'src/cookie.js'; import { loadScript } from './adloader'; import { setAjaxTimeout } from './ajax'; +import { setConfig } from './config'; var $$PREBID_GLOBAL$$ = getGlobal(); @@ -730,12 +730,7 @@ $$PREBID_GLOBAL$$.setS2SConfig = function(options) { adaptermanager.setS2SConfig(config); }; - -// expose public module API -Object.assign($$PREBID_GLOBAL$$, { - module, - enableModules -}); +$$PREBID_GLOBAL$$.setConfig = setConfig; $$PREBID_GLOBAL$$.que.push(() => listenMessagesFromCreative()); @@ -772,7 +767,7 @@ $$PREBID_GLOBAL$$.cmd.push = function(cmd) { $$PREBID_GLOBAL$$.que.push = $$PREBID_GLOBAL$$.cmd.push; -$$PREBID_GLOBAL$$.processQueue = function processQueue(queue) { +function processQueue(queue) { queue.forEach(function(cmd) { if (typeof cmd.called === objectType_undefined) { try { @@ -785,3 +780,8 @@ $$PREBID_GLOBAL$$.processQueue = function processQueue(queue) { } }); } + +$$PREBID_GLOBAL$$.processQueue = function() { + processQueue($$PREBID_GLOBAL$$.que); + processQueue($$PREBID_GLOBAL$$.cmd); +}; diff --git a/test/helpers/testModule.js b/test/helpers/testModule.js deleted file mode 100644 index c6bb0ba6bcd..00000000000 --- a/test/helpers/testModule.js +++ /dev/null @@ -1,18 +0,0 @@ -import { createModule, bootstrap } from 'src/modules'; - -export function getModule(setCb) { - var tmp = window.$$PREBID_GLOBAL$$; - var testModule = {}; - - window.$$PREBID_GLOBAL$$ = { - module: function() { - testModule = createModule.apply(null, arguments); - } - }; - - setCb(); - - window.$$PREBID_GLOBAL$$ = tmp; - - return bootstrap.bind(null, testModule); -} diff --git a/test/spec/modules/rubiconAdapter_spec.js b/test/spec/modules/rubiconAdapter_spec.js index 1e45c7c0ffb..af4d9a64c32 100644 --- a/test/spec/modules/rubiconAdapter_spec.js +++ b/test/spec/modules/rubiconAdapter_spec.js @@ -1,8 +1,7 @@ import { expect } from 'chai'; -import adloader from 'src/adloader'; import adapterManager from 'src/adaptermanager'; import bidManager from 'src/bidmanager'; -import RubiconAdapter from 'src/adapters/rubicon'; +import RubiconAdapter from 'modules/rubiconAdapter'; import {parse as parseQuery} from 'querystring'; var CONSTANTS = require('src/constants.json'); @@ -10,10 +9,9 @@ var CONSTANTS = require('src/constants.json'); const INTEGRATION = `pbjs_lite_v$prebid.version$`; // $prebid.version$ will be substituted in by gulp in built prebid describe('the rubicon adapter', () => { - let sandbox, - adUnit, - bidderRequest; + adUnit, + bidderRequest; function createVideoBidderRequest() { let bid = bidderRequest.bids[0]; @@ -68,14 +66,14 @@ describe('the rubicon adapter', () => { siteId: '70608', zoneId: '335918', userId: '12346', - keywords: ['a','b','c'], + keywords: ['a', 'b', 'c'], inventory: { - rating:'5-star', - prodtype:'tech' + rating: '5-star', + prodtype: 'tech' }, visitor: { - ucat:'new', - lastsearch:'iphone' + ucat: 'new', + lastsearch: 'iphone' }, position: 'atf', referrer: 'localhost' @@ -96,14 +94,14 @@ describe('the rubicon adapter', () => { siteId: '70608', zoneId: '335918', userId: '12346', - keywords: ['a','b','c'], + keywords: ['a', 'b', 'c'], inventory: { - rating:'5-star', - prodtype:'tech' + rating: '5-star', + prodtype: 'tech' }, visitor: { - ucat:'new', - lastsearch:'iphone' + ucat: 'new', + lastsearch: 'iphone' }, position: 'atf', referrer: 'localhost' @@ -119,7 +117,6 @@ describe('the rubicon adapter', () => { auctionStart: 1472239426000, timeout: 5000 }; - }); afterEach(() => { @@ -127,11 +124,9 @@ describe('the rubicon adapter', () => { }); describe('callBids public interface', () => { - let rubiconAdapter = adapterManager.bidderRegistry['rubicon']; it('should receive a well-formed bidRequest from the adaptermanager', () => { - sandbox.stub(rubiconAdapter, 'callBids'); adapterManager.callBids({ @@ -161,14 +156,11 @@ describe('the rubicon adapter', () => { expect(bidderRequest).to.have.deep.property('bids[0]') .with.property('params') - .that.deep.equals(adUnit.bids[0].params) - + .that.deep.equals(adUnit.bids[0].params); }); - }); describe('MAS mapping / ordering', () => { - let masSizeOrdering = RubiconAdapter.masSizeOrdering; it('should not include values without a proper mapping', () => { @@ -185,26 +177,23 @@ describe('the rubicon adapter', () => { }); it('should sort MAS priority sizes in the proper order w/ rest ascending', () => { - let ordering = masSizeOrdering([[320, 50], [160,600], [640, 480], [300, 250],[336, 280], [200, 600]]); + let ordering = masSizeOrdering([[320, 50], [160, 600], [640, 480], [300, 250], [336, 280], [200, 600]]); expect(ordering).to.deep.equal([15, 9, 16, 43, 65, 126]); - ordering = masSizeOrdering([[320, 50], [300, 250], [160,600], [640, 480],[336, 280], [200, 600], [728, 90]]); + ordering = masSizeOrdering([[320, 50], [300, 250], [160, 600], [640, 480], [336, 280], [200, 600], [728, 90]]); expect(ordering).to.deep.equal([15, 2, 9, 16, 43, 65, 126]); - ordering = masSizeOrdering([[120, 600], [320, 50], [160,600], [640, 480],[336, 280], [200, 600], [728, 90]]); + ordering = masSizeOrdering([[120, 600], [320, 50], [160, 600], [640, 480], [336, 280], [200, 600], [728, 90]]); expect(ordering).to.deep.equal([2, 9, 8, 16, 43, 65, 126]); }); - }); describe('callBids implementation', () => { - let rubiconAdapter; describe('for requests', () => { - let xhr, - bids; + bids; beforeEach(() => { rubiconAdapter = new RubiconAdapter(); @@ -223,9 +212,7 @@ describe('the rubicon adapter', () => { }); describe('to fastlane', () => { - it('should make a well-formed request', () => { - rubiconAdapter.callBids(bidderRequest); let request = xhr.requests[0]; @@ -245,6 +232,7 @@ describe('the rubicon adapter', () => { 'alt_size_ids': '43', 'p_pos': 'atf', 'rp_floor': '0.01', + 'rp_secure': /[01]/, 'tk_flint': INTEGRATION, 'p_screen_res': /\d+x\d+/, 'tk_user_key': '12346', @@ -259,7 +247,7 @@ describe('the rubicon adapter', () => { // test that all values above are both present and correct Object.keys(expectedQuery).forEach(key => { let value = expectedQuery[key]; - if(value instanceof RegExp) { + if (value instanceof RegExp) { expect(query[key]).to.match(value); } else { expect(query[key]).to.equal(value); @@ -267,11 +255,9 @@ describe('the rubicon adapter', () => { }); expect(query).to.have.property('rand'); - }); it('should use rubicon sizes if present', () => { - var sizesBidderRequest = clone(bidderRequest); sizesBidderRequest.bids[0].params.sizes = [55, 57, 59]; @@ -281,13 +267,11 @@ describe('the rubicon adapter', () => { expect(query['size_id']).to.equal('55'); expect(query['alt_size_ids']).to.equal('57,59'); - }); it('should not send a request and register an error bid if no valid sizes', () => { - var sizesBidderRequest = clone(bidderRequest); - sizesBidderRequest.bids[0].sizes = [[620,250],[300,251]]; + sizesBidderRequest.bids[0].sizes = [[620, 250], [300, 251]]; rubiconAdapter.callBids(sizesBidderRequest); @@ -296,11 +280,9 @@ describe('the rubicon adapter', () => { expect(bidManager.addBidResponse.calledOnce).to.equal(true); expect(bids).to.be.lengthOf(1); expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); - }); it('should not send a request and register an error if no account id is present', () => { - var noAccountBidderRequest = clone(bidderRequest); delete noAccountBidderRequest.bids[0].params.accountId; @@ -310,11 +292,9 @@ describe('the rubicon adapter', () => { expect(bidManager.addBidResponse.calledOnce).to.equal(true); expect(bids).to.be.lengthOf(1); expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); - }); it('should allow a floor override', () => { - var floorBidderRequest = clone(bidderRequest); floorBidderRequest.bids[0].params.floor = 2; @@ -323,13 +303,126 @@ describe('the rubicon adapter', () => { let query = parseQuery(xhr.requests[0].url.split('?')[1]); expect(query['rp_floor']).to.equal('2'); + }); + + it('should send digitrust params', () => { + window.DigiTrust = { + getUser: function() {} + }; + sandbox.stub(window.DigiTrust, 'getUser', () => + ({ + success: true, + identity: { + privacy: {optout: false}, + id: 'testId', + keyv: 'testKeyV' + } + }) + ); + rubiconAdapter.callBids(bidderRequest); + + let request = xhr.requests[0]; + + let query = request.url.split('?')[1]; + query = parseQuery(query); + + let expectedQuery = { + 'dt.id': 'testId', + 'dt.keyv': 'testKeyV' + }; + + // test that all values above are both present and correct + Object.keys(expectedQuery).forEach(key => { + let value = expectedQuery[key]; + expect(query[key]).to.equal(value); + }); + + delete window.DigiTrust; }); + it('should not send digitrust params when DigiTrust not loaded', () => { + rubiconAdapter.callBids(bidderRequest); + + let request = xhr.requests[0]; + + let query = request.url.split('?')[1]; + query = parseQuery(query); + + let undefinedKeys = ['dt.id', 'dt.keyv']; + + // Test that none of the DigiTrust keys are part of the query + undefinedKeys.forEach(key => { + expect(typeof query[key]).to.equal('undefined'); + }); + }); + + it('should send not digitrust params due to optout', () => { + window.DigiTrust = { + getUser: function() {} + }; + sandbox.stub(window.DigiTrust, 'getUser', () => + ({ + success: true, + identity: { + privacy: {optout: true}, + id: 'testId', + keyv: 'testKeyV' + } + }) + ); + + rubiconAdapter.callBids(bidderRequest); + + let request = xhr.requests[0]; + + let query = request.url.split('?')[1]; + query = parseQuery(query); + + let undefinedKeys = ['dt.id', 'dt.keyv']; + + // Test that none of the DigiTrust keys are part of the query + undefinedKeys.forEach(key => { + expect(typeof query[key]).to.equal('undefined'); + }); + + delete window.DigiTrust; + }); + + it('should send not digitrust params due to failure', () => { + window.DigiTrust = { + getUser: function() {} + }; + sandbox.stub(window.DigiTrust, 'getUser', () => + ({ + success: false, + identity: { + privacy: {optout: false}, + id: 'testId', + keyv: 'testKeyV' + } + }) + ); + + rubiconAdapter.callBids(bidderRequest); + + let request = xhr.requests[0]; + + let query = request.url.split('?')[1]; + query = parseQuery(query); + + let undefinedKeys = ['dt.id', 'dt.keyv']; + + // Test that none of the DigiTrust keys are part of the query + undefinedKeys.forEach(key => { + expect(typeof query[key]).to.equal('undefined'); + }); + + delete window.DigiTrust; + }); }); describe('for video requests', () => { - /* beforeEach(() => { createVideoBidderRequest(); @@ -380,7 +473,7 @@ describe('the rubicon adapter', () => { expect(slot.site_id).to.equal('70608'); expect(slot.zone_id).to.equal('335918'); expect(slot.position).to.equal('atf'); - expect(slot.floor).to.equal(.01); + expect(slot.floor).to.equal(0.01); expect(slot.element_id).to.equal(bidderRequest.bids[0].placementCode); expect(slot.name).to.equal(bidderRequest.bids[0].placementCode); expect(slot.language).to.equal('en'); @@ -400,7 +493,6 @@ describe('the rubicon adapter', () => { expect(slot).to.have.property('visitor').that.is.an('object'); expect(slot.visitor).to.have.property('ucat').that.equals('new'); expect(slot.visitor).to.have.property('lastsearch').that.equals('iphone'); - }); it('should allow a floor price override', () => { @@ -423,7 +515,6 @@ describe('the rubicon adapter', () => { let floor = post.slots[0].floor; expect(floor).to.equal(3.25); - }); it('should trap when no video object is passed in', () => { @@ -455,18 +546,13 @@ describe('the rubicon adapter', () => { expect(post.slots[0].width).to.equal(300); expect(post.slots[0].height).to.equal(250); }); - }); - }); - - - describe('response handler', () => { let bids, - server, - addBidResponseAction; + server, + addBidResponseAction; beforeEach(() => { bids = []; @@ -475,7 +561,7 @@ describe('the rubicon adapter', () => { sandbox.stub(bidManager, 'addBidResponse', (elemId, bid) => { bids.push(bid); - if(addBidResponseAction) { + if (addBidResponseAction) { addBidResponseAction(); addBidResponseAction = undefined; } @@ -487,9 +573,7 @@ describe('the rubicon adapter', () => { }); describe('for fastlane', () => { - it('should handle a success response and sort by cpm', () => { - server.respondWith(JSON.stringify({ 'status': 'ok', 'account_id': 14062, @@ -591,10 +675,10 @@ describe('the rubicon adapter', () => { 'tracking': '', 'inventory': {}, 'ads': [{ - 'status': 'ok', - 'cpm': 0, - 'size_id': 15 - }] + 'status': 'ok', + 'cpm': 0, + 'size_id': 15 + }] })); rubiconAdapter.callBids(bidderRequest); @@ -643,8 +727,8 @@ describe('the rubicon adapter', () => { 'tracking': '', 'inventory': {}, 'ads': [{ - 'status': 'not_ok', - }] + 'status': 'not_ok', + }] })); rubiconAdapter.callBids(bidderRequest); @@ -669,7 +753,7 @@ describe('the rubicon adapter', () => { }); it('should handle error contacting endpoint', () => { - server.respondWith([404, {}, ""]); + server.respondWith([404, {}, '']); rubiconAdapter.callBids(bidderRequest); @@ -681,7 +765,6 @@ describe('the rubicon adapter', () => { }); it('should not register an error bid when a success call to addBidResponse throws an error', () => { - server.respondWith(JSON.stringify({ 'status': 'ok', 'account_id': 14062, @@ -694,10 +777,10 @@ describe('the rubicon adapter', () => { 'tracking': '', 'inventory': {}, 'ads': [{ - 'status': 'ok', - 'cpm': .8, - 'size_id': 15 - }] + 'status': 'ok', + 'cpm': 0.8, + 'size_id': 15 + }] })); addBidResponseAction = function() { @@ -711,19 +794,15 @@ describe('the rubicon adapter', () => { // was calling twice for same bid, but should only call once expect(bidManager.addBidResponse.calledOnce).to.equal(true); expect(bids).to.be.lengthOf(1); - }); - }); describe('for video', () => { - beforeEach(() => { createVideoBidderRequest(); }); it('should register a successful bid', () => { - server.respondWith(JSON.stringify({ 'status': 'ok', 'ads': { @@ -768,16 +847,10 @@ describe('the rubicon adapter', () => { 'https://fastlane-adv.rubiconproject.com/v1/creative/a40fe16e-d08d-46a9-869d-2e1573599e0c.xml' ); expect(bids[0].impression_id).to.equal('a40fe16e-d08d-46a9-869d-2e1573599e0c'); - }); - }); - }); - - }); - }); function clone(obj) { diff --git a/webpack.conf.js b/webpack.conf.js index 0196846c16e..92909141f96 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -6,7 +6,7 @@ var webpack = require('webpack'); module.exports = { devtool: 'source-map', resolve: { - modulesDirectories: ['', 'node_modules', 'src'] + modulesDirectories: ['', 'node_modules', 'src', 'modules'] }, resolveLoader: { modulesDirectories: ['loaders', 'node_modules'] From 135730df112e83a16a449ecc8c8d59bf084c2213 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 2 Jun 2017 15:03:41 -0600 Subject: [PATCH 008/111] external modules working, but node_modules in project still needs babel-laoder fix --- gulpHelpers.js | 34 +++++++++++++++++++++++----------- gulpfile.js | 23 +++++++++++++++++------ webpack.conf.js | 19 ++++++++++++++----- 3 files changed, 54 insertions(+), 22 deletions(-) diff --git a/gulpHelpers.js b/gulpHelpers.js index bd09a43cf21..1d025959028 100644 --- a/gulpHelpers.js +++ b/gulpHelpers.js @@ -40,9 +40,11 @@ module.exports = { .replace(/\/>/g, '\\/>'); }, - getModules: _.memoize(function() { + getModules: _.memoize(function(externalModules) { + externalModules = externalModules || []; + var internalModules; try { - return fs.readdirSync(MODULE_PATH) + internalModules = fs.readdirSync(MODULE_PATH) .reduce((memo, file) => { var moduleName = file.split(new RegExp('[.' + path.sep + ']'))[0]; var filePath = path.join(MODULE_PATH, file); @@ -53,8 +55,18 @@ module.exports = { memo[modulePath] = moduleName; return memo; }, {}); - } catch(err) {} - return {}; + } catch(err) { + internalModules = {}; + } + return Object.assign(externalModules.reduce((memo, module) => { + try { + var modulePath = require.resolve(module); + memo[modulePath] = module; + } catch(err) { + // do something + } + return memo; + }, internalModules)); }), getBuiltModules: function(dev, names) { @@ -69,19 +81,19 @@ module.exports = { return path.join(__dirname, dev ? DEV_PATH : BUILD_PATH, 'prebid' + '.js'); }, - getModulePaths: function() { - var modules = this.getModules(); + getModulePaths: function(externalModules) { + var modules = this.getModules(externalModules); return Object.keys(modules); }, - getModuleNames: function() { - return _.values(this.getModules()); + getModuleNames: function(externalModules) { + return _.values(this.getModules(externalModules)); }, - nameModules: function() { - var modules = this.getModules(); + nameModules: function(externalModules) { + var modules = this.getModules(externalModules); return through.obj(function(file, enc, done) { - file.named = modules[file.path] ? modules[file.path] : 'prebid.js'; + file.named = modules[file.path] ? modules[file.path] : 'prebid'; this.push(file); done(); }) diff --git a/gulpfile.js b/gulpfile.js index 97855c88bde..86ea09f0b6f 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -53,9 +53,13 @@ gulp.task('clean', function () { .pipe(clean()); }); +function getArgModules() { + return (argv.modules || '').split(',').filter(module => !!module); +} + gulp.task('bundle', function() { - var modules = (argv.modules || '').split(',').filter(module => !!module), - allModules = helpers.getModuleNames(); + var modules = getArgModules(), + allModules = helpers.getModuleNames(modules); if(modules.length === 0) { modules = allModules; @@ -83,10 +87,14 @@ gulp.task('bundle', function() { gulp.task('devpack', ['clean'], function () { webpackConfig.devtool = 'source-map'; + var externalModules = getArgModules(); + const analyticsSources = helpers.getAnalyticsSources(analyticsDirectory); - const moduleSources = helpers.getModulePaths(); + const moduleSources = helpers.getModulePaths(externalModules); + console.log(moduleSources); + return gulp.src([].concat(moduleSources, analyticsSources, 'src/prebid.js')) - .pipe(helpers.nameModules()) + .pipe(helpers.nameModules(externalModules)) .pipe(webpack(webpackConfig)) .pipe(replace('$prebid.version$', prebid.version)) .pipe(gulp.dest('build/dev')) @@ -102,10 +110,13 @@ gulp.task('webpack', ['clean'], function () { webpackConfig.devtool = null; + var externalModules = getArgModules(); + const analyticsSources = helpers.getAnalyticsSources(analyticsDirectory); - const moduleSources = helpers.getModulePaths(); + const moduleSources = helpers.getModulePaths(externalModules); + return gulp.src([].concat(moduleSources, analyticsSources, 'src/prebid.js')) - .pipe(helpers.nameModules()) + .pipe(helpers.nameModules(externalModules)) .pipe(webpack(webpackConfig)) .pipe(replace('$prebid.version$', prebid.version)) .pipe(uglify()) diff --git a/webpack.conf.js b/webpack.conf.js index 92909141f96..9e817f2cad2 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -6,10 +6,16 @@ var webpack = require('webpack'); module.exports = { devtool: 'source-map', resolve: { - modulesDirectories: ['', 'node_modules', 'src', 'modules'] + root: [ + path.resolve('.') + ], + modulesDirectories: ['', 'node_modules'] }, resolveLoader: { - modulesDirectories: ['loaders', 'node_modules'] + root: [ + path.resolve('./loaders'), + path.resolve('./node_modules') + ] }, output: { jsonpFunction: 'pbjsSeg' @@ -18,8 +24,7 @@ module.exports = { loaders: [ { test: /\.js$/, - include: /(src|modules|test)/, - exclude: path.resolve(__dirname, 'node_modules'), + exclude: path.resolve('./node_modules'), loader: 'babel', // 'babel-loader' is also a legal name to reference query: { presets: ['es2015'] @@ -76,6 +81,10 @@ module.exports = { }, plugins: [ new StringReplacePlugin(), - new webpack.optimize.CommonsChunkPlugin('prebid.js') + new webpack.optimize.CommonsChunkPlugin({ + name: 'prebid', + filename: 'prebid.js', + minChunks: 2 + }) ] }; From 627bc28859b461ced4075b4add987aa175fda066 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 5 Jun 2017 16:30:12 -0600 Subject: [PATCH 009/111] gulp watch bundle building --- gulpfile.js | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 86ea09f0b6f..de1aa1a371e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -36,15 +36,15 @@ var analyticsDirectory = '../analytics'; var port = 9999; // Tasks -gulp.task('default', ['clean', 'lint', 'webpack']); +gulp.task('default', ['clean', 'lint', 'bundle']); -gulp.task('serve', ['clean', 'lint', 'devpack', 'webpack', 'watch', 'test']); +gulp.task('serve', ['clean', 'lint', 'bundle-dev', 'watch', 'test']); gulp.task('serve-nw', ['clean', 'lint', 'devpack', 'webpack', 'watch', 'e2etest']); gulp.task('run-tests', ['clean', 'lint', 'webpack', 'test', 'mocha']); -gulp.task('build', ['webpack']); +gulp.task('build', ['bundle']); gulp.task('clean', function () { return gulp.src(['build'], { @@ -57,7 +57,7 @@ function getArgModules() { return (argv.modules || '').split(',').filter(module => !!module); } -gulp.task('bundle', function() { +function bundle(dev) { var modules = getArgModules(), allModules = helpers.getModuleNames(modules); @@ -74,16 +74,19 @@ gulp.task('bundle', function() { } return gulp.src( - [helpers.getBuiltPrebid(argv.dev)].concat( - helpers.getBuiltModules(argv.dev, modules) + [helpers.getBuiltPrebid(dev)].concat( + helpers.getBuiltModules(dev, modules) ) - ).pipe(concat(argv.bundleName ? argv.bundleName : 'bundle.js', {newLine: ''})) - .pipe(gulpif(!argv.manualEnable, footer('<%= global %>.processQueue();', { + ).pipe(concat(argv.bundleName ? argv.bundleName : 'bundle.js')) + .pipe(gulpif(!argv.manualEnable, footer('\n<%= global %>.processQueue();', { global: prebid.globalVarName } ))) - .pipe(gulp.dest('build/' + (argv.dev ? 'dev' : 'dist'))); -}); + .pipe(gulp.dest('build/' + (dev ? 'dev' : 'dist'))); +} + +gulp.task('bundle-dev', ['devpack'], bundle.bind(null, true)); +gulp.task('bundle', ['webpack'], bundle.bind(null, false)); gulp.task('devpack', ['clean'], function () { webpackConfig.devtool = 'source-map'; @@ -91,7 +94,6 @@ gulp.task('devpack', ['clean'], function () { const analyticsSources = helpers.getAnalyticsSources(analyticsDirectory); const moduleSources = helpers.getModulePaths(externalModules); - console.log(moduleSources); return gulp.src([].concat(moduleSources, analyticsSources, 'src/prebid.js')) .pipe(helpers.nameModules(externalModules)) @@ -229,9 +231,10 @@ gulp.task('watch', function () { gulp.watch([ 'src/**/*.js', + 'modules/**/*.js', 'test/spec/**/*.js', '!test/spec/loaders/**/*.js' - ], ['clean', 'lint', 'webpack', 'devpack', 'test']); + ], ['lint', 'bundle-dev', 'test']); gulp.watch([ 'loaders/**/*.js', 'test/spec/loaders/**/*.js' From 851c50eec3b9a45b63d34d85f0e90cae3682146f Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 6 Jun 2017 15:20:45 -0600 Subject: [PATCH 010/111] fix for babel-loader node_modules exclusion and bundle only --- gulpHelpers.js | 4 +++- gulpfile.js | 23 ++++++++++------------- webpack.conf.js | 13 +++++++++++-- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/gulpHelpers.js b/gulpHelpers.js index 1d025959028..29b1be9b546 100644 --- a/gulpHelpers.js +++ b/gulpHelpers.js @@ -39,7 +39,9 @@ module.exports = { .replace(/<\//g, '<\\/') .replace(/\/>/g, '\\/>'); }, - + getArgModules() { + return (argv.modules || '').split(',').filter(module => !!module); + }, getModules: _.memoize(function(externalModules) { externalModules = externalModules || []; var internalModules; diff --git a/gulpfile.js b/gulpfile.js index de1aa1a371e..f070ed99b8b 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -36,15 +36,15 @@ var analyticsDirectory = '../analytics'; var port = 9999; // Tasks -gulp.task('default', ['clean', 'lint', 'bundle']); +gulp.task('default', ['clean', 'lint', 'build-bundle-prod']); -gulp.task('serve', ['clean', 'lint', 'bundle-dev', 'watch', 'test']); +gulp.task('serve', ['clean', 'lint', 'build-bundle-dev', 'watch', 'test']); gulp.task('serve-nw', ['clean', 'lint', 'devpack', 'webpack', 'watch', 'e2etest']); gulp.task('run-tests', ['clean', 'lint', 'webpack', 'test', 'mocha']); -gulp.task('build', ['bundle']); +gulp.task('build', ['build-bundle-prod']); gulp.task('clean', function () { return gulp.src(['build'], { @@ -53,12 +53,8 @@ gulp.task('clean', function () { .pipe(clean()); }); -function getArgModules() { - return (argv.modules || '').split(',').filter(module => !!module); -} - function bundle(dev) { - var modules = getArgModules(), + var modules = helpers.getArgModules(), allModules = helpers.getModuleNames(modules); if(modules.length === 0) { @@ -85,12 +81,13 @@ function bundle(dev) { .pipe(gulp.dest('build/' + (dev ? 'dev' : 'dist'))); } -gulp.task('bundle-dev', ['devpack'], bundle.bind(null, true)); -gulp.task('bundle', ['webpack'], bundle.bind(null, false)); +gulp.task('build-bundle-dev', ['devpack'], bundle.bind(null, true)); +gulp.task('build-bundle-prod', ['webpack'], bundle.bind(null, false)); +gulp.task('bundle', bundle.bind(null, false)); // used for just concatenating pre-built files with no build step gulp.task('devpack', ['clean'], function () { webpackConfig.devtool = 'source-map'; - var externalModules = getArgModules(); + var externalModules = helpers.getArgModules(); const analyticsSources = helpers.getAnalyticsSources(analyticsDirectory); const moduleSources = helpers.getModulePaths(externalModules); @@ -112,7 +109,7 @@ gulp.task('webpack', ['clean'], function () { webpackConfig.devtool = null; - var externalModules = getArgModules(); + var externalModules = helpers.getArgModules(); const analyticsSources = helpers.getAnalyticsSources(analyticsDirectory); const moduleSources = helpers.getModulePaths(externalModules); @@ -234,7 +231,7 @@ gulp.task('watch', function () { 'modules/**/*.js', 'test/spec/**/*.js', '!test/spec/loaders/**/*.js' - ], ['lint', 'bundle-dev', 'test']); + ], ['lint', 'build-bundle-dev', 'test']); gulp.watch([ 'loaders/**/*.js', 'test/spec/loaders/**/*.js' diff --git a/webpack.conf.js b/webpack.conf.js index 9e817f2cad2..924ba957394 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -2,6 +2,7 @@ var prebid = require('./package.json'); var StringReplacePlugin = require('string-replace-webpack-plugin'); var path = require('path'); var webpack = require('webpack'); +var helpers = require('./gulpHelpers'); module.exports = { devtool: 'source-map', @@ -24,8 +25,16 @@ module.exports = { loaders: [ { test: /\.js$/, - exclude: path.resolve('./node_modules'), - loader: 'babel', // 'babel-loader' is also a legal name to reference + exclude: path.resolve('./node_modules'), // required to prevent loader from choking non-Prebid.js node_modules + loader: 'babel', + query: { + presets: ['es2015'] + } + }, + { // This makes sure babel-loader is ran on our intended Prebid.js modules that happen to be in node_modules + test: /\.js$/, + include: helpers.getArgModules().map(module => new RegExp('node_modules/' + module + '/')), + loader: 'babel', query: { presets: ['es2015'] } From eeb20c47f519bcc77470b60efdcb6b6bd3066fe7 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 6 Jun 2017 15:50:36 -0600 Subject: [PATCH 011/111] updated express module to work in new webpack module format --- modules/express.js | 379 ++++++++++++++++++++++----------------------- 1 file changed, 187 insertions(+), 192 deletions(-) diff --git a/modules/express.js b/modules/express.js index 869a49992a4..e691b6164a3 100644 --- a/modules/express.js +++ b/modules/express.js @@ -1,205 +1,200 @@ -$$PREBID_GLOBAL$$.module('express', function ({ - pbjs, - utils, - config -}) { - - if (!config.enabled) { - utils.logWarn('config.enabled not set, not loading ' + this.name); - return; - } - utils.logMessage('loading ' + this.name); - var adUnits = config.adUnits || pbjs.adUnits || []; +import * as utils from 'src/utils'; - if(adUnits.length === 0) { - utils.logWarn('no valid adUnits found, not loading ' + this.name); - } +const MODULE_NAME = 'express'; - // put adUnits in a more performant hash lookup by code. - var adUnitsCache = adUnits.reduce(function(cache, adUnit) { - if(adUnit.code && adUnit.bids) { - cache[adUnit.code] = adUnit; - } else { - utils.logError('misconfigured adUnit', null, adUnit); - } - return cache; - }, {}); - - window.googletag = window.googletag || {}; - window.googletag.cmd = window.googletag.cmd || []; - window.googletag.cmd.push(function () { - // verify all necessary gpt functions exist - var gpt = window.googletag; - var pads = gpt.pubads; - if (!gpt.display || !gpt.enableServices || typeof pads !== 'function' || - !pads().refresh || !pads().disableInitialLoad || !pads().getSlots || !pads().enableSingleRequest) { - utils.logError('could not bind to gpt googletag api'); - return; - } - utils.logMessage('running'); - - - // function to convert google tag slot sizes to [[w,h],...] - function mapGptSlotSizes(aGPTSlotSizes) { - var aSlotSizes = []; - for (var i = 0; i < aGPTSlotSizes.length; i++) { - try { - aSlotSizes.push([aGPTSlotSizes[i].getWidth(), aGPTSlotSizes[i].getHeight()]); - } catch (e) { - utils.logWarn('slot size ' + aGPTSlotSizes[i].toString() + ' not supported by' + this.name); - } - } - return aSlotSizes; - } - // a helper function to verify slots or get slots if not present - function defaultSlots(slots) { - return Array.isArray(slots) ? - slots.slice() : - googletag.pubads().getSlots().slice(); - } +$$PREBID_GLOBAL$$.express = function(adUnits = $$PREBID_GLOBAL$$.adUnits) { - // maps gpt slots to adUnits, matches are copied to new array and removed from passed array. - function pickAdUnits(gptSlots) { - var adUnits = []; - // traverse backwards (since gptSlots is mutated) to find adUnits in cache and remove non-mapped slots - for(var i = gptSlots.length - 1; i > -1; i--) { - var gptSlot = gptSlots[i], - elemId = gptSlot.getSlotElementId(), - adUnit = adUnitsCache[elemId]; - - if(adUnit) { - adUnit._gptSlot = gptSlot; - adUnit.sizes = adUnit.sizes || mapGptSlotSizes(gptSlot.getSizes()); - adUnits.push(adUnit); - gptSlots.splice(i, 1); - } - } + utils.logMessage('loading ' + MODULE_NAME); - return adUnits; - } + if (adUnits.length === 0) { + utils.logWarn('no valid adUnits found, not loading ' + MODULE_NAME); + } - // store original gpt functions that will be overridden - var fGptDisplay = gpt.display; - var fGptEnableServices = gpt.enableServices; - var fGptRefresh = pads().refresh; - var fGptDisableInitialLoad = pads().disableInitialLoad; - var fGptEnableSingleRequest = pads().enableSingleRequest; - - // override googletag.enableServices() - // - make sure fGptDisableInitialLoad() has been called so we can - // better control when slots are displayed, then call original - // fGptEnableServices() - gpt.enableServices = function () { - if (!bInitialLoadDisabled) { - fGptDisableInitialLoad.apply(pads()); - } - return fGptEnableServices.apply(gpt, arguments); - }; - - // override googletag.display() - // - call the real fGptDisplay(). this won't initiate auctions because we've disabled initial load - // - define all corresponding rubicon slots - // - if disableInitialLoad() has been called by the pub, done - // - else run an auction and call the real fGptRefresh() to - // initiate the DFP request - gpt.display = function (sElementId) { - utils.logInfo('display:', sElementId); - // call original gpt display() function - fGptDisplay.apply(gpt, arguments); - - // if not SRA mode, get only the gpt slot corresponding to sEementId - var aGptSlots; - if (!bEnabledSRA) { - aGptSlots = googletag.pubads().getSlots().filter(function (oGptSlot) { - return oGptSlot.getSlotElementId() === sElementId; - }); - } +// put adUnits in a more performant hash lookup by code. + var adUnitsCache = adUnits.reduce(function (cache, adUnit) { + if (adUnit.code && adUnit.bids) { + cache[adUnit.code] = adUnit; + } else { + utils.logError('misconfigured adUnit', null, adUnit); + } + return cache; + }, {}); + + window.googletag = window.googletag || {}; + window.googletag.cmd = window.googletag.cmd || []; + window.googletag.cmd.push(function () { + // verify all necessary gpt functions exist + var gpt = window.googletag; + var pads = gpt.pubads; + if (!gpt.display || !gpt.enableServices || typeof pads !== 'function' || !pads().refresh || !pads().disableInitialLoad || !pads().getSlots || !pads().enableSingleRequest) { + utils.logError('could not bind to gpt googletag api'); + return; + } + utils.logMessage('running'); - aGptSlots = defaultSlots(aGptSlots).filter(function(gptSlot) { - return !gptSlot._displayed; - }); - - aGptSlots.forEach(function(gptSlot) { - gptSlot._displayed = true; - }); - - var adUnits = pickAdUnits(/* mutated: */ aGptSlots); - - if(!bInitialLoadDisabled) { - if(aGptSlots.length) { - fGptRefresh.apply(pads(), [aGptSlots]); - } - - if(adUnits.length ) { - pbjs.requestBids({ - adUnits: adUnits, - bidsBackHandler: function () { - pbjs.setTargetingForGPTAsync(); - fGptRefresh.apply(pads(), [ - adUnits.map(function(adUnit) { - return adUnit._gptSlot; - }) - ]); - } - }); - } - } - }; + // function to convert google tag slot sizes to [[w,h],...] + function mapGptSlotSizes(aGPTSlotSizes) { + var aSlotSizes = []; + for (var i = 0; i < aGPTSlotSizes.length; i++) { + try { + aSlotSizes.push([aGPTSlotSizes[i].getWidth(), aGPTSlotSizes[i].getHeight()]); + } catch (e) { + utils.logWarn('slot size ' + aGPTSlotSizes[i].toString() + ' not supported by' + MODULE_NAME); + } + } + return aSlotSizes; + } - // override gpt refresh() function - // - run auctions for provided gpt slots, then initiate ad-server call - pads().refresh = function (aGptSlots, options) { - utils.logInfo('refresh:', aGptSlots); - // get already displayed adUnits from aGptSlots if provided, else all defined gptSlots - aGptSlots = defaultSlots(aGptSlots); - var adUnits = pickAdUnits(/* mutated: */ aGptSlots).filter(function (adUnit) { - return adUnit._gptSlot._displayed; - }); + // a helper function to verify slots or get slots if not present + function defaultSlots(slots) { + return Array.isArray(slots) ? + slots.slice() : + googletag.pubads().getSlots().slice(); + } - if(aGptSlots.length) { - fGptRefresh.apply(pads(), [aGptSlots, options]); - } + // maps gpt slots to adUnits, matches are copied to new array and removed from passed array. + function pickAdUnits(gptSlots) { + var adUnits = []; + // traverse backwards (since gptSlots is mutated) to find adUnits in cache and remove non-mapped slots + for (var i = gptSlots.length - 1; i > -1; i--) { + var gptSlot = gptSlots[i], + elemId = gptSlot.getSlotElementId(), + adUnit = adUnitsCache[elemId]; + + if (adUnit) { + adUnit._gptSlot = gptSlot; + adUnit.sizes = adUnit.sizes || mapGptSlotSizes(gptSlot.getSizes()); + adUnits.push(adUnit); + gptSlots.splice(i, 1); + } + } + + return adUnits; + } - if(adUnits.length) { - pbjs.requestBids({ - adUnits: adUnits, - bidsBackHandler: function () { - pbjs.setTargetingForGPTAsync(); - fGptRefresh.apply(pads(), [ - adUnits.map(function(adUnit) { - return adUnit._gptSlot - }), - options - ]); - } - }); + // store original gpt functions that will be overridden + var fGptDisplay = gpt.display; + var fGptEnableServices = gpt.enableServices; + var fGptRefresh = pads().refresh; + var fGptDisableInitialLoad = pads().disableInitialLoad; + var fGptEnableSingleRequest = pads().enableSingleRequest; + + // override googletag.enableServices() + // - make sure fGptDisableInitialLoad() has been called so we can + // better control when slots are displayed, then call original + // fGptEnableServices() + gpt.enableServices = function () { + if (!bInitialLoadDisabled) { + fGptDisableInitialLoad.apply(pads()); + } + return fGptEnableServices.apply(gpt, arguments); + }; + + // override googletag.display() + // - call the real fGptDisplay(). this won't initiate auctions because we've disabled initial load + // - define all corresponding rubicon slots + // - if disableInitialLoad() has been called by the pub, done + // - else run an auction and call the real fGptRefresh() to + // initiate the DFP request + gpt.display = function (sElementId) { + utils.logInfo('display:', sElementId); + // call original gpt display() function + fGptDisplay.apply(gpt, arguments); + + // if not SRA mode, get only the gpt slot corresponding to sEementId + var aGptSlots; + if (!bEnabledSRA) { + aGptSlots = googletag.pubads().getSlots().filter(function (oGptSlot) { + return oGptSlot.getSlotElementId() === sElementId; + }); + } + + aGptSlots = defaultSlots(aGptSlots).filter(function (gptSlot) { + return !gptSlot._displayed; + }); + + aGptSlots.forEach(function (gptSlot) { + gptSlot._displayed = true; + }); + + var adUnits = pickAdUnits(/* mutated: */ aGptSlots); + + if (!bInitialLoadDisabled) { + if (aGptSlots.length) { + fGptRefresh.apply(pads(), [aGptSlots]); + } + + if (adUnits.length) { + $$PREBID_GLOBAL$$.requestBids({ + adUnits: adUnits, + bidsBackHandler: function () { + $$PREBID_GLOBAL$$.setTargetingForGPTAsync(); + fGptRefresh.apply(pads(), [ + adUnits.map(function (adUnit) { + return adUnit._gptSlot; + }) + ]); } - }; - - // override gpt disableInitialLoad function - // Register that initial load was called, meaning calls to display() - // should not initiate an ad-server request. Instead a call to - // refresh() will be needed to iniate the request. - // We will assume the pub is using this the correct way, calling it - // before enableServices() - var bInitialLoadDisabled = false; - pads().disableInitialLoad = function () { - bInitialLoadDisabled = true; - return fGptDisableInitialLoad.apply(window.googletag.pubads(), arguments); - }; - - // override gpt useSingleRequest function - // Register that SRA has been turned on - // We will assume the pub is using this the correct way, calling it - // before enableServices() - var bEnabledSRA = false; - pads().enableSingleRequest = function () { - bEnabledSRA = true; - return fGptEnableSingleRequest.apply(window.googletag.pubads(), arguments); - }; - }); - -}); \ No newline at end of file + }); + } + } + + }; + + // override gpt refresh() function + // - run auctions for provided gpt slots, then initiate ad-server call + pads().refresh = function (aGptSlots, options) { + utils.logInfo('refresh:', aGptSlots); + // get already displayed adUnits from aGptSlots if provided, else all defined gptSlots + aGptSlots = defaultSlots(aGptSlots); + var adUnits = pickAdUnits(/* mutated: */ aGptSlots).filter(function (adUnit) { + return adUnit._gptSlot._displayed; + }); + + if (aGptSlots.length) { + fGptRefresh.apply(pads(), [aGptSlots, options]); + } + + if (adUnits.length) { + $$PREBID_GLOBAL$$.requestBids({ + adUnits: adUnits, + bidsBackHandler: function () { + $$PREBID_GLOBAL$$.setTargetingForGPTAsync(); + fGptRefresh.apply(pads(), [ + adUnits.map(function (adUnit) { + return adUnit._gptSlot + }), + options + ]); + } + }); + } + }; + + // override gpt disableInitialLoad function + // Register that initial load was called, meaning calls to display() + // should not initiate an ad-server request. Instead a call to + // refresh() will be needed to iniate the request. + // We will assume the pub is using this the correct way, calling it + // before enableServices() + var bInitialLoadDisabled = false; + pads().disableInitialLoad = function () { + bInitialLoadDisabled = true; + return fGptDisableInitialLoad.apply(window.googletag.pubads(), arguments); + }; + + // override gpt useSingleRequest function + // Register that SRA has been turned on + // We will assume the pub is using this the correct way, calling it + // before enableServices() + var bEnabledSRA = false; + pads().enableSingleRequest = function () { + bEnabledSRA = true; + return fGptEnableSingleRequest.apply(window.googletag.pubads(), arguments); + }; + }); + +}; From 38608102684487fe9360fb7087005d421e903d5f Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 6 Jun 2017 16:01:16 -0600 Subject: [PATCH 012/111] gulp default, don't bundle --- gulpfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index f070ed99b8b..2059d0540ad 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -36,7 +36,7 @@ var analyticsDirectory = '../analytics'; var port = 9999; // Tasks -gulp.task('default', ['clean', 'lint', 'build-bundle-prod']); +gulp.task('default', ['clean', 'webpack']); gulp.task('serve', ['clean', 'lint', 'build-bundle-dev', 'watch', 'test']); From 24cd9444c73d3335ece457704e42312393c3f31b Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 6 Jun 2017 16:08:48 -0600 Subject: [PATCH 013/111] updated rubicon adapter to latest --- modules/rubiconAdapter.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/rubiconAdapter.js b/modules/rubiconAdapter.js index accd7cfa478..41b4ea66dd9 100644 --- a/modules/rubiconAdapter.js +++ b/modules/rubiconAdapter.js @@ -1,4 +1,4 @@ -import * as Adapter from 'src/adapter'; +import * as Adapter from 'src/adapter.js'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; import adaptermanager from 'src/adaptermanager'; @@ -34,6 +34,7 @@ var sizeMap = { 8: '120x600', 9: '160x600', 10: '300x600', + 14: '250x250', 15: '300x250', 16: '336x280', 19: '300x100', From 83af09e476c48fb37d53bc911ec62096006ffbbe Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 6 Jun 2017 18:09:39 -0600 Subject: [PATCH 014/111] added appnexus and appnexusAst to modules. added support for native and video registering --- adapters.json | 49 - loaders/nativeLoader.js | 45 - .../appnexusAstBidAdapter.js | 5 + .../appnexusBidAdapter.js | 24 +- ...rubiconAdapter.js => rubiconBidAdapter.js} | 4 +- src/adaptermanager.js | 15 +- src/adapters/rubicon.js | 418 --------- src/native.js | 6 +- test/spec/loaders/adapterLoader_spec.js | 38 - test/spec/loaders/getAdapters_spec.js | 81 -- .../{adapters => modules}/appnexusAst_spec.js | 2 +- .../{adapters => modules}/appnexus_spec.js | 2 +- test/spec/modules/rubiconAdapter_spec.js | 858 ------------------ .../{adapters => modules}/rubicon_spec.js | 3 +- test/spec/unit/pbjs_api_spec.js | 3 + webpack.conf.js | 5 - 16 files changed, 45 insertions(+), 1513 deletions(-) delete mode 100644 loaders/nativeLoader.js rename src/adapters/appnexusAst.js => modules/appnexusAstBidAdapter.js (98%) rename src/adapters/appnexus.js => modules/appnexusBidAdapter.js (89%) rename modules/{rubiconAdapter.js => rubiconBidAdapter.js} (99%) delete mode 100644 test/spec/loaders/adapterLoader_spec.js delete mode 100644 test/spec/loaders/getAdapters_spec.js rename test/spec/{adapters => modules}/appnexusAst_spec.js (99%) rename test/spec/{adapters => modules}/appnexus_spec.js (94%) delete mode 100644 test/spec/modules/rubiconAdapter_spec.js rename test/spec/{adapters => modules}/rubicon_spec.js (99%) diff --git a/adapters.json b/adapters.json index 71dc5fbb0a2..262cf1c4d5b 100644 --- a/adapters.json +++ b/adapters.json @@ -11,8 +11,6 @@ "bidfluence", "vertamedia", "aol", - "appnexus", - "appnexusAst", "beachfront", "audienceNetwork", "carambola", @@ -37,7 +35,6 @@ "pulsepointLite", "quantcast", "rhythmone", - "rubicon", "smartyads", "huddledmasses", "smartadserver", @@ -72,31 +69,6 @@ "prebidServer", "adsupply", "cox", - { - "appnexus": { - "alias": "brealtime" - } - }, - { - "appnexus": { - "alias": "pagescience" - } - }, - { - "appnexus": { - "alias": "defymedia" - } - }, - { - "appnexus": { - "alias": "gourmetads" - } - }, - { - "appnexusAst": { - "supportedMediaTypes": ["video", "native"] - } - }, { "vertamedia": { "supportedMediaTypes": ["video"] @@ -107,27 +79,6 @@ "supportedMediaTypes": ["video"] } }, - { - "appnexus": { - "alias": "matomy" - } - }, - { - "rubicon": { - "alias": "rubiconLite", - "supportedMediaTypes": ["video"] - } - }, - { - "appnexus": { - "alias": "featureforward" - } - }, - { - "appnexus": { - "alias": "oftmedia" - } - }, { "adkernel": { "alias": "headbidding" diff --git a/loaders/nativeLoader.js b/loaders/nativeLoader.js deleted file mode 100644 index c8384135264..00000000000 --- a/loaders/nativeLoader.js +++ /dev/null @@ -1,45 +0,0 @@ -const blockLoader = require('block-loader'); -const getAdapters = require('./getAdapters'); - -const adapters = getAdapters('adapters.json', 'adapters'); -const nativeAdapters = adapters.filter(getNativeAdapters).map(getNames); - -const options = { - start: '/** INSERT NATIVE ADAPTERS - DO NOT EDIT OR REMOVE */', - end: '/** END INSERT NATIVE ADAPTERS */', - process: insertAdapters -}; - -/** - * Returns a block of javascript statements to load adapter modules, register the adapters and - * set adapter aliases - * @returns {*} - */ -function insertAdapters() { - return `const nativeAdapters = ${JSON.stringify(nativeAdapters)};`; -} - -/** - * Filter to derive the adapter name from array elements as strings or objects - * @param adapter - * @returns {*} - */ -function getNames(adapter) { - // if `length` then `adapter` is a string, otherwise an object - return adapter.length ? adapter : getNameStr(adapter); -} - -/** - * Returns adapter objects that support native - */ -function getNativeAdapters(adapter) { - const name = getNameStr(adapter); - return adapter && name && adapter[name].supportedMediaTypes && - adapter[name].supportedMediaTypes.includes('native'); -} - -function getNameStr(adapter) { - return Object.keys(adapter)[0]; -} - -module.exports = blockLoader(options); diff --git a/src/adapters/appnexusAst.js b/modules/appnexusAstBidAdapter.js similarity index 98% rename from src/adapters/appnexusAst.js rename to modules/appnexusAstBidAdapter.js index 193d12fa049..91d9d68b286 100644 --- a/src/adapters/appnexusAst.js +++ b/modules/appnexusAstBidAdapter.js @@ -5,6 +5,7 @@ import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; import { ajax } from 'src/ajax'; import { STATUS } from 'src/constants'; +import adaptermanager from 'src/adaptermanager'; const ENDPOINT = '//ib.adnxs.com/ut/v3/prebid'; const SUPPORTED_AD_TYPES = ['banner', 'video', 'video-outstream', 'native']; @@ -376,4 +377,8 @@ AppnexusAstAdapter.createNew = function() { return new AppnexusAstAdapter(); }; +adaptermanager.registerBidAdapter(new AppnexusAstAdapter, 'appnexusAst', { + supportedMediaTypes: ['video', 'native'] +}); + module.exports = AppnexusAstAdapter; diff --git a/src/adapters/appnexus.js b/modules/appnexusBidAdapter.js similarity index 89% rename from src/adapters/appnexus.js rename to modules/appnexusBidAdapter.js index fee88da7bf3..46b08314d7b 100644 --- a/src/adapters/appnexus.js +++ b/modules/appnexusBidAdapter.js @@ -1,11 +1,12 @@ -import { getBidRequest } from '../utils.js'; +import { getBidRequest } from 'src/utils'; +import adaptermanager from 'src/adaptermanager'; -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var adloader = require('../adloader.js'); -var bidmanager = require('../bidmanager.js'); -var bidfactory = require('../bidfactory.js'); -var Adapter = require('./adapter.js'); +var CONSTANTS = require('src/constants'); +var utils = require('src/utils'); +var adloader = require('src/adloader'); +var bidmanager = require('src/bidmanager'); +var bidfactory = require('src/bidfactory'); +var Adapter = require('src/adapter'); var AppNexusAdapter; AppNexusAdapter = function AppNexusAdapter() { @@ -225,4 +226,13 @@ AppNexusAdapter.createNew = function () { return new AppNexusAdapter(); }; +adaptermanager.registerBidAdapter(new AppNexusAdapter, 'appnexus'); +adaptermanager.aliasBidAdapter('appnexus', 'brealtime'); +adaptermanager.aliasBidAdapter('appnexus', 'pagescience'); +adaptermanager.aliasBidAdapter('appnexus', 'defymedia'); +adaptermanager.aliasBidAdapter('appnexus', 'gourmetads'); +adaptermanager.aliasBidAdapter('appnexus', 'matomy'); +adaptermanager.aliasBidAdapter('appnexus', 'featureforward'); +adaptermanager.aliasBidAdapter('appnexus', 'oftmedia'); + module.exports = AppNexusAdapter; diff --git a/modules/rubiconAdapter.js b/modules/rubiconBidAdapter.js similarity index 99% rename from modules/rubiconAdapter.js rename to modules/rubiconBidAdapter.js index 41b4ea66dd9..a1a264231c3 100644 --- a/modules/rubiconAdapter.js +++ b/modules/rubiconBidAdapter.js @@ -419,7 +419,9 @@ RubiconAdapter.createNew = function() { return new RubiconAdapter(); }; -adaptermanager.registerBidAdapter(new RubiconAdapter, RUBICON_BIDDER_CODE); +adaptermanager.registerBidAdapter(new RubiconAdapter, RUBICON_BIDDER_CODE, { + supportedMediaTypes: ['video'] +}); adaptermanager.aliasBidAdapter(RUBICON_BIDDER_CODE, 'rubiconLite'); module.exports = RubiconAdapter; diff --git a/src/adaptermanager.js b/src/adaptermanager.js index 106f0f80e48..cb5d86e8aad 100644 --- a/src/adaptermanager.js +++ b/src/adaptermanager.js @@ -2,7 +2,7 @@ import { flatten, getBidderCodes, shuffle } from './utils'; import { mapSizes } from './sizeMapping'; -import native from './native'; +import { processNativeAdUnitParams, nativeAdapters } from './native'; var utils = require('./utils.js'); var CONSTANTS = require('./constants.json'); @@ -32,7 +32,7 @@ function getBids({bidderCode, requestId, bidderRequestId, adUnits}) { if (adUnit.nativeParams) { bid = Object.assign({}, bid, { - nativeParams: native(adUnit.nativeParams), + nativeParams: processNativeAdUnitParams(adUnit.nativeParams), }); } @@ -154,10 +154,19 @@ function transformHeightWidth(adUnit) { return sizesObj; } -exports.registerBidAdapter = function (bidAdaptor, bidderCode) { +// exports.videoAdapters = []; // added by adapterLoader for now + +exports.registerBidAdapter = function (bidAdaptor, bidderCode, {supportedMediaTypes = []} = {}) { if (bidAdaptor && bidderCode) { if (typeof bidAdaptor.callBids === CONSTANTS.objectType_function) { _bidderRegistry[bidderCode] = bidAdaptor; + + if (supportedMediaTypes.includes('video')) { + exports.videoAdapters.push(bidderCode); + } + if (supportedMediaTypes.includes('native')) { + nativeAdapters.push(bidderCode); + } } else { utils.logError('Bidder adaptor error for bidder code: ' + bidderCode + 'bidder must implement a callBids() function'); } diff --git a/src/adapters/rubicon.js b/src/adapters/rubicon.js index 241e30c6fdf..e69de29bb2d 100644 --- a/src/adapters/rubicon.js +++ b/src/adapters/rubicon.js @@ -1,418 +0,0 @@ -import * as Adapter from './adapter.js'; -import bidfactory from 'src/bidfactory'; -import bidmanager from 'src/bidmanager'; -import * as utils from 'src/utils'; -import { ajax } from 'src/ajax'; -import { STATUS } from 'src/constants'; - -const RUBICON_BIDDER_CODE = 'rubicon'; - -// use deferred function call since version isn't defined yet at this point -function getIntegration() { - return 'pbjs_lite_' + $$PREBID_GLOBAL$$.version; -} - -function isSecure() { - return location.protocol === 'https:'; -} - -// use protocol relative urls for http or https -const FASTLANE_ENDPOINT = '//fastlane.rubiconproject.com/a/api/fastlane.json'; -const VIDEO_ENDPOINT = '//fastlane-adv.rubiconproject.com/v1/auction/video'; - -const TIMEOUT_BUFFER = 500; - -var sizeMap = { - 1: '468x60', - 2: '728x90', - 8: '120x600', - 9: '160x600', - 10: '300x600', - 14: '250x250', - 15: '300x250', - 16: '336x280', - 19: '300x100', - 31: '980x120', - 32: '250x360', - 33: '180x500', - 35: '980x150', - 37: '468x400', - 38: '930x180', - 43: '320x50', - 44: '300x50', - 48: '300x300', - 54: '300x1050', - 55: '970x90', - 57: '970x250', - 58: '1000x90', - 59: '320x80', - 60: '320x150', - 61: '1000x1000', - 65: '640x480', - 67: '320x480', - 68: '1800x1000', - 72: '320x320', - 73: '320x160', - 78: '980x240', - 79: '980x300', - 80: '980x400', - 83: '480x300', - 94: '970x310', - 96: '970x210', - 101: '480x320', - 102: '768x1024', - 103: '480x280', - 113: '1000x300', - 117: '320x100', - 125: '800x250', - 126: '200x600' -}; -utils._each(sizeMap, (item, key) => sizeMap[item] = key); - -function RubiconAdapter() { - function _callBids(bidderRequest) { - var bids = bidderRequest.bids || []; - - bids.forEach(bid => { - try { - // Video endpoint only accepts POST calls - if (bid.mediaType === 'video') { - ajax( - VIDEO_ENDPOINT, - { - success: bidCallback, - error: bidError - }, - buildVideoRequestPayload(bid, bidderRequest), - { - withCredentials: true - } - ); - } else { - ajax( - buildOptimizedCall(bid), - { - success: bidCallback, - error: bidError - }, - undefined, - { - withCredentials: true - } - ); - } - } catch (err) { - utils.logError('Error sending rubicon request for placement code ' + bid.placementCode, null, err); - addErrorBid(); - } - - function bidCallback(responseText) { - try { - utils.logMessage('XHR callback function called for ad ID: ' + bid.bidId); - handleRpCB(responseText, bid); - } catch (err) { - if (typeof err === 'string') { - utils.logWarn(`${err} when processing rubicon response for placement code ${bid.placementCode}`); - } else { - utils.logError('Error processing rubicon response for placement code ' + bid.placementCode, null, err); - } - addErrorBid(); - } - } - - function bidError(err, xhr) { - utils.logError('Request for rubicon responded with:', xhr.status, err); - addErrorBid(); - } - - function addErrorBid() { - let badBid = bidfactory.createBid(STATUS.NO_BID, bid); - badBid.bidderCode = bid.bidder; - bidmanager.addBidResponse(bid.placementCode, badBid); - } - }); - } - - function _getScreenResolution() { - return [window.screen.width, window.screen.height].join('x'); - } - - function _getDigiTrustQueryParams() { - function getDigiTrustId() { - let digiTrustUser = window.DigiTrust && window.DigiTrust.getUser({member: 'T9QSFKPDN9'}); - return digiTrustUser && digiTrustUser.success && digiTrustUser.identity || null; - } - let digiTrustId = getDigiTrustId(); - // Verify there is an ID and this user has not opted out - if (!digiTrustId || digiTrustId.privacy && digiTrustId.privacy.optout) { - return []; - } - return [ - 'dt.id', digiTrustId.id, - 'dt.keyv', digiTrustId.keyv - ]; - } - - function buildVideoRequestPayload(bid, bidderRequest) { - bid.startTime = new Date().getTime(); - - let params = bid.params; - - if (!params || typeof params.video !== 'object') { - throw 'Invalid Video Bid'; - } - - let size; - if (params.video.playerWidth && params.video.playerHeight) { - size = [ - params.video.playerWidth, - params.video.playerHeight - ]; - } else if ( - Array.isArray(bid.sizes) && bid.sizes.length > 0 && - Array.isArray(bid.sizes[0]) && bid.sizes[0].length > 1 - ) { - size = bid.sizes[0]; - } else { - throw 'Invalid Video Bid - No size provided'; - } - - let postData = { - page_url: !params.referrer ? utils.getTopWindowUrl() : params.referrer, - resolution: _getScreenResolution(), - account_id: params.accountId, - integration: getIntegration(), - timeout: bidderRequest.timeout - (Date.now() - bidderRequest.auctionStart + TIMEOUT_BUFFER), - stash_creatives: true, - ae_pass_through_parameters: params.video.aeParams, - slots: [] - }; - - // Define the slot object - let slotData = { - site_id: params.siteId, - zone_id: params.zoneId, - position: params.position || 'btf', - floor: parseFloat(params.floor) > 0.01 ? params.floor : 0.01, - element_id: bid.placementCode, - name: bid.placementCode, - language: params.video.language, - width: size[0], - height: size[1] - }; - - // check and add inventory, keywords, visitor and size_id data - if (params.video.size_id) { - slotData.size_id = params.video.size_id; - } else { - throw 'Invalid Video Bid - Invalid Ad Type!'; - } - - if (params.inventory && typeof params.inventory === 'object') { - slotData.inventory = params.inventory; - } - - if (params.keywords && Array.isArray(params.keywords)) { - slotData.keywords = params.keywords; - } - - if (params.visitor && typeof params.visitor === 'object') { - slotData.visitor = params.visitor; - } - - postData.slots.push(slotData); - - return (JSON.stringify(postData)); - } - - function buildOptimizedCall(bid) { - bid.startTime = new Date().getTime(); - - var { - accountId, - siteId, - zoneId, - position, - floor, - keywords, - visitor, - inventory, - userId, - referrer: pageUrl - } = bid.params; - - // defaults - floor = (floor = parseFloat(floor)) > 0.01 ? floor : 0.01; - position = position || 'btf'; - - // use rubicon sizes if provided, otherwise adUnit.sizes - var parsedSizes = RubiconAdapter.masSizeOrdering(Array.isArray(bid.params.sizes) - ? bid.params.sizes.map(size => (sizeMap[size] || '').split('x')) : bid.sizes - ); - - if (parsedSizes.length < 1) { - throw 'no valid sizes'; - } - - if (!/^\d+$/.test(accountId)) { - throw 'invalid accountId provided'; - } - - // using array to honor ordering. if order isn't important (it shouldn't be), an object would probably be preferable - var queryString = [ - 'account_id', accountId, - 'site_id', siteId, - 'zone_id', zoneId, - 'size_id', parsedSizes[0], - 'alt_size_ids', parsedSizes.slice(1).join(',') || undefined, - 'p_pos', position, - 'rp_floor', floor, - 'rp_secure', isSecure() ? '1' : '0', - 'tk_flint', getIntegration(), - 'p_screen_res', _getScreenResolution(), - 'kw', keywords, - 'tk_user_key', userId - ]; - - if (visitor !== null && typeof visitor === 'object') { - utils._each(visitor, (item, key) => queryString.push(`tg_v.${key}`, item)); - } - - if (inventory !== null && typeof inventory === 'object') { - utils._each(inventory, (item, key) => queryString.push(`tg_i.${key}`, item)); - } - - queryString.push( - 'rand', Math.random(), - 'rf', !pageUrl ? utils.getTopWindowUrl() : pageUrl - ); - - queryString = queryString.concat(_getDigiTrustQueryParams()); - - return queryString.reduce( - (memo, curr, index) => - index % 2 === 0 && queryString[index + 1] !== undefined - ? memo + curr + '=' + encodeURIComponent(queryString[index + 1]) + '&' : memo, - FASTLANE_ENDPOINT + '?' - ).slice(0, -1); // remove trailing & - } - - let _renderCreative = (script, impId) => ` - - - -
- -
- -`; - - function handleRpCB(responseText, bidRequest) { - var responseObj = JSON.parse(responseText), // can throw - ads = responseObj.ads, - adResponseKey = bidRequest.placementCode; - - // check overall response - if (typeof responseObj !== 'object' || responseObj.status !== 'ok') { - throw 'bad response'; - } - - // video ads array is wrapped in an object - if (bidRequest.mediaType === 'video' && typeof ads === 'object') { - ads = ads[adResponseKey]; - } - - // check the ad response - if (!Array.isArray(ads) || ads.length < 1) { - throw 'invalid ad response'; - } - - // if there are multiple ads, sort by CPM - ads = ads.sort(_adCpmSort); - - ads.forEach(ad => { - if (ad.status !== 'ok') { - throw 'bad ad status'; - } - - // store bid response - // bid status is good (indicating 1) - var bid = bidfactory.createBid(STATUS.GOOD, bidRequest); - bid.creative_id = ad.ad_id; - bid.bidderCode = bidRequest.bidder; - bid.cpm = ad.cpm || 0; - bid.dealId = ad.deal; - if (bidRequest.mediaType === 'video') { - bid.width = bidRequest.params.video.playerWidth; - bid.height = bidRequest.params.video.playerHeight; - bid.vastUrl = ad.creative_depot_url; - bid.descriptionUrl = ad.impression_id; - bid.impression_id = ad.impression_id; - } else { - bid.ad = _renderCreative(ad.script, ad.impression_id); - [bid.width, bid.height] = sizeMap[ad.size_id].split('x').map(num => Number(num)); - } - - // add server-side targeting - bid.rubiconTargeting = (Array.isArray(ad.targeting) ? ad.targeting : []) - .reduce((memo, item) => { - memo[item.key] = item.values[0]; - return memo; - }, {'rpfl_elemid': bidRequest.placementCode}); - - try { - bidmanager.addBidResponse(bidRequest.placementCode, bid); - } catch (err) { - utils.logError('Error from addBidResponse', null, err); - } - }); - } - - function _adCpmSort(adA, adB) { - return (adB.cpm || 0.0) - (adA.cpm || 0.0); - } - - return Object.assign(Adapter.createNew(RUBICON_BIDDER_CODE), { - callBids: _callBids, - createNew: RubiconAdapter.createNew - }); -} - -RubiconAdapter.masSizeOrdering = function(sizes) { - const MAS_SIZE_PRIORITY = [15, 2, 9]; - - return utils.parseSizesInput(sizes) - // map sizes while excluding non-matches - .reduce((result, size) => { - let mappedSize = parseInt(sizeMap[size], 10); - if (mappedSize) { - result.push(mappedSize); - } - return result; - }, []) - .sort((first, second) => { - // sort by MAS_SIZE_PRIORITY priority order - let firstPriority = MAS_SIZE_PRIORITY.indexOf(first), - secondPriority = MAS_SIZE_PRIORITY.indexOf(second); - - if (firstPriority > -1 || secondPriority > -1) { - if (firstPriority === -1) { - return 1; - } - if (secondPriority === -1) { - return -1; - } - return firstPriority - secondPriority; - } - - // and finally ascending order - return first - second; - }); -}; - -RubiconAdapter.createNew = function() { - return new RubiconAdapter(); -}; - -module.exports = RubiconAdapter; - diff --git a/src/native.js b/src/native.js index e2a96bca2f8..537296305d4 100644 --- a/src/native.js +++ b/src/native.js @@ -1,8 +1,6 @@ import { getBidRequest, logError, insertPixel } from './utils'; -/** INSERT NATIVE ADAPTERS - DO NOT EDIT OR REMOVE */ -const nativeAdapters = []; -/** END INSERT NATIVE ADAPTERS */ +export const nativeAdapters = []; export const NATIVE_KEYS = { title: 'hb_native_title', @@ -35,7 +33,7 @@ const SUPPORTED_TYPES = { * passes them on directly. If they were of type 'type', translate * them into the predefined specific asset requests for that type of native ad. */ -export default function processNativeAdUnitParams(params) { +export function processNativeAdUnitParams(params) { if (params && params.type && typeIsSupported(params.type)) { return SUPPORTED_TYPES[params.type]; } diff --git a/test/spec/loaders/adapterLoader_spec.js b/test/spec/loaders/adapterLoader_spec.js deleted file mode 100644 index f5687e6f3f2..00000000000 --- a/test/spec/loaders/adapterLoader_spec.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -const proxyquire = require('proxyquire'); -const allAdapters = require('../../fixtures/allAdapters'); -const expect = require('chai').expect; -require('../../../loaders/adapterLoader'); - -const defaultAdapters = ['aardvark', 'adblade', 'adbutler', 'adequant', 'adform', 'admedia', 'aol', 'appnexus', 'appnexusAst', 'getintent', 'hiromedia', 'indexExchange', 'kruxlink', 'komoona', 'openx', 'piximedia', 'pubmatic', 'pulsepoint', 'rubicon', 'sonobi', 'sovrn', 'springserve', 'thoughtleadr', 'triplelift', 'twenga', 'yieldbot', 'nginad', 'brightcom', 'wideorbit', 'jcm', 'underdogmedia', 'memeglobal', 'centro', 'roxot', {'appnexus': {'alias': 'brealtime'}}, {'appnexus': {'alias': 'pagescience'}}, {'appnexus': {'alias': 'defymedia'}}, {'appnexusAst': {'supportedMediaTypes': ['video']}}]; - -const input = `/** INSERT ADAPTERS - DO NOT EDIT OR REMOVE */ - /** END INSERT ADAPTERS */`; - -describe('adapterLoader.js', () => { - it('should replace with the default set of adapters', () => { - const getAdapterStub = () => defaultAdapters; - const loader = proxyquire('../../../loaders/adapterLoader', {'./getAdapters': getAdapterStub}); - let output = loader(input); - expect(output).to.equal(allAdapters.getAllAdaptersString()); - }); - - it('should return custom adapter list if file exists', () => { - const customAdapter = [{customAdapterName: {srcPath: '/somepath/customAdapterName.js'}}]; - const getAdapterStub = () => customAdapter; - const loader = proxyquire('../../../loaders/adapterLoader', {'fs': {existsSync: () => true }, './getAdapters': getAdapterStub}); - let output = loader(input); - const expected = 'let customAdapterName = require(\'/somepath/customAdapterName.js\');\n exports.registerBidAdapter(new customAdapterName, \'customAdapterName\');\nexports.videoAdapters = [];'; - expect(output).to.equal(expected); - }); - - it('should ignore custom adapters that that do not exist', () => { - const customAdapter = ['appnexus', {customAdapterName: {srcPath: '/somepath/customAdapterName.js'}}]; - const getAdapterStub = () => customAdapter; - const loader = proxyquire('../../../loaders/adapterLoader', {'fs': {existsSync: () => false }, './getAdapters': getAdapterStub}); - let output = loader(input); - const expected = 'var AppnexusAdapter = require(\'./adapters/appnexus.js\');\n exports.registerBidAdapter(new AppnexusAdapter(), \'appnexus\');\nexports.videoAdapters = [];'; - expect(output).to.equal(expected); - }); -}); diff --git a/test/spec/loaders/getAdapters_spec.js b/test/spec/loaders/getAdapters_spec.js deleted file mode 100644 index cd544b1acb3..00000000000 --- a/test/spec/loaders/getAdapters_spec.js +++ /dev/null @@ -1,81 +0,0 @@ -'use strict'; - -const mockfs = require('mock-fs'); -const proxyquire = require('proxyquire'); -const expect = require('chai').expect; - -require('../../../loaders/getAdapters'); - -describe('loaders/getAdapters', () => { - let defaultAdapters; - let customAdapters; - const defaultAdaptersFile = 'adapters.json'; - const adaptersArg = 'adapters'; - - beforeEach(() => { - defaultAdapters = [ 'adapter 1', 'adapter 2', 'adapter 3' ]; - customAdapters = [ 'adapter 1' ]; - }); - - afterEach(() => { - mockfs.restore(); - }); - - describe('when custom adapter list is defined', () => { - describe('and exists', () => { - it('should return custom adapter list', () => { - mockfs({ - 'adapters.json': JSON.stringify(defaultAdapters), - 'custom-adapters.json': JSON.stringify(customAdapters) - }); - const getAdapters = proxyquire('../../../loaders/getAdapters', { - yargs: { argv: { adapters: 'custom-adapters.json' } } - }); - expect(getAdapters(defaultAdaptersFile, adaptersArg)).to.deep.equal(customAdapters); - }); - }); - - describe('and does not exist', () => { - it('should return default adapter list and show warning', () => { - let log; - const consoleLog = console.log.bind(console); - console.log = (message) => { - log = message; - }; - mockfs({ - 'adapters.json': JSON.stringify(defaultAdapters) - }); - const getAdapters = proxyquire('../../../loaders/getAdapters', { - yargs: { argv: { adapters: 'non-existent-adapters.json' } } - }); - expect(getAdapters(defaultAdaptersFile, adaptersArg)).to.deep.equal(defaultAdapters); - expect(log).to.match(/non-existent-adapters.json/); - console.log = consoleLog; - }); - }); - }); - - describe('when custom adapter list is not defined', () => { - it('should return default adapter list', () => { - mockfs({ - 'adapters.json': JSON.stringify(defaultAdapters) - }); - const getAdapters = proxyquire('../../../loaders/getAdapters', { - yargs: { argv: {} } - }); - expect(getAdapters(defaultAdaptersFile, adaptersArg)).to.deep.equal(defaultAdapters); - }); - }); - - describe('when default adapter list cannot be found', () => { - it('should return empty array', () => { - mockfs({ - 'adapters.json': mockfs.file({ mode: 0x000 }) - }); - const getAdapters = proxyquire('../../../loaders/getAdapters', { - yargs: { argv: {} } - }); - expect(getAdapters(defaultAdaptersFile, adaptersArg)).to.deep.equal([]); - }); - }); -}); diff --git a/test/spec/adapters/appnexusAst_spec.js b/test/spec/modules/appnexusAst_spec.js similarity index 99% rename from test/spec/adapters/appnexusAst_spec.js rename to test/spec/modules/appnexusAst_spec.js index db037f6d27b..0f125917614 100644 --- a/test/spec/adapters/appnexusAst_spec.js +++ b/test/spec/modules/appnexusAst_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import Adapter from 'src/adapters/appnexusAst'; +import Adapter from 'modules/appnexusAstBidAdapter'; import bidmanager from 'src/bidmanager'; const ENDPOINT = '//ib.adnxs.com/ut/v3/prebid'; diff --git a/test/spec/adapters/appnexus_spec.js b/test/spec/modules/appnexus_spec.js similarity index 94% rename from test/spec/adapters/appnexus_spec.js rename to test/spec/modules/appnexus_spec.js index 7479f7960ff..e7f5310d90c 100644 --- a/test/spec/adapters/appnexus_spec.js +++ b/test/spec/modules/appnexus_spec.js @@ -1,5 +1,5 @@ import {expect} from 'chai'; -import Adapter from '../../../src/adapters/appnexus'; +import Adapter from '../../../modules/appnexusBidAdapter'; import bidManager from '../../../src/bidmanager'; import adLoader from '../../../src/adloader'; diff --git a/test/spec/modules/rubiconAdapter_spec.js b/test/spec/modules/rubiconAdapter_spec.js deleted file mode 100644 index af4d9a64c32..00000000000 --- a/test/spec/modules/rubiconAdapter_spec.js +++ /dev/null @@ -1,858 +0,0 @@ -import { expect } from 'chai'; -import adapterManager from 'src/adaptermanager'; -import bidManager from 'src/bidmanager'; -import RubiconAdapter from 'modules/rubiconAdapter'; -import {parse as parseQuery} from 'querystring'; - -var CONSTANTS = require('src/constants.json'); - -const INTEGRATION = `pbjs_lite_v$prebid.version$`; // $prebid.version$ will be substituted in by gulp in built prebid - -describe('the rubicon adapter', () => { - let sandbox, - adUnit, - bidderRequest; - - function createVideoBidderRequest() { - let bid = bidderRequest.bids[0]; - bid.mediaType = 'video'; - bid.params.video = { - 'language': 'en', - 'p_aso.video.ext.skip': true, - 'p_aso.video.ext.skipdelay': 15, - 'playerHeight': 320, - 'playerWidth': 640, - 'size_id': 201, - 'aeParams': { - 'p_aso.video.ext.skip': '1', - 'p_aso.video.ext.skipdelay': '15' - } - }; - } - - function createVideoBidderRequestNoVideo() { - let bid = bidderRequest.bids[0]; - bid.mediaType = 'video'; - bid.params.video = ''; - } - - function createVideoBidderRequestNoPlayer() { - let bid = bidderRequest.bids[0]; - bid.mediaType = 'video'; - bid.params.video = { - 'language': 'en', - 'p_aso.video.ext.skip': true, - 'p_aso.video.ext.skipdelay': 15, - 'size_id': 201, - 'aeParams': { - 'p_aso.video.ext.skip': '1', - 'p_aso.video.ext.skipdelay': '15' - } - }; - } - - beforeEach(() => { - sandbox = sinon.sandbox.create(); - - adUnit = { - code: '/19968336/header-bid-tag-0', - sizes: [[300, 250], [320, 50]], - mediaType: 'video', - bids: [ - { - bidder: 'rubicon', - params: { - accountId: '14062', - siteId: '70608', - zoneId: '335918', - userId: '12346', - keywords: ['a', 'b', 'c'], - inventory: { - rating: '5-star', - prodtype: 'tech' - }, - visitor: { - ucat: 'new', - lastsearch: 'iphone' - }, - position: 'atf', - referrer: 'localhost' - } - } - ] - }; - - bidderRequest = { - bidderCode: 'rubicon', - requestId: 'c45dd708-a418-42ec-b8a7-b70a6c6fab0a', - bidderRequestId: '178e34bad3658f', - bids: [ - { - bidder: 'rubicon', - params: { - accountId: '14062', - siteId: '70608', - zoneId: '335918', - userId: '12346', - keywords: ['a', 'b', 'c'], - inventory: { - rating: '5-star', - prodtype: 'tech' - }, - visitor: { - ucat: 'new', - lastsearch: 'iphone' - }, - position: 'atf', - referrer: 'localhost' - }, - placementCode: '/19968336/header-bid-tag-0', - sizes: [[300, 250], [320, 50]], - bidId: '2ffb201a808da7', - bidderRequestId: '178e34bad3658f', - requestId: 'c45dd708-a418-42ec-b8a7-b70a6c6fab0a' - } - ], - start: 1472239426002, - auctionStart: 1472239426000, - timeout: 5000 - }; - }); - - afterEach(() => { - sandbox.restore(); - }); - - describe('callBids public interface', () => { - let rubiconAdapter = adapterManager.bidderRegistry['rubicon']; - - it('should receive a well-formed bidRequest from the adaptermanager', () => { - sandbox.stub(rubiconAdapter, 'callBids'); - - adapterManager.callBids({ - adUnits: [clone(adUnit)] - }); - - let bidderRequest = rubiconAdapter.callBids.getCall(0).args[0]; - - expect(bidderRequest).to.have.property('bids') - .that.is.an('array') - .with.lengthOf(1); - - expect(bidderRequest).to.have.deep.property('bids[0]') - .to.have.property('bidder', 'rubicon'); - - expect(bidderRequest).to.have.deep.property('bids[0]') - .to.have.property('mediaType', 'video'); - - expect(bidderRequest).to.have.deep.property('bids[0]') - .to.have.property('placementCode', adUnit.code); - - expect(bidderRequest).to.have.deep.property('bids[0]') - .with.property('sizes') - .that.is.an('array') - .with.lengthOf(2) - .that.deep.equals(adUnit.sizes); - - expect(bidderRequest).to.have.deep.property('bids[0]') - .with.property('params') - .that.deep.equals(adUnit.bids[0].params); - }); - }); - - describe('MAS mapping / ordering', () => { - let masSizeOrdering = RubiconAdapter.masSizeOrdering; - - it('should not include values without a proper mapping', () => { - // two invalid sizes included: [42, 42], [1, 1] - let ordering = masSizeOrdering([[320, 50], [42, 42], [300, 250], [640, 480], [1, 1], [336, 280]]); - - expect(ordering).to.deep.equal([15, 16, 43, 65]); - }); - - it('should sort values without any MAS priority sizes in regular ascending order', () => { - let ordering = masSizeOrdering([[320, 50], [640, 480], [336, 280], [200, 600]]); - - expect(ordering).to.deep.equal([16, 43, 65, 126]); - }); - - it('should sort MAS priority sizes in the proper order w/ rest ascending', () => { - let ordering = masSizeOrdering([[320, 50], [160, 600], [640, 480], [300, 250], [336, 280], [200, 600]]); - expect(ordering).to.deep.equal([15, 9, 16, 43, 65, 126]); - - ordering = masSizeOrdering([[320, 50], [300, 250], [160, 600], [640, 480], [336, 280], [200, 600], [728, 90]]); - expect(ordering).to.deep.equal([15, 2, 9, 16, 43, 65, 126]); - - ordering = masSizeOrdering([[120, 600], [320, 50], [160, 600], [640, 480], [336, 280], [200, 600], [728, 90]]); - expect(ordering).to.deep.equal([2, 9, 8, 16, 43, 65, 126]); - }); - }); - - describe('callBids implementation', () => { - let rubiconAdapter; - - describe('for requests', () => { - let xhr, - bids; - - beforeEach(() => { - rubiconAdapter = new RubiconAdapter(); - - bids = []; - - xhr = sandbox.useFakeXMLHttpRequest(); - - sandbox.stub(bidManager, 'addBidResponse', (elemId, bid) => { - bids.push(bid); - }); - }); - - afterEach(() => { - xhr.restore(); - }); - - describe('to fastlane', () => { - it('should make a well-formed request', () => { - rubiconAdapter.callBids(bidderRequest); - - let request = xhr.requests[0]; - - let [path, query] = request.url.split('?'); - query = parseQuery(query); - - expect(path).to.equal( - '//fastlane.rubiconproject.com/a/api/fastlane.json' - ); - - let expectedQuery = { - 'account_id': '14062', - 'site_id': '70608', - 'zone_id': '335918', - 'size_id': '15', - 'alt_size_ids': '43', - 'p_pos': 'atf', - 'rp_floor': '0.01', - 'rp_secure': /[01]/, - 'tk_flint': INTEGRATION, - 'p_screen_res': /\d+x\d+/, - 'tk_user_key': '12346', - 'kw': 'a,b,c', - 'tg_v.ucat': 'new', - 'tg_v.lastsearch': 'iphone', - 'tg_i.rating': '5-star', - 'tg_i.prodtype': 'tech', - 'rf': 'localhost' - }; - - // test that all values above are both present and correct - Object.keys(expectedQuery).forEach(key => { - let value = expectedQuery[key]; - if (value instanceof RegExp) { - expect(query[key]).to.match(value); - } else { - expect(query[key]).to.equal(value); - } - }); - - expect(query).to.have.property('rand'); - }); - - it('should use rubicon sizes if present', () => { - var sizesBidderRequest = clone(bidderRequest); - sizesBidderRequest.bids[0].params.sizes = [55, 57, 59]; - - rubiconAdapter.callBids(sizesBidderRequest); - - let query = parseQuery(xhr.requests[0].url.split('?')[1]); - - expect(query['size_id']).to.equal('55'); - expect(query['alt_size_ids']).to.equal('57,59'); - }); - - it('should not send a request and register an error bid if no valid sizes', () => { - var sizesBidderRequest = clone(bidderRequest); - sizesBidderRequest.bids[0].sizes = [[620, 250], [300, 251]]; - - rubiconAdapter.callBids(sizesBidderRequest); - - expect(xhr.requests.length).to.equal(0); - - expect(bidManager.addBidResponse.calledOnce).to.equal(true); - expect(bids).to.be.lengthOf(1); - expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); - }); - - it('should not send a request and register an error if no account id is present', () => { - var noAccountBidderRequest = clone(bidderRequest); - delete noAccountBidderRequest.bids[0].params.accountId; - - rubiconAdapter.callBids(noAccountBidderRequest); - - expect(xhr.requests.length).to.equal(0); - expect(bidManager.addBidResponse.calledOnce).to.equal(true); - expect(bids).to.be.lengthOf(1); - expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); - }); - - it('should allow a floor override', () => { - var floorBidderRequest = clone(bidderRequest); - floorBidderRequest.bids[0].params.floor = 2; - - rubiconAdapter.callBids(floorBidderRequest); - - let query = parseQuery(xhr.requests[0].url.split('?')[1]); - - expect(query['rp_floor']).to.equal('2'); - }); - - it('should send digitrust params', () => { - window.DigiTrust = { - getUser: function() {} - }; - sandbox.stub(window.DigiTrust, 'getUser', () => - ({ - success: true, - identity: { - privacy: {optout: false}, - id: 'testId', - keyv: 'testKeyV' - } - }) - ); - - rubiconAdapter.callBids(bidderRequest); - - let request = xhr.requests[0]; - - let query = request.url.split('?')[1]; - query = parseQuery(query); - - let expectedQuery = { - 'dt.id': 'testId', - 'dt.keyv': 'testKeyV' - }; - - // test that all values above are both present and correct - Object.keys(expectedQuery).forEach(key => { - let value = expectedQuery[key]; - expect(query[key]).to.equal(value); - }); - - delete window.DigiTrust; - }); - - it('should not send digitrust params when DigiTrust not loaded', () => { - rubiconAdapter.callBids(bidderRequest); - - let request = xhr.requests[0]; - - let query = request.url.split('?')[1]; - query = parseQuery(query); - - let undefinedKeys = ['dt.id', 'dt.keyv']; - - // Test that none of the DigiTrust keys are part of the query - undefinedKeys.forEach(key => { - expect(typeof query[key]).to.equal('undefined'); - }); - }); - - it('should send not digitrust params due to optout', () => { - window.DigiTrust = { - getUser: function() {} - }; - sandbox.stub(window.DigiTrust, 'getUser', () => - ({ - success: true, - identity: { - privacy: {optout: true}, - id: 'testId', - keyv: 'testKeyV' - } - }) - ); - - rubiconAdapter.callBids(bidderRequest); - - let request = xhr.requests[0]; - - let query = request.url.split('?')[1]; - query = parseQuery(query); - - let undefinedKeys = ['dt.id', 'dt.keyv']; - - // Test that none of the DigiTrust keys are part of the query - undefinedKeys.forEach(key => { - expect(typeof query[key]).to.equal('undefined'); - }); - - delete window.DigiTrust; - }); - - it('should send not digitrust params due to failure', () => { - window.DigiTrust = { - getUser: function() {} - }; - sandbox.stub(window.DigiTrust, 'getUser', () => - ({ - success: false, - identity: { - privacy: {optout: false}, - id: 'testId', - keyv: 'testKeyV' - } - }) - ); - - rubiconAdapter.callBids(bidderRequest); - - let request = xhr.requests[0]; - - let query = request.url.split('?')[1]; - query = parseQuery(query); - - let undefinedKeys = ['dt.id', 'dt.keyv']; - - // Test that none of the DigiTrust keys are part of the query - undefinedKeys.forEach(key => { - expect(typeof query[key]).to.equal('undefined'); - }); - - delete window.DigiTrust; - }); - }); - - describe('for video requests', () => { - /* - beforeEach(() => { - createVideoBidderRequest(); - - sandbox.stub(Date, 'now', () => - bidderRequest.auctionStart + 100 - ); - }); - */ - - it('should make a well-formed video request', () => { - createVideoBidderRequest(); - - sandbox.stub(Date, 'now', () => - bidderRequest.auctionStart + 100 - ); - - rubiconAdapter.callBids(bidderRequest); - - let request = xhr.requests[0]; - - let url = request.url; - let post = JSON.parse(request.requestBody); - - expect(url).to.equal('//fastlane-adv.rubiconproject.com/v1/auction/video'); - - expect(post).to.have.property('page_url').that.is.a('string'); - expect(post.resolution).to.match(/\d+x\d+/); - expect(post.account_id).to.equal('14062'); - expect(post.integration).to.equal(INTEGRATION); - expect(post).to.have.property('timeout').that.is.a('number'); - expect(post.timeout < 5000).to.equal(true); - expect(post.stash_creatives).to.equal(true); - - expect(post).to.have.property('ae_pass_through_parameters'); - expect(post.ae_pass_through_parameters) - .to.have.property('p_aso.video.ext.skip') - .that.equals('1'); - expect(post.ae_pass_through_parameters) - .to.have.property('p_aso.video.ext.skipdelay') - .that.equals('15'); - - expect(post).to.have.property('slots') - .with.length.of(1); - - let slot = post.slots[0]; - - expect(slot.site_id).to.equal('70608'); - expect(slot.zone_id).to.equal('335918'); - expect(slot.position).to.equal('atf'); - expect(slot.floor).to.equal(0.01); - expect(slot.element_id).to.equal(bidderRequest.bids[0].placementCode); - expect(slot.name).to.equal(bidderRequest.bids[0].placementCode); - expect(slot.language).to.equal('en'); - expect(slot.width).to.equal(640); - expect(slot.height).to.equal(320); - expect(slot.size_id).to.equal(201); - - expect(slot).to.have.property('inventory').that.is.an('object'); - expect(slot.inventory).to.have.property('rating').that.equals('5-star'); - expect(slot.inventory).to.have.property('prodtype').that.equals('tech'); - - expect(slot).to.have.property('keywords') - .that.is.an('array') - .of.length(3) - .that.deep.equals(['a', 'b', 'c']); - - expect(slot).to.have.property('visitor').that.is.an('object'); - expect(slot.visitor).to.have.property('ucat').that.equals('new'); - expect(slot.visitor).to.have.property('lastsearch').that.equals('iphone'); - }); - - it('should allow a floor price override', () => { - createVideoBidderRequest(); - - sandbox.stub(Date, 'now', () => - bidderRequest.auctionStart + 100 - ); - - var floorBidderRequest = clone(bidderRequest); - - // enter an explicit floor price // - floorBidderRequest.bids[0].params.floor = 3.25; - - rubiconAdapter.callBids(floorBidderRequest); - - let request = xhr.requests[0]; - let post = JSON.parse(request.requestBody); - - let floor = post.slots[0].floor; - - expect(floor).to.equal(3.25); - }); - - it('should trap when no video object is passed in', () => { - createVideoBidderRequestNoVideo(); - sandbox.stub(Date, 'now', () => - bidderRequest.auctionStart + 100 - ); - - var floorBidderRequest = clone(bidderRequest); - - rubiconAdapter.callBids(floorBidderRequest); - - expect(xhr.requests.length).to.equal(0); - }); - - it('should get size from bid.sizes too', () => { - createVideoBidderRequestNoPlayer(); - sandbox.stub(Date, 'now', () => - bidderRequest.auctionStart + 100 - ); - - var floorBidderRequest = clone(bidderRequest); - - rubiconAdapter.callBids(floorBidderRequest); - - let request = xhr.requests[0]; - let post = JSON.parse(request.requestBody); - - expect(post.slots[0].width).to.equal(300); - expect(post.slots[0].height).to.equal(250); - }); - }); - }); - - describe('response handler', () => { - let bids, - server, - addBidResponseAction; - - beforeEach(() => { - bids = []; - - server = sinon.fakeServer.create(); - - sandbox.stub(bidManager, 'addBidResponse', (elemId, bid) => { - bids.push(bid); - if (addBidResponseAction) { - addBidResponseAction(); - addBidResponseAction = undefined; - } - }); - }); - - afterEach(() => { - server.restore(); - }); - - describe('for fastlane', () => { - it('should handle a success response and sort by cpm', () => { - server.respondWith(JSON.stringify({ - 'status': 'ok', - 'account_id': 14062, - 'site_id': 70608, - 'zone_id': 530022, - 'size_id': 15, - 'alt_size_ids': [ - 43 - ], - 'tracking': '', - 'inventory': {}, - 'ads': [ - { - 'status': 'ok', - 'impression_id': '153dc240-8229-4604-b8f5-256933b9374c', - 'size_id': '15', - 'ad_id': '6', - 'advertiser': 7, - 'network': 8, - 'creative_id': 9, - 'type': 'script', - 'script': 'alert(\'foo\')', - 'campaign_id': 10, - 'cpm': 0.811, - 'targeting': [ - { - 'key': 'rpfl_14062', - 'values': [ - '15_tier_all_test' - ] - } - ] - }, - { - 'status': 'ok', - 'impression_id': '153dc240-8229-4604-b8f5-256933b9374d', - 'size_id': '43', - 'ad_id': '7', - 'advertiser': 7, - 'network': 8, - 'creative_id': 9, - 'type': 'script', - 'script': 'alert(\'foo\')', - 'campaign_id': 10, - 'cpm': 0.911, - 'targeting': [ - { - 'key': 'rpfl_14062', - 'values': [ - '43_tier_all_test' - ] - } - ] - } - ] - })); - - rubiconAdapter.callBids(bidderRequest); - - server.respond(); - - expect(bidManager.addBidResponse.calledTwice).to.equal(true); - - expect(bids).to.be.lengthOf(2); - - expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD); - expect(bids[0].bidderCode).to.equal('rubicon'); - expect(bids[0].width).to.equal(320); - expect(bids[0].height).to.equal(50); - expect(bids[0].cpm).to.equal(0.911); - expect(bids[0].ad).to.contain(`alert('foo')`) - .and.to.contain(``) - .and.to.contain(`
`); - expect(bids[0].rubiconTargeting.rpfl_elemid).to.equal('/19968336/header-bid-tag-0'); - expect(bids[0].rubiconTargeting.rpfl_14062).to.equal('43_tier_all_test'); - - expect(bids[1].getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD); - expect(bids[1].bidderCode).to.equal('rubicon'); - expect(bids[1].width).to.equal(300); - expect(bids[1].height).to.equal(250); - expect(bids[1].cpm).to.equal(0.811); - expect(bids[1].ad).to.contain(`alert('foo')`) - .and.to.contain(``) - .and.to.contain(`
`); - expect(bids[1].rubiconTargeting.rpfl_elemid).to.equal('/19968336/header-bid-tag-0'); - expect(bids[1].rubiconTargeting.rpfl_14062).to.equal('15_tier_all_test'); - }); - - it('should be fine with a CPM of 0', () => { - server.respondWith(JSON.stringify({ - 'status': 'ok', - 'account_id': 14062, - 'site_id': 70608, - 'zone_id': 530022, - 'size_id': 15, - 'alt_size_ids': [ - 43 - ], - 'tracking': '', - 'inventory': {}, - 'ads': [{ - 'status': 'ok', - 'cpm': 0, - 'size_id': 15 - }] - })); - - rubiconAdapter.callBids(bidderRequest); - - server.respond(); - - expect(bidManager.addBidResponse.calledOnce).to.equal(true); - expect(bids).to.be.lengthOf(1); - expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD); - }); - - it('should handle an error with no ads returned', () => { - server.respondWith(JSON.stringify({ - 'status': 'ok', - 'account_id': 14062, - 'site_id': 70608, - 'zone_id': 530022, - 'size_id': 15, - 'alt_size_ids': [ - 43 - ], - 'tracking': '', - 'inventory': {}, - 'ads': [] - })); - - rubiconAdapter.callBids(bidderRequest); - - server.respond(); - - expect(bidManager.addBidResponse.calledOnce).to.equal(true); - expect(bids).to.be.lengthOf(1); - expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); - }); - - it('should handle an error with bad status', () => { - server.respondWith(JSON.stringify({ - 'status': 'ok', - 'account_id': 14062, - 'site_id': 70608, - 'zone_id': 530022, - 'size_id': 15, - 'alt_size_ids': [ - 43 - ], - 'tracking': '', - 'inventory': {}, - 'ads': [{ - 'status': 'not_ok', - }] - })); - - rubiconAdapter.callBids(bidderRequest); - - server.respond(); - - expect(bidManager.addBidResponse.calledOnce).to.equal(true); - expect(bids).to.be.lengthOf(1); - expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); - }); - - it('should handle an error because of malformed json response', () => { - server.respondWith('{test{'); - - rubiconAdapter.callBids(bidderRequest); - - server.respond(); - - expect(bidManager.addBidResponse.calledOnce).to.equal(true); - expect(bids).to.be.lengthOf(1); - expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); - }); - - it('should handle error contacting endpoint', () => { - server.respondWith([404, {}, '']); - - rubiconAdapter.callBids(bidderRequest); - - server.respond(); - - expect(bidManager.addBidResponse.calledOnce).to.equal(true); - expect(bids).to.be.lengthOf(1); - expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); - }); - - it('should not register an error bid when a success call to addBidResponse throws an error', () => { - server.respondWith(JSON.stringify({ - 'status': 'ok', - 'account_id': 14062, - 'site_id': 70608, - 'zone_id': 530022, - 'size_id': 15, - 'alt_size_ids': [ - 43 - ], - 'tracking': '', - 'inventory': {}, - 'ads': [{ - 'status': 'ok', - 'cpm': 0.8, - 'size_id': 15 - }] - })); - - addBidResponseAction = function() { - throw new Error('test error'); - }; - - rubiconAdapter.callBids(bidderRequest); - - server.respond(); - - // was calling twice for same bid, but should only call once - expect(bidManager.addBidResponse.calledOnce).to.equal(true); - expect(bids).to.be.lengthOf(1); - }); - }); - - describe('for video', () => { - beforeEach(() => { - createVideoBidderRequest(); - }); - - it('should register a successful bid', () => { - server.respondWith(JSON.stringify({ - 'status': 'ok', - 'ads': { - '/19968336/header-bid-tag-0': [ - { - 'status': 'ok', - 'cpm': 1, - 'tier': 'tier0200', - 'targeting': { - 'rpfl_8000': '201_tier0200', - 'rpfl_elemid': '/19968336/header-bid-tag-0' - }, - 'impression_id': 'a40fe16e-d08d-46a9-869d-2e1573599e0c', - 'site_id': 88888, - 'zone_id': 54321, - 'creative_type': 'video', - 'creative_depot_url': 'https://fastlane-adv.rubiconproject.com/v1/creative/a40fe16e-d08d-46a9-869d-2e1573599e0c.xml', - 'ad_id': 999999, - 'size_id': 201, - 'advertiser': 12345 - } - ] - }, - 'account_id': 7780 - })); - - rubiconAdapter.callBids(bidderRequest); - - server.respond(); - - // was calling twice for same bid, but should only call once - expect(bidManager.addBidResponse.calledOnce).to.equal(true); - - expect(bids).to.be.lengthOf(1); - - expect(bids[0].getStatusCode()).to.equal(CONSTANTS.STATUS.GOOD); - expect(bids[0].bidderCode).to.equal('rubicon'); - expect(bids[0].creative_id).to.equal(999999); - expect(bids[0].cpm).to.equal(1); - expect(bids[0].descriptionUrl).to.equal('a40fe16e-d08d-46a9-869d-2e1573599e0c'); - expect(bids[0].vastUrl).to.equal( - 'https://fastlane-adv.rubiconproject.com/v1/creative/a40fe16e-d08d-46a9-869d-2e1573599e0c.xml' - ); - expect(bids[0].impression_id).to.equal('a40fe16e-d08d-46a9-869d-2e1573599e0c'); - }); - }); - }); - }); -}); - -function clone(obj) { - return JSON.parse(JSON.stringify(obj)); -} diff --git a/test/spec/adapters/rubicon_spec.js b/test/spec/modules/rubicon_spec.js similarity index 99% rename from test/spec/adapters/rubicon_spec.js rename to test/spec/modules/rubicon_spec.js index 94a4fea82b9..254ab205439 100644 --- a/test/spec/adapters/rubicon_spec.js +++ b/test/spec/modules/rubicon_spec.js @@ -1,8 +1,7 @@ import { expect } from 'chai'; -import adloader from 'src/adloader'; import adapterManager from 'src/adaptermanager'; import bidManager from 'src/bidmanager'; -import RubiconAdapter from 'src/adapters/rubicon'; +import RubiconAdapter from 'modules/rubiconBidAdapter'; import {parse as parseQuery} from 'querystring'; var CONSTANTS = require('src/constants.json'); diff --git a/test/spec/unit/pbjs_api_spec.js b/test/spec/unit/pbjs_api_spec.js index 95aed3b396f..3f0e00e3851 100644 --- a/test/spec/unit/pbjs_api_spec.js +++ b/test/spec/unit/pbjs_api_spec.js @@ -23,6 +23,9 @@ var events = require('src/events'); var adserver = require('src/adserver'); var CONSTANTS = require('src/constants.json'); +// The native tests expect a native adapter to be registered. So this is being included here for now. +var appnexusAstBidAdapter = require('modules/appnexusAstBidAdapter'); + var config = require('test/fixtures/config.json'); $$PREBID_GLOBAL$$ = $$PREBID_GLOBAL$$ || {}; diff --git a/webpack.conf.js b/webpack.conf.js index 924ba957394..7927bbcb085 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -53,11 +53,6 @@ module.exports = { include: /(src)/, loader: 'adapterLoader' }, - { - test: /native.js/, - include: /(src)/, - loader: 'nativeLoader' - }, { test: /constants.json$/, include: /(src)/, From 1416459b3d6a12fce251cc479d8d038a483e1c94 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 6 Jun 2017 18:25:50 -0600 Subject: [PATCH 015/111] added logging for files getting bundled --- gulpfile.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 2059d0540ad..d5725e8c00a 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -69,10 +69,13 @@ function bundle(dev) { } } + var entries = [helpers.getBuiltPrebid(dev)].concat(helpers.getBuiltModules(dev, modules)); + + gutil.log('Concatenating files:\n', entries); + gutil.log('Appending ' + prebid.globalVarName + '.processQueue();'); + return gulp.src( - [helpers.getBuiltPrebid(dev)].concat( - helpers.getBuiltModules(dev, modules) - ) + entries ).pipe(concat(argv.bundleName ? argv.bundleName : 'bundle.js')) .pipe(gulpif(!argv.manualEnable, footer('\n<%= global %>.processQueue();', { global: prebid.globalVarName From 126c9a5b0c0e721e929308245636699ad1c690fe Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 6 Jun 2017 18:37:37 -0600 Subject: [PATCH 016/111] fixed bug in bundling external modules --- gulpHelpers.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gulpHelpers.js b/gulpHelpers.js index 29b1be9b546..d83462148ad 100644 --- a/gulpHelpers.js +++ b/gulpHelpers.js @@ -71,10 +71,10 @@ module.exports = { }, internalModules)); }), - getBuiltModules: function(dev, names) { - var modules = this.getModuleNames(); - if(Array.isArray(names)) { - modules = _.intersection(modules, names); + getBuiltModules: function(dev, externalModules) { + var modules = this.getModuleNames(externalModules); + if(Array.isArray(externalModules)) { + modules = _.intersection(modules, externalModules); } return modules.map(name => path.join(__dirname, dev ? DEV_PATH : BUILD_PATH, name + '.js')); }, From 68507ff6c29f7c96a4d109127afd6ba5ef598dc7 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 8 Jun 2017 09:59:18 -0600 Subject: [PATCH 017/111] aardvark bid adapter converted to module --- adapters.json | 1 - .../aardvark.js => modules/aardvarkBidAdapter.js | 15 +++++++++------ .../aardvarkBidAdapter_spec.js} | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) rename src/adapters/aardvark.js => modules/aardvarkBidAdapter.js (92%) rename test/spec/{adapters/aardvark_spec.js => modules/aardvarkBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 262cf1c4d5b..001503c91fc 100644 --- a/adapters.json +++ b/adapters.json @@ -1,5 +1,4 @@ [ - "aardvark", "adblade", "adbund", "adbutler", diff --git a/src/adapters/aardvark.js b/modules/aardvarkBidAdapter.js similarity index 92% rename from src/adapters/aardvark.js rename to modules/aardvarkBidAdapter.js index e8a3cc5ab38..65c90b3be47 100644 --- a/src/adapters/aardvark.js +++ b/modules/aardvarkBidAdapter.js @@ -4,12 +4,13 @@ * or for additional integration support please contact sales@rtk.io */ -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); -var adapter = require('./adapter.js'); -var constants = require('../constants.json'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var adapter = require('src/adapter.js'); +var constants = require('src/constants.json'); +var adaptermanager = require('src/adaptermanager'); var AARDVARK_CALLBACK_NAME = 'aardvarkResponse', AARDVARK_REQUESTS_MAP = 'aardvarkRequests', @@ -123,4 +124,6 @@ exports.createNew = function() { return new AardvarkAdapter(); }; +adaptermanager.registerBidAdapter(new AardvarkAdapter, 'aardvark'); + module.exports = AardvarkAdapter; diff --git a/test/spec/adapters/aardvark_spec.js b/test/spec/modules/aardvarkBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/aardvark_spec.js rename to test/spec/modules/aardvarkBidAdapter_spec.js index 46a90378bcd..5edf7ce0b25 100644 --- a/test/spec/adapters/aardvark_spec.js +++ b/test/spec/modules/aardvarkBidAdapter_spec.js @@ -1,6 +1,6 @@ describe('aardvark adapter tests', function () { const expect = require('chai').expect; - const adapter = require('src/adapters/aardvark'); + const adapter = require('modules/aardvarkBidAdapter'); const bidmanager = require('src/bidmanager'); const adloader = require('src/adloader'); const constants = require('src/constants.json'); From 269922bbc799eba3d611cc24c479d04d9cb18729 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 8 Jun 2017 10:10:47 -0600 Subject: [PATCH 018/111] upadte appnexus bid adpater names and get ride of mocha loader tests --- gulpfile.js | 26 +- package.json | 1 - ..._spec.js => appnexusAstBidAdapter_spec.js} | 0 ...xus_spec.js => appnexusBidAdapter_spec.js} | 0 yarn.lock | 908 ++++++++++++++---- 5 files changed, 698 insertions(+), 237 deletions(-) rename test/spec/modules/{appnexusAst_spec.js => appnexusAstBidAdapter_spec.js} (100%) rename test/spec/modules/{appnexus_spec.js => appnexusBidAdapter_spec.js} (100%) diff --git a/gulpfile.js b/gulpfile.js index d5725e8c00a..3a11ab39daa 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -10,7 +10,6 @@ var webpack = require('webpack-stream'); var uglify = require('gulp-uglify'); var clean = require('gulp-clean'); var karma = require('gulp-karma'); -var mocha = require('gulp-mocha'); var opens = require('open'); var webpackConfig = require('./webpack.conf.js'); var helpers = require('./gulpHelpers'); @@ -42,7 +41,7 @@ gulp.task('serve', ['clean', 'lint', 'build-bundle-dev', 'watch', 'test']); gulp.task('serve-nw', ['clean', 'lint', 'devpack', 'webpack', 'watch', 'e2etest']); -gulp.task('run-tests', ['clean', 'lint', 'webpack', 'test', 'mocha']); +gulp.task('run-tests', ['clean', 'lint', 'webpack', 'test']); gulp.task('build', ['build-bundle-prod']); @@ -186,26 +185,6 @@ gulp.task('test', ['clean'], function () { })); }); -// -// Making this task depend on lint is a bit of a hack. The `run-tests` command is the entrypoint for the CI process, -// and it needs to run all these tasks together. However, the "lint" and "mocha" tasks explode when used in parallel, -// resulting in some mysterious "ShellJS: internal error TypeError: Cannot read property 'isFile' of undefined" -// errors. -// -// Gulp doesn't support serial dependencies (until gulp 4.0... which is most likely never coming out)... so we have -// to trick it by declaring 'lint' as a dependency here. See https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md -// -gulp.task('mocha', ['webpack', 'lint'], function() { - return gulp.src(['test/spec/loaders/**/*.js'], { read: false }) - .pipe(mocha({ - reporter: 'spec', - globals: { - expect: require('chai').expect - } - })) - .on('error', gutil.log); -}); - // Small task to load coverage reports in the browser gulp.task('coverage', function (done) { var coveragePort = 1999; @@ -238,7 +217,8 @@ gulp.task('watch', function () { gulp.watch([ 'loaders/**/*.js', 'test/spec/loaders/**/*.js' - ], ['lint', 'mocha']); + ], ['lint']); + gulp.watch(['integrationExamples/gpt/*.html'], ['test']); connect.server({ https: argv.https, port: port, diff --git a/package.json b/package.json index eae4f15fe7b..70ca831706a 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,6 @@ "gulp-jscs": "^3.0.2", "gulp-jsdoc-to-markdown": "^1.2.1", "gulp-karma": "0.0.4", - "gulp-mocha": "^2.2.0", "gulp-optimize-js": "^1.1.0", "gulp-rename": "^1.2.0", "gulp-replace": "^0.4.0", diff --git a/test/spec/modules/appnexusAst_spec.js b/test/spec/modules/appnexusAstBidAdapter_spec.js similarity index 100% rename from test/spec/modules/appnexusAst_spec.js rename to test/spec/modules/appnexusAstBidAdapter_spec.js diff --git a/test/spec/modules/appnexus_spec.js b/test/spec/modules/appnexusBidAdapter_spec.js similarity index 100% rename from test/spec/modules/appnexus_spec.js rename to test/spec/modules/appnexusBidAdapter_spec.js diff --git a/yarn.lock b/yarn.lock index 11c7f1b9381..b05243b7580 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,10 @@ # yarn lockfile v1 +"JSV@>= 4.0.x": + version "4.0.2" + resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" + abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" @@ -31,8 +35,8 @@ acorn@^3.0.0, acorn@^3.0.4, acorn@^3.3.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" acorn@^4.0.3: - version "4.0.11" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" acorn@^5.0.1: version "5.0.3" @@ -47,8 +51,8 @@ after@0.8.2: resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" agent-base@2: - version "2.0.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e" + version "2.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7" dependencies: extend "~3.0.0" semver "~5.0.1" @@ -119,6 +123,10 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + anymatch@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" @@ -138,8 +146,8 @@ app-usage-stats@^0.4.0: usage-stats "^0.8.2" aproba@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" archiver@~0.14.0, archiver@~0.14.3: version "0.14.4" @@ -165,7 +173,7 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argparse@^1.0.7: +argparse@^1.0.2, argparse@^1.0.7: version "1.0.9" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" dependencies: @@ -294,18 +302,18 @@ ast-types@0.8.12: version "0.8.12" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" -ast-types@0.9.6: +ast-types@0.9.6, ast-types@0.x.x: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" -ast-types@0.x.x: - version "0.9.11" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.11.tgz#371177bb59232ff5ceaa1d09ee5cad705b1a5aa9" - async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async@0.2.x, async@~0.2.10, async@~0.2.6, async@~0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + async@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/async/-/async-0.9.0.tgz#ac3613b1da9bed1b47510bb4651b8931e47146c7" @@ -319,15 +327,11 @@ async@^0.9.0, async@~0.9.0: resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" async@^2.0.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.4.0.tgz#4990200f18ea5b837c2cc4f8c031a6985c385611" + version "2.4.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7" dependencies: lodash "^4.14.0" -async@~0.2.10, async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - async@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" @@ -408,6 +412,57 @@ babel-core@^6.24.1: slash "^1.0.0" source-map "^0.5.0" +babel-core@~5.8.3: + version "5.8.38" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-5.8.38.tgz#1fcaee79d7e61b750b00b8e54f6dfc9d0af86558" + dependencies: + babel-plugin-constant-folding "^1.0.1" + babel-plugin-dead-code-elimination "^1.0.2" + babel-plugin-eval "^1.0.1" + babel-plugin-inline-environment-variables "^1.0.1" + babel-plugin-jscript "^1.0.4" + babel-plugin-member-expression-literals "^1.0.1" + babel-plugin-property-literals "^1.0.1" + babel-plugin-proto-to-assign "^1.0.3" + babel-plugin-react-constant-elements "^1.0.3" + babel-plugin-react-display-name "^1.0.3" + babel-plugin-remove-console "^1.0.1" + babel-plugin-remove-debugger "^1.0.1" + babel-plugin-runtime "^1.0.7" + babel-plugin-undeclared-variables-check "^1.0.2" + babel-plugin-undefined-to-void "^1.1.6" + babylon "^5.8.38" + bluebird "^2.9.33" + chalk "^1.0.0" + convert-source-map "^1.1.0" + core-js "^1.0.0" + debug "^2.1.1" + detect-indent "^3.0.0" + esutils "^2.0.0" + fs-readdir-recursive "^0.1.0" + globals "^6.4.0" + home-or-tmp "^1.0.0" + is-integer "^1.0.4" + js-tokens "1.0.1" + json5 "^0.4.0" + lodash "^3.10.0" + minimatch "^2.0.3" + output-file-sync "^1.1.0" + path-exists "^1.0.0" + path-is-absolute "^1.0.0" + private "^0.1.6" + regenerator "0.8.40" + regexpu "^1.3.0" + repeating "^1.1.2" + resolve "^1.1.6" + shebang-regex "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + source-map-support "^0.2.10" + to-fast-properties "^1.0.0" + trim-right "^1.0.0" + try-resolve "^1.0.0" + babel-generator@^6.22.0, babel-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" @@ -496,6 +551,13 @@ babel-helpers@^6.22.0, babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-jscs@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/babel-jscs/-/babel-jscs-2.0.5.tgz#0a347046b48145acbca56e8c8ed5f736bc54f9d0" + dependencies: + babel-core "~5.8.3" + lodash.assign "^3.2.0" + babel-loader@6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" @@ -517,6 +579,60 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-constant-folding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz#8361d364c98e449c3692bdba51eff0844290aa8e" + +babel-plugin-dead-code-elimination@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" + +babel-plugin-eval@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" + +babel-plugin-inline-environment-variables@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz#1f58ce91207ad6a826a8bf645fafe68ff5fe3ffe" + +babel-plugin-jscript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz#8f342c38276e87a47d5fa0a8bd3d5eb6ccad8fcc" + +babel-plugin-member-expression-literals@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3" + +babel-plugin-property-literals@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336" + +babel-plugin-proto-to-assign@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz#c49e7afd02f577bc4da05ea2df002250cf7cd123" + dependencies: + lodash "^3.9.3" + +babel-plugin-react-constant-elements@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz#946736e8378429cbc349dcff62f51c143b34e35a" + +babel-plugin-react-display-name@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz#754fe38926e8424a4e7b15ab6ea6139dee0514fc" + +babel-plugin-remove-console@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz#d8f24556c3a05005d42aaaafd27787f53ff013a7" + +babel-plugin-remove-debugger@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz#fd2ea3cd61a428ad1f3b9c89882ff4293e8c14c7" + +babel-plugin-runtime@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz#bf7c7d966dd56ecd5c17fa1cb253c9acb7e54aaf" + babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" @@ -716,6 +832,16 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" +babel-plugin-undeclared-variables-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz#5cf1aa539d813ff64e99641290af620965f65dee" + dependencies: + leven "^1.0.2" + +babel-plugin-undefined-to-void@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" + babel-polyfill@^6.13.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" @@ -805,9 +931,13 @@ babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.24.1: lodash "^4.2.0" to-fast-properties "^1.0.1" +babylon@^5.8.38: + version "5.8.38" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd" + babylon@^6.11.0, babylon@^6.15.0: - version "6.17.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f" + version "6.17.2" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.2.tgz#201d25ef5f892c41bae49488b08db0dd476e9f5c" backo2@1.0.2: version "1.0.2" @@ -906,7 +1036,7 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^2.9.27, bluebird@^2.9.30: +bluebird@^2.9.27, bluebird@^2.9.30, bluebird@^2.9.33: version "2.11.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" @@ -915,19 +1045,19 @@ bluebird@~3.4.6: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" body-parser@^1.12.4: - version "1.17.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.1.tgz#75b3bc98ddd6e7e0d8ffe750dfaca5c66993fa47" + version "1.17.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" dependencies: bytes "2.4.0" content-type "~1.0.2" - debug "2.6.1" + debug "2.6.7" depd "~1.1.0" http-errors "~1.6.1" iconv-lite "0.4.15" on-finished "~2.3.0" qs "6.4.0" raw-body "~2.2.0" - type-is "~1.6.14" + type-is "~1.6.15" body-parser@~1.13.3: version "1.13.3" @@ -1028,10 +1158,6 @@ buffer-crc32@~0.2.1, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" -buffer-shims@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - buffer@^4.9.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" @@ -1173,7 +1299,7 @@ chalk@^0.5.0: strip-ansi "^0.3.0" supports-color "^0.2.0" -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3, chalk@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -1183,6 +1309,14 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + chokidar@^1.0.0, chokidar@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -1217,6 +1351,12 @@ cli-cursor@^1.0.1: dependencies: restore-cursor "^1.0.1" +cli-table@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + cli-width@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d" @@ -1310,6 +1450,14 @@ collect-json@^1.0.1, collect-json@^1.0.7, collect-json@^1.0.8: stream-connect "^1.0.2" stream-via "^1.0.3" +colors@0.6.x: + version "0.6.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + colors@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -1415,12 +1563,18 @@ commander@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" -commander@2.9.0, commander@^2.5.0, commander@^2.8.1, commander@^2.9.0: +commander@2.9.0, commander@^2.5.0, commander@^2.8.1, commander@^2.9.0, commander@~2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: graceful-readlink ">= 1.0.0" +comment-parser@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.3.1.tgz#fd657aac8c1492d308c9a6100fc9b49d2435aba1" + dependencies: + readable-stream "^2.0.4" + common-sequence@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/common-sequence/-/common-sequence-1.0.2.tgz#30e07f3f8f6f7f9b3dee854f20b2d39eee086de8" @@ -1569,11 +1723,11 @@ connect@^2.30.0: vhost "~3.0.1" connect@^3.3.5: - version "3.6.1" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.1.tgz#b7760693a74f0454face1d9378edb3f885b43227" + version "3.6.2" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.2.tgz#694e8d20681bfe490282c8ab886be98f09f42fe7" dependencies: - debug "2.6.3" - finalhandler "1.0.1" + debug "2.6.7" + finalhandler "1.0.3" parseurl "~1.3.1" utils-merge "1.0.0" @@ -1622,6 +1776,10 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + core-js@^2.0.1, core-js@^2.1.0, core-js@^2.4.0, core-js@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" @@ -1734,6 +1892,10 @@ custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + d@1: version "1.0.0" resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" @@ -1788,11 +1950,11 @@ debug@0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" -debug@2, debug@^2.1.1, debug@^2.2.0: - version "2.6.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.6.tgz#a9fa6fbe9ca43cf1e79f73b75c0189cbb7d6db5a" +debug@2, debug@2.6.8, debug@^2.1.1, debug@^2.2.0: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: - ms "0.7.3" + ms "2.0.0" debug@2.0.0: version "2.0.0" @@ -1812,17 +1974,11 @@ debug@2.3.3: dependencies: ms "0.7.2" -debug@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" - dependencies: - ms "0.7.2" - -debug@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d" +debug@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" dependencies: - ms "0.7.2" + ms "2.0.0" decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" @@ -1834,6 +1990,10 @@ deep-eql@0.1.3, deep-eql@^0.1.3: dependencies: type-detect "0.1.1" +deep-equal@*: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + deep-extend@~0.4.0, deep-extend@~0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" @@ -1929,6 +2089,14 @@ detect-file@^0.1.0: dependencies: fs-exists-sync "^0.1.0" +detect-indent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -1998,10 +2166,38 @@ dom-serialize@^2.2.0: extend "^3.0.0" void-elements "^2.0.0" +dom-serializer@0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + domain-browser@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" +domelementtype@1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + dependencies: + domelementtype "1" + +domutils@1.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + duplexer2@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" @@ -2110,6 +2306,14 @@ ent@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + +entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + errno@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" @@ -2130,8 +2334,8 @@ errorhandler@~1.4.2: escape-html "~1.0.3" es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.18" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.18.tgz#dc239d3dce4c22b9c939aa180878837a3c0b5c92" + version "0.10.23" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.23.tgz#7578b51be974207a5487821b56538c224e4e7b38" dependencies: es6-iterator "2" es6-symbol "~3.1" @@ -2212,7 +2416,7 @@ escodegen@1.7.x, escodegen@1.x.x: optionalDependencies: source-map "~0.2.0" -escope@^3.6.0: +escope@^3.2.0, escope@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" dependencies: @@ -2241,8 +2445,8 @@ eslint-module-utils@^2.0.0: pkg-dir "^1.0.0" eslint-plugin-import@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" + version "2.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.3.0.tgz#37c801e0ada0e296cbdf20c3f393acb5b52af36b" dependencies: builtin-modules "^1.1.1" contains-path "^0.1.0" @@ -2253,7 +2457,7 @@ eslint-plugin-import@^2.2.0: has "^1.0.1" lodash.cond "^4.3.0" minimatch "^3.0.3" - pkg-up "^1.0.0" + read-pkg-up "^2.0.0" eslint-plugin-node@^4.2.2: version "4.2.2" @@ -2343,7 +2547,7 @@ esprima@3.x.x, esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" -esprima@^2.6.0: +esprima@^2.6.0, esprima@~2.7.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -2364,7 +2568,7 @@ estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" -estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -2380,7 +2584,7 @@ estree-walker@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" -esutils@^2.0.2: +esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -2431,6 +2635,10 @@ exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" +exit@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + expand-braces@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" @@ -2505,6 +2713,10 @@ extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + faker@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/faker/-/faker-3.1.0.tgz#0f908faf4e6ec02524e54a57e432c5c013e08c9f" @@ -2630,11 +2842,11 @@ finalhandler@0.4.0: on-finished "~2.3.0" unpipe "~1.0.0" -finalhandler@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.1.tgz#bcd15d1689c0e5ed729b6f7f541a6df984117db8" +finalhandler@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" dependencies: - debug "2.6.3" + debug "2.6.7" encodeurl "~1.0.1" escape-html "~1.0.3" on-finished "~2.3.0" @@ -2668,6 +2880,12 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + findup-sync@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" @@ -2807,6 +3025,10 @@ fs-extra@~0.6.1: ncp "~0.4.2" rimraf "~2.2.0" +fs-readdir-recursive@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059" + fs-then-native@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/fs-then-native/-/fs-then-native-1.0.2.tgz#ac8d3807c9f1bbd1279607fb228e0ab649bb41fe" @@ -2959,14 +3181,7 @@ glob2base@^0.0.12: dependencies: find-index "^0.1.1" -glob@3.2.11, glob@3.x: - version "3.2.11" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" - dependencies: - inherits "2" - minimatch "0.3" - -glob@3.2.3: +glob@3.2.3, glob@3.x: version "3.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.3.tgz#e313eeb249c7affaa5c475286b0e115b59839467" dependencies: @@ -2974,7 +3189,7 @@ glob@3.2.3: inherits "2" minimatch "~0.2.11" -glob@5.x, glob@^5.0.10, glob@^5.0.15: +glob@5.x, glob@^5.0.1, glob@^5.0.10, glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" dependencies: @@ -3005,13 +3220,13 @@ glob@^4, glob@^4.3.1: once "^1.3.0" glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.2" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" @@ -3048,9 +3263,13 @@ global-prefix@^0.1.4: is-windows "^0.2.0" which "^1.2.12" +globals@^6.4.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" + globals@^9.0.0, globals@^9.14.0: - version "9.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" globby@^5.0.0: version "5.0.0" @@ -3083,7 +3302,7 @@ graceful-fs@^3.0.0, graceful-fs@~3.0.2: dependencies: natives "^1.1.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3209,17 +3428,6 @@ gulp-match@^1.0.3: dependencies: minimatch "^3.0.3" -gulp-mocha@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-2.2.0.tgz#1ce5eba4b94b40c7436afec3c4982c8eea894192" - dependencies: - gulp-util "^3.0.0" - mocha "^2.0.1" - plur "^2.1.0" - resolve-from "^1.0.0" - temp "^0.8.3" - through "^2.3.4" - gulp-optimize-js@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/gulp-optimize-js/-/gulp-optimize-js-1.1.0.tgz#5fd15c68b36f6e1e7387784f8578435f75696245" @@ -3376,8 +3584,8 @@ handlebars@^3.0.0, handlebars@^3.0.3: uglify-js "~2.3" handlebars@^4.0.1: - version "4.0.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.8.tgz#22b875cd3f0e6cbea30314f144e82bc7a72ff420" + version "4.0.10" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" dependencies: async "^1.4.0" optimist "^0.6.1" @@ -3432,6 +3640,10 @@ has-binary@0.1.7: dependencies: isarray "0.0.1" +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" @@ -3498,6 +3710,13 @@ hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" +home-or-tmp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" + dependencies: + os-tmpdir "^1.0.1" + user-home "^1.1.1" + home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -3505,7 +3724,7 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -home-path@^1.0.3: +home-path@^1.0.3, home-path@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.5.tgz#788b29815b12d53bacf575648476e6f9041d133f" @@ -3519,6 +3738,16 @@ hosted-git-info@^2.1.4: version "2.4.2" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" +htmlparser2@3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + http-errors@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" @@ -3578,6 +3807,10 @@ https-proxy-agent@1, https-proxy-agent@1.0.0: debug "2" extend "3" +i@0.3.x: + version "0.3.5" + resolved "https://registry.yarnpkg.com/i/-/i-0.3.5.tgz#1d2b854158ec8169113c6cb7f6b6801e99e211d5" + ibrik@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ibrik/-/ibrik-2.0.0.tgz#89a2434f2a5c82b92166c3d97de3b5636eea2e9c" @@ -3609,8 +3842,8 @@ ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" ignore@^3.0.11, ignore@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.0.tgz#3812d22cbe9125f2c2b4915755a1b8abd745a001" + version "3.3.3" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" imurmurhash@^0.1.4: version "0.1.4" @@ -3633,6 +3866,10 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" +inherit@^2.2.2: + version "2.2.6" + resolved "https://registry.yarnpkg.com/inherit/-/inherit-2.2.6.tgz#f1614b06c8544e8128e4229c86347db73ad9788d" + inherits@1: version "1.0.2" resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" @@ -3702,10 +3939,6 @@ ip@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" -irregular-plurals@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.2.0.tgz#38f299834ba8c00c30be9c554e137269752ff3ac" - is-absolute@^0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" @@ -3734,8 +3967,8 @@ is-builtin-module@^1.0.0: builtin-modules "^1.0.0" is-dotfile@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" is-equal-shallow@^0.1.3: version "0.1.3" @@ -3777,6 +4010,12 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" +is-integer@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.7.tgz#6bde81aacddf78b659b6629d629cadc51a886d5c" + dependencies: + is-finite "^1.0.0" + is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.0, is-my-json-valid@^2.12.4: version "2.16.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" @@ -3884,7 +4123,7 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" -isstream@~0.1.1, isstream@~0.1.2: +isstream@0.1.x, isstream@~0.1.1, isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -3927,11 +4166,9 @@ jade@0.26.3: commander "0.6.1" mkdirp "0.3.0" -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" +js-tokens@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" js-tokens@^3.0.0: version "3.0.1" @@ -3944,6 +4181,14 @@ js-yaml@3.6.1, js-yaml@3.x, js-yaml@^3.5.1: argparse "^1.0.7" esprima "^2.6.0" +js-yaml@~3.4.0: + version "3.4.6" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.4.6.tgz#6be1b23f6249f53d293370fd4d1aaa63ce1b4eb0" + dependencies: + argparse "^1.0.2" + esprima "^2.6.0" + inherit "^2.2.2" + js2xmlparser@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-1.0.0.tgz#5a170f2e8d6476ce45405e04823242513782fe30" @@ -3952,6 +4197,50 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jscs-jsdoc@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/jscs-jsdoc/-/jscs-jsdoc-1.3.2.tgz#1f2c82b6ab4b97524da958f46b4e562e0305f9a7" + dependencies: + comment-parser "^0.3.1" + jsdoctypeparser "~1.2.0" + +jscs-preset-wikimedia@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.0.tgz#fff563342038fc2e8826b7bb7309c3ae3406fc7e" + +jscs@^2.1.1: + version "2.11.0" + resolved "https://registry.yarnpkg.com/jscs/-/jscs-2.11.0.tgz#6e11ef0caaa07731f9dcc2b2b27d8ecee1ddbcb6" + dependencies: + babel-jscs "^2.0.0" + chalk "~1.1.0" + cli-table "~0.3.1" + commander "~2.9.0" + escope "^3.2.0" + esprima "~2.7.0" + estraverse "^4.1.0" + exit "~0.1.2" + glob "^5.0.1" + htmlparser2 "3.8.3" + js-yaml "~3.4.0" + jscs-jsdoc "^1.3.1" + jscs-preset-wikimedia "~1.0.0" + jsonlint "~1.6.2" + lodash "~3.10.0" + minimatch "~3.0.0" + natural-compare "~1.2.2" + pathval "~0.1.1" + prompt "~0.2.14" + reserved-words "^0.1.1" + resolve "^1.1.6" + strip-bom "^2.0.0" + strip-json-comments "~1.0.2" + to-double-quotes "^2.0.0" + to-single-quotes "^2.0.0" + vow "~0.4.8" + vow-fs "~0.3.4" + xmlbuilder "^3.1.0" + jsdoc-75lb@^3.5.6: version "3.6.0" resolved "https://registry.yarnpkg.com/jsdoc-75lb/-/jsdoc-75lb-3.6.0.tgz#a807119528b4009ccbcab49b7522f63fec6cd0bd" @@ -4024,6 +4313,12 @@ jsdoc2md-stats@^1.0.3: app-usage-stats "^0.4.0" feature-detect-es6 "^1.3.1" +jsdoctypeparser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz#e7dedc153a11849ffc5141144ae86a7ef0c25392" + dependencies: + lodash "^3.7.0" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -4054,6 +4349,10 @@ json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" +json5@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" + json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -4072,6 +4371,13 @@ jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" +jsonlint@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/jsonlint/-/jsonlint-1.6.2.tgz#5737045085f55eb455c68b1ff4ebc01bd50e8830" + dependencies: + JSV ">= 4.0.x" + nomnom ">= 1.5.x" + jsonpointer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" @@ -4265,6 +4571,10 @@ lcov-parse@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" +leven@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -4307,6 +4617,15 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.5, loader-utils@~0.2.2, loader-utils@~0.2.3, loader-utils@~0.2.5: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" @@ -4325,6 +4644,13 @@ localtunnel@^1.3.0: request "2.78.0" yargs "3.29.0" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + lodash._arraycopy@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" @@ -4379,6 +4705,14 @@ lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + lodash._escapehtmlchar@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" @@ -4638,7 +4972,7 @@ lodash@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.5.0.tgz#19bb3f4d51278f0b8c818ed145c74ecf9fe40e6d" -lodash@^3.10.1, lodash@^3.3.1, lodash@^3.5.0, lodash@^3.8.0: +lodash@^3.10.0, lodash@^3.10.1, lodash@^3.3.1, lodash@^3.5.0, lodash@^3.7.0, lodash@^3.8.0, lodash@^3.9.3, lodash@~3.10.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" @@ -4791,13 +5125,13 @@ merge-stream@^1.0.0: readable-stream "^2.0.1" method-override@~2.3.5: - version "2.3.8" - resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.8.tgz#178234bf4bab869f89df9444b06fc6147b44828c" + version "2.3.9" + resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.9.tgz#bd151f2ce34cf01a76ca400ab95c012b102d8f71" dependencies: - debug "2.6.3" + debug "2.6.8" methods "~1.1.2" parseurl "~1.3.1" - vary "~1.1.0" + vary "~1.1.1" methods@~1.1.2: version "1.1.2" @@ -4857,20 +5191,20 @@ mime@~1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" -minimatch@0.3, minimatch@0.x, minimatch@~0.3.0: +minimatch@0.x, minimatch@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" dependencies: lru-cache "2" sigmund "~1.0.0" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: brace-expansion "^1.1.7" -minimatch@2.x, minimatch@^2.0.1: +minimatch@2.x, minimatch@^2.0.1, minimatch@^2.0.3: version "2.0.10" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" dependencies: @@ -4901,7 +5235,7 @@ minimist@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" -mkdirp2@^1.0.2: +mkdirp2@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/mkdirp2/-/mkdirp2-1.0.3.tgz#cc8dd8265f1f06e2d8f5b10b6e52f4e050bed21b" @@ -4913,7 +5247,7 @@ mkdirp@0.3.x, mkdirp@~0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" -mkdirp@0.5, mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -4958,21 +5292,6 @@ mocha@^1.21.4: jade "0.26.3" mkdirp "0.5.0" -mocha@^2.0.1: - version "2.5.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" - dependencies: - commander "2.3.0" - debug "2.2.0" - diff "1.4.0" - escape-string-regexp "1.0.2" - glob "3.2.11" - growl "1.9.2" - jade "0.26.3" - mkdirp "0.5.1" - supports-color "1.2.0" - to-iso-string "0.0.2" - mock-fs@^3.11.0: version "3.12.1" resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-3.12.1.tgz#ff27824cd6ab263a7eb05a115239d41d3631f5f8" @@ -5006,9 +5325,9 @@ ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" -ms@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" mu2@~0.5.19: version "0.5.21" @@ -5031,7 +5350,7 @@ mute-stream@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.4.tgz#a9219960a6d5d5d046597aee51252c6655f7177e" -mute-stream@0.0.5: +mute-stream@0.0.5, mute-stream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" @@ -5047,7 +5366,11 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" -ncp@~0.4.2: +natural-compare@~1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.2.2.tgz#1f96d60e3141cac1b6d05653ce0daeac763af6aa" + +ncp@0.4.x, ncp@~0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" @@ -5111,8 +5434,8 @@ node-libs-browser@^0.7.0: vm-browserify "0.0.4" node-pre-gyp@^0.6.29: - version "0.6.34" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" dependencies: mkdirp "^0.5.1" nopt "^4.0.1" @@ -5128,6 +5451,13 @@ node-uuid@~1.4.0, node-uuid@~1.4.7: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" +"nomnom@>= 1.5.x": + version "1.8.1" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" + dependencies: + chalk "~0.4.0" + underscore "~1.6.0" + nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -5357,10 +5687,28 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + "over@>= 0.0.5 < 1": version "0.0.5" resolved "https://registry.yarnpkg.com/over/-/over-0.0.5.tgz#f29852e70fd7e25f360e013a8ec44c82aedb5708" +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + pac-proxy-agent@1: version "1.0.0" resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-1.0.0.tgz#dcd5b746581367430a236e88eacfd4e5b8d068a5" @@ -5442,12 +5790,20 @@ path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" +path-exists@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" dependencies: pinkie-promise "^2.0.0" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -5478,6 +5834,16 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pathval@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-0.1.1.tgz#08f911cdca9cce5942880da7817bc0b723b66d82" + pause-stream@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" @@ -5533,17 +5899,13 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" -pkg-up@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" - dependencies: - find-up "^1.0.0" +pkginfo@0.3.x: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" -plur@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" - dependencies: - irregular-plurals "^1.0.0" +pkginfo@0.x.x: + version "0.4.0" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.0.tgz#349dbb7ffd38081fcadc0853df687f0c7744cd65" pluralize@^1.2.1: version "1.2.1" @@ -5587,6 +5949,16 @@ promise.prototype.finally@^1.0.1: dependencies: asap "~2.0.3" +prompt@~0.2.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/prompt/-/prompt-0.2.14.tgz#57754f64f543fd7b0845707c818ece618f05ffdc" + dependencies: + pkginfo "0.x.x" + read "1.0.x" + revalidator "0.1.x" + utile "0.2.x" + winston "0.8.x" + proxy-agent@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-2.0.0.tgz#57eb5347aa805d74ec681cb25649dba39c933499" @@ -5740,6 +6112,13 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -5748,7 +6127,21 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@1.1.x, readable-stream@~1.1.8, readable-stream@~1.1.9: +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read@1.0.x: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + dependencies: + mute-stream "~0.0.4" + +readable-stream@1.1, readable-stream@1.1.x, readable-stream@~1.1.8, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" dependencies: @@ -5757,15 +6150,15 @@ readable-stream@1.1.x, readable-stream@~1.1.8, readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@2, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6: - version "2.2.9" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" +readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6: + version "2.2.11" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.11.tgz#0796b31f8d7688007ff0b93a8088d34aa17c0f72" dependencies: - 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" + safe-buffer "~5.0.1" string_decoder "~1.0.0" util-deprecate "~1.0.1" @@ -5813,7 +6206,7 @@ readline2@^1.0.1: is-fullwidth-code-point "^1.0.0" mute-stream "0.0.5" -recast@0.10.33: +recast@0.10.33, recast@^0.10.10: version "0.10.33" resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" dependencies: @@ -5872,10 +6265,6 @@ regenerator-runtime@^0.10.0: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" -regenerator-runtime@~0.9.5: - version "0.9.6" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" - regenerator-transform@0.9.11: version "0.9.11" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" @@ -5884,16 +6273,15 @@ regenerator-transform@0.9.11: babel-types "^6.19.0" private "^0.1.6" -regenerator@~0.8.13: - version "0.8.46" - resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.46.tgz#154c327686361ed52cad69b2545efc53a3d07696" +regenerator@0.8.40, regenerator@~0.8.13: + version "0.8.40" + resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8" dependencies: commoner "~0.10.3" defs "~1.1.0" esprima-fb "~15001.1001.0-dev-harmony-fb" private "~0.1.5" recast "0.10.33" - regenerator-runtime "~0.9.5" through "~2.3.8" regex-cache@^0.4.2: @@ -5911,6 +6299,16 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +regexpu@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d" + dependencies: + esprima "^2.6.0" + recast "^0.10.10" + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -5922,8 +6320,8 @@ regjsparser@^0.1.4: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + version "1.0.2" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" repeat-element@^1.1.2: version "1.1.2" @@ -5937,6 +6335,12 @@ repeat-string@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" +repeating@^1.1.0, repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" @@ -5957,7 +6361,7 @@ replacestream@0.1.3: dependencies: through "~2.3.4" -req-then@^0.5.1: +req-then@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/req-then/-/req-then-0.5.1.tgz#31c6e0b56f4ddd2acd6de0ba1bcea77b6079dfdf" dependencies: @@ -6148,6 +6552,10 @@ requizzle@~0.2.1: dependencies: underscore "~1.6.0" +reserved-words@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.1.tgz#6f7c15e5e5614c50da961630da46addc87c0cef2" + resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" @@ -6187,6 +6595,10 @@ restore-cursor@^1.0.1: exit-hook "^1.0.0" onetime "^1.0.0" +revalidator@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" + rewire@2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/rewire/-/rewire-2.5.2.tgz#6427de7b7feefa7d36401507eb64a5385bc58dc7" @@ -6201,7 +6613,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.1, rimraf@^2.6.1: +rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.1, rimraf@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: @@ -6211,7 +6623,7 @@ rimraf@2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.6.tgz#c59597569b14d956ad29cacc42bdddf5f0ea4f4c" -rimraf@~2.2.0, rimraf@~2.2.6: +rimraf@~2.2.0: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -6237,7 +6649,7 @@ rx@^2.4.3: version "2.5.3" resolved "https://registry.yarnpkg.com/rx/-/rx-2.5.3.tgz#21adc7d80f02002af50dae97fd9dbf248755f566" -safe-buffer@^5.0.1: +safe-buffer@^5.0.1, safe-buffer@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" @@ -6340,9 +6752,13 @@ sha.js@2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + shelljs@^0.7.5: - version "0.7.7" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" + version "0.7.8" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -6448,8 +6864,8 @@ socket.io@^1.4.5: socket.io-parser "2.3.1" socks-proxy-agent@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-2.0.0.tgz#c674842d70410fb28ae1e92e6135a927854bc275" + version "2.1.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-2.1.0.tgz#ddfb01b5dbea5fc879490ca38a25fe87d3d15912" dependencies: agent-base "2" extend "3" @@ -6483,6 +6899,12 @@ source-map-resolve@^0.3.0: source-map-url "~0.3.0" urix "~0.1.0" +source-map-support@^0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" + dependencies: + source-map "0.1.32" + source-map-support@^0.4.2: version "0.4.15" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" @@ -6493,6 +6915,12 @@ source-map-url@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" +source-map@0.1.32: + version "0.1.32" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" + dependencies: + amdefine ">=0.0.4" + source-map@^0.1.38, source-map@^0.1.40, source-map@^0.1.41, source-map@~0.1.38, source-map@~0.1.7: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" @@ -6550,8 +6978,8 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -6560,7 +6988,6 @@ sshpk@^1.7.0: optionalDependencies: bcrypt-pbkdf "^1.0.0" ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" jsbn "~0.1.0" tweetnacl "~0.14.0" @@ -6568,6 +6995,10 @@ stable@~0.1.3: version "0.1.6" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.6.tgz#910f5d2aed7b520c6e777499c1f32e139fdecb10" +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + statuses@1, "statuses@>= 1.3.1 < 2", statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -6637,8 +7068,8 @@ stream-to@~0.2.0: resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d" stream-via@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/stream-via/-/stream-via-1.0.3.tgz#cebd32a5a59d74b3b68e3404942e867184ad4ac9" + version "1.0.4" + resolved "https://registry.yarnpkg.com/stream-via/-/stream-via-1.0.4.tgz#8dccbb0ac909328eb8bc8e2a4bd3934afdaf606c" stream-via@~0.1.0: version "0.1.1" @@ -6682,10 +7113,10 @@ string_decoder@^0.10.25, string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" string_decoder@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" + version "1.0.2" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.2.tgz#b29e1f4e1125fa97a10382b8a533737b7491e179" dependencies: - buffer-shims "~1.0.0" + safe-buffer "~5.0.1" stringmap@~0.2.2: version "0.2.2" @@ -6717,6 +7148,10 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + strip-bom@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" @@ -6740,6 +7175,10 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" +strip-json-comments@~1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -6750,10 +7189,6 @@ style-loader@^0.8.3: dependencies: loader-utils "^0.2.5" -supports-color@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" - supports-color@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" @@ -6842,13 +7277,6 @@ temp-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-path/-/temp-path-1.0.0.tgz#24b1543973ab442896d9ad367dd9cbdbfafe918b" -temp@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" - ternary-stream@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.0.1.tgz#064e489b4b5bf60ba6a6b7bc7f2f5c274ecf8269" @@ -6918,7 +7346,7 @@ through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: readable-stream "^2.1.5" xtend "~4.0.1" -through@2, through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: +through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -6967,13 +7395,17 @@ to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" -to-fast-properties@^1.0.1: +to-double-quotes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-double-quotes/-/to-double-quotes-2.0.0.tgz#aaf231d6fa948949f819301bbab4484d8588e4a7" + +to-fast-properties@^1.0.0, to-fast-properties@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" -to-iso-string@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" +to-single-quotes@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/to-single-quotes/-/to-single-quotes-2.0.1.tgz#7cc29151f0f5f2c41946f119f5932fe554170125" tough-cookie@>=0.12.0, tough-cookie@~2.3.0: version "2.3.2" @@ -6993,10 +7425,14 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" -trim-right@^1.0.1: +trim-right@^1.0.0, trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" +try-resolve@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912" + tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" @@ -7041,7 +7477,7 @@ type-detect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" -type-is@~1.6.10, type-is@~1.6.14, type-is@~1.6.6: +type-is@~1.6.10, type-is@~1.6.15, type-is@~1.6.6: version "1.6.15" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" dependencies: @@ -7052,9 +7488,9 @@ typedarray@^0.0.6, typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typical@^2.1, typical@^2.2, typical@^2.3.0, typical@^2.4.2, typical@^2.5.0, typical@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.0.tgz#89d51554ab139848a65bcc2c8772f8fb450c40ed" +typical@^2.1, typical@^2.2, typical@^2.3.0, typical@^2.4.2, typical@^2.5.0, typical@^2.6.0, typical@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" uglify-js@2.4.6: version "2.4.6" @@ -7066,8 +7502,8 @@ uglify-js@2.4.6: uglify-to-browserify "~1.0.0" uglify-js@^2.6, uglify-js@^2.8.10: - version "2.8.26" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.26.tgz#3a1db8ae0a0aba7f92e1ddadadbd0293d549f90e" + version "2.8.28" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.28.tgz#e335032df9bb20dcb918f164589d5af47f38834a" dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -7182,18 +7618,18 @@ url@~0.10.3: querystring "0.2.0" usage-stats@^0.8.2: - version "0.8.5" - resolved "https://registry.yarnpkg.com/usage-stats/-/usage-stats-0.8.5.tgz#5054336ba78b14b8d8f9399fd699708f5cecff69" + version "0.8.6" + resolved "https://registry.yarnpkg.com/usage-stats/-/usage-stats-0.8.6.tgz#ec92559f648845c2021cbf5b4adea17af7513830" dependencies: - array-back "^1.0.3" + array-back "^1.0.4" cli-commands "0.1.0" core-js "^2.4.1" feature-detect-es6 "^1.3.1" - home-path "^1.0.3" - mkdirp2 "^1.0.2" - req-then "^0.5.1" - typical "^2.6.0" - uuid "^3.0.0" + home-path "^1.0.5" + mkdirp2 "^1.0.3" + req-then "0.5.1" + typical "^2.6.1" + uuid "^3.0.1" user-home@^1.1.1: version "1.1.1" @@ -7222,11 +7658,26 @@ util@0.10.3, "util@>=0.10.3 <1", util@^0.10.3: dependencies: inherits "2.0.1" +utile@0.2.x: + version "0.2.1" + resolved "https://registry.yarnpkg.com/utile/-/utile-0.2.1.tgz#930c88e99098d6220834c356cbd9a770522d90d7" + dependencies: + async "~0.2.9" + deep-equal "*" + i "0.3.x" + mkdirp "0.x.x" + ncp "0.4.x" + rimraf "2.x.x" + utils-merge@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" -uuid@^3.0.0: +uuid@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0, uuid@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" @@ -7251,7 +7702,7 @@ vary@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10" -vary@~1.1.0: +vary@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" @@ -7339,6 +7790,25 @@ void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" +vow-fs@~0.3.4: + version "0.3.6" + resolved "https://registry.yarnpkg.com/vow-fs/-/vow-fs-0.3.6.tgz#2d4c59be22e2bf2618ddf597ab4baa923be7200d" + dependencies: + glob "^7.0.5" + uuid "^2.0.2" + vow "^0.4.7" + vow-queue "^0.4.1" + +vow-queue@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/vow-queue/-/vow-queue-0.4.2.tgz#e7fe17160e15c7c4184d1b666a9bc64e18e30184" + dependencies: + vow "~0.4.0" + +vow@^0.4.7, vow@~0.4.0, vow@~0.4.8: + version "0.4.16" + resolved "https://registry.yarnpkg.com/vow/-/vow-0.4.16.tgz#bb9d54d938d5f80520d658a740e7a895e30feeeb" + walk-back@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/walk-back/-/walk-back-2.0.1.tgz#554e2a9d874fac47a8cb006bf44c2f0c4998a0a4" @@ -7485,6 +7955,18 @@ window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" +winston@0.8.x: + version "0.8.3" + resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0" + dependencies: + async "0.2.x" + colors "0.6.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" @@ -7548,7 +8030,7 @@ wtf-8@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" -xmlbuilder@3.1.0: +xmlbuilder@3.1.0, xmlbuilder@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-3.1.0.tgz#2c86888f2d4eade850fa38ca7f7223f7209516e1" dependencies: From c2cf3fa1891f020dab99afb8b7428a76a5058ee5 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 8 Jun 2017 10:15:19 -0600 Subject: [PATCH 019/111] adblade bid adapter converted to module --- adapters.json | 1 - .../adblade.js => modules/adbladeBidAdapter.js | 11 +++++++---- .../adbladeBidAdapter_spec.js} | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/adblade.js => modules/adbladeBidAdapter.js (92%) rename test/spec/{adapters/adblade_spec.js => modules/adbladeBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 001503c91fc..3d36787d5a3 100644 --- a/adapters.json +++ b/adapters.json @@ -1,5 +1,4 @@ [ - "adblade", "adbund", "adbutler", "adequant", diff --git a/src/adapters/adblade.js b/modules/adbladeBidAdapter.js similarity index 92% rename from src/adapters/adblade.js rename to modules/adbladeBidAdapter.js index 9e781561dc3..ab0a7a83cb3 100644 --- a/src/adapters/adblade.js +++ b/modules/adbladeBidAdapter.js @@ -1,7 +1,8 @@ -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); /** * Adapter for requesting bids from Adblade @@ -129,4 +130,6 @@ var AdbladeAdapter = function AdbladeAdapter() { }; }; +adaptermanager.registerBidAdapter(new AdbladeAdapter, 'adblade'); + module.exports = AdbladeAdapter; diff --git a/test/spec/adapters/adblade_spec.js b/test/spec/modules/adbladeBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/adblade_spec.js rename to test/spec/modules/adbladeBidAdapter_spec.js index db5155a7d79..c66bfe70d3f 100644 --- a/test/spec/adapters/adblade_spec.js +++ b/test/spec/modules/adbladeBidAdapter_spec.js @@ -1,5 +1,5 @@ import {expect} from 'chai'; -import Adapter from '../../../src/adapters/adblade'; +import Adapter from '../../../modules/adbladeBidAdapter'; import bidManager from '../../../src/bidmanager'; import adLoader from '../../../src/adloader'; From 2bbb28fea0ee8c1d79ec797d9a6caf94a16eddda Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 8 Jun 2017 10:21:18 -0600 Subject: [PATCH 020/111] adblund bid adapter converted to module --- adapters.json | 1 - .../adbund.js => modules/adbundBidAdapter.js | 13 ++++++++----- .../adbundBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) rename src/adapters/adbund.js => modules/adbundBidAdapter.js (83%) rename test/spec/{adapters/adbund_spec.js => modules/adbundBidAdapter_spec.js} (97%) diff --git a/adapters.json b/adapters.json index 3d36787d5a3..6df6402fb76 100644 --- a/adapters.json +++ b/adapters.json @@ -1,5 +1,4 @@ [ - "adbund", "adbutler", "adequant", "adform", diff --git a/src/adapters/adbund.js b/modules/adbundBidAdapter.js similarity index 83% rename from src/adapters/adbund.js rename to modules/adbundBidAdapter.js index 19630ce7007..a7c2bd45257 100644 --- a/src/adapters/adbund.js +++ b/modules/adbundBidAdapter.js @@ -1,8 +1,9 @@ -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); var adBundAdapter = function adBundAdapter() { var timezone = (new Date()).getTimezoneOffset(); @@ -63,4 +64,6 @@ var adBundAdapter = function adBundAdapter() { }; }; +adaptermanager.registerBidAdapter(new adBundAdapter, 'adbund'); + module.exports = adBundAdapter; diff --git a/test/spec/adapters/adbund_spec.js b/test/spec/modules/adbundBidAdapter_spec.js similarity index 97% rename from test/spec/adapters/adbund_spec.js rename to test/spec/modules/adbundBidAdapter_spec.js index 868b9a9258d..9ee9e9ccfe7 100644 --- a/test/spec/adapters/adbund_spec.js +++ b/test/spec/modules/adbundBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import Adapter from '../../../src/adapters/adbund'; +import Adapter from '../../../modules/adbundBidAdapter'; import bidManager from 'src/bidmanager'; import CONSTANTS from 'src/constants.json'; From 4ffd8a158c4b7c5906b7f51dab01cbec5a5e0c0e Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 8 Jun 2017 10:26:48 -0600 Subject: [PATCH 021/111] adbutler bid adapter converted to module --- adapters.json | 1 - .../adbutler.js => modules/adbutlerBidAdapter.js | 11 +++++++---- .../adbutlerBidAdapter_spec.js} | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/adbutler.js => modules/adbutlerBidAdapter.js (93%) rename test/spec/{adapters/adbutler_spec.js => modules/adbutlerBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 6df6402fb76..fec6d256258 100644 --- a/adapters.json +++ b/adapters.json @@ -1,5 +1,4 @@ [ - "adbutler", "adequant", "adform", "adkernel", diff --git a/src/adapters/adbutler.js b/modules/adbutlerBidAdapter.js similarity index 93% rename from src/adapters/adbutler.js rename to modules/adbutlerBidAdapter.js index 428f7b3831a..8fbbba305ac 100644 --- a/src/adapters/adbutler.js +++ b/modules/adbutlerBidAdapter.js @@ -5,10 +5,11 @@ 'use strict'; -var utils = require('../utils.js'); -var adloader = require('../adloader.js'); -var bidmanager = require('../bidmanager.js'); -var bidfactory = require('../bidfactory.js'); +var utils = require('src/utils.js'); +var adloader = require('src/adloader.js'); +var bidmanager = require('src/bidmanager.js'); +var bidfactory = require('src/bidfactory.js'); +var adaptermanager = require('src/adaptermanager'); var AdButlerAdapter = function AdButlerAdapter() { function _callBids(params) { @@ -138,4 +139,6 @@ var AdButlerAdapter = function AdButlerAdapter() { }; }; +adaptermanager.registerBidAdapter(new AdButlerAdapter, 'adbutler'); + module.exports = AdButlerAdapter; diff --git a/test/spec/adapters/adbutler_spec.js b/test/spec/modules/adbutlerBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/adbutler_spec.js rename to test/spec/modules/adbutlerBidAdapter_spec.js index ed08fb1888a..985014d767c 100644 --- a/test/spec/adapters/adbutler_spec.js +++ b/test/spec/modules/adbutlerBidAdapter_spec.js @@ -1,6 +1,6 @@ describe('adbutler adapter tests', function () { var expect = require('chai').expect; - var adapter = require('src/adapters/adbutler'); + var adapter = require('modules/adbutlerBidAdapter'); var adLoader = require('src/adloader'); var bidmanager = require('src/bidmanager'); From 2ea4c7a942af3ebb25ff4b472bec58ee3b06c258 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 8 Jun 2017 10:54:22 -0600 Subject: [PATCH 022/111] adequant bid adapter converted to module --- adapters.json | 1 - .../adequantBidAdapter.js | 19 ++++++++++++------- test/spec/unit/pbjs_api_spec.js | 5 +++-- 3 files changed, 15 insertions(+), 10 deletions(-) rename src/adapters/adequant.js => modules/adequantBidAdapter.js (85%) diff --git a/adapters.json b/adapters.json index fec6d256258..9509cfdac4a 100644 --- a/adapters.json +++ b/adapters.json @@ -1,5 +1,4 @@ [ - "adequant", "adform", "adkernel", "admedia", diff --git a/src/adapters/adequant.js b/modules/adequantBidAdapter.js similarity index 85% rename from src/adapters/adequant.js rename to modules/adequantBidAdapter.js index f756b7e9aaa..b45b976ac28 100644 --- a/src/adapters/adequant.js +++ b/modules/adequantBidAdapter.js @@ -1,10 +1,11 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); -var utils = require('../utils.js'); -var CONSTANTS = require('../constants.json'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var utils = require('src/utils.js'); +var CONSTANTS = require('src/constants.json'); +var adaptermanager = require('src/adaptermanager'); -module.exports = function() { +function AdequantAdapter() { var req_url_base = 'https://rex.adequant.com/rex/c2s_prebid?'; function _callBids(params) { @@ -70,4 +71,8 @@ module.exports = function() { return { callBids: _callBids }; -}; +} + +adaptermanager.registerBidAdapter(new AdequantAdapter, 'adequant'); + +module.exports = AdequantAdapter; diff --git a/test/spec/unit/pbjs_api_spec.js b/test/spec/unit/pbjs_api_spec.js index 3f0e00e3851..d4a0f5a5fa0 100644 --- a/test/spec/unit/pbjs_api_spec.js +++ b/test/spec/unit/pbjs_api_spec.js @@ -23,8 +23,9 @@ var events = require('src/events'); var adserver = require('src/adserver'); var CONSTANTS = require('src/constants.json'); -// The native tests expect a native adapter to be registered. So this is being included here for now. -var appnexusAstBidAdapter = require('modules/appnexusAstBidAdapter'); +// These bid adapters are required to be loaded for the following tests to work +require('modules/appnexusAstBidAdapter'); +require('modules/adequantBidAdapter'); var config = require('test/fixtures/config.json'); From 7dec65b8dc380b62f3e08b9eee57da2fe4fc7018 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 8 Jun 2017 10:57:59 -0600 Subject: [PATCH 023/111] adform bid adapter converted to module --- adapters.json | 1 - .../adform.js => modules/adformBidAdapter.js | 13 ++++++++----- .../adformBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) rename src/adapters/adform.js => modules/adformBidAdapter.js (92%) rename test/spec/{adapters/adform_spec.js => modules/adformBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 9509cfdac4a..1b4989a6ffd 100644 --- a/adapters.json +++ b/adapters.json @@ -1,5 +1,4 @@ [ - "adform", "adkernel", "admedia", "adyoulike", diff --git a/src/adapters/adform.js b/modules/adformBidAdapter.js similarity index 92% rename from src/adapters/adform.js rename to modules/adformBidAdapter.js index 31eceba0b0d..7f7cc13d059 100644 --- a/src/adapters/adform.js +++ b/modules/adformBidAdapter.js @@ -1,8 +1,9 @@ -var utils = require('../utils.js'); -var adloader = require('../adloader.js'); -var bidmanager = require('../bidmanager.js'); -var bidfactory = require('../bidfactory.js'); -var STATUSCODES = require('../constants.json').STATUS; +var utils = require('src/utils.js'); +var adloader = require('src/adloader.js'); +var bidmanager = require('src/bidmanager.js'); +var bidfactory = require('src/bidfactory.js'); +var STATUSCODES = require('src/constants.json').STATUS; +var adaptermanager = require('src/adaptermanager'); function AdformAdapter() { return { @@ -161,4 +162,6 @@ function AdformAdapter() { } } +adaptermanager.registerBidAdapter(new AdformAdapter, 'adform'); + module.exports = AdformAdapter; diff --git a/test/spec/adapters/adform_spec.js b/test/spec/modules/adformBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/adform_spec.js rename to test/spec/modules/adformBidAdapter_spec.js index df97cd7bc82..0d2d1e19b68 100644 --- a/test/spec/adapters/adform_spec.js +++ b/test/spec/modules/adformBidAdapter_spec.js @@ -2,7 +2,7 @@ import { assert } from 'chai'; import * as utils from '../../../src/utils'; import adLoader from '../../../src/adloader'; import bidManager from '../../../src/bidmanager'; -import adapter from '../../../src/adapters/adform'; +import adapter from '../../../modules/adformBidAdapter'; describe('Adform adapter', () => { let _adapter, sandbox; From 73ac2ffd8411a699e48f0e7daf1e246d89d48cbb Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 8 Jun 2017 11:02:00 -0600 Subject: [PATCH 024/111] adkernel bid adapter converted to module --- adapters.json | 1 - src/adapters/adkernel.js => modules/adkernelBidAdapter.js | 3 +++ .../adkernel_spec.js => modules/adkernelBidAdapter_spec.js} | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) rename src/adapters/adkernel.js => modules/adkernelBidAdapter.js (98%) rename test/spec/{adapters/adkernel_spec.js => modules/adkernelBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 1b4989a6ffd..ac14c551e45 100644 --- a/adapters.json +++ b/adapters.json @@ -1,5 +1,4 @@ [ - "adkernel", "admedia", "adyoulike", "bidfluence", diff --git a/src/adapters/adkernel.js b/modules/adkernelBidAdapter.js similarity index 98% rename from src/adapters/adkernel.js rename to modules/adkernelBidAdapter.js index 32415bcba41..916a8dcf46c 100644 --- a/src/adapters/adkernel.js +++ b/modules/adkernelBidAdapter.js @@ -3,6 +3,7 @@ import bidfactory from 'src/bidfactory'; import * as utils from 'src/utils'; import {ajax} from 'src/ajax'; import Adapter from 'src/adapters/adapter'; +import adaptermanager from 'src/adaptermanager'; /** * Adapter for requesting bids from AdKernel white-label platform @@ -267,4 +268,6 @@ AdKernelAdapter.createNew = function() { return new AdKernelAdapter(); }; +adaptermanager.registerBidAdapter(new AdKernelAdapter, 'adkernel'); + module.exports = AdKernelAdapter; diff --git a/test/spec/adapters/adkernel_spec.js b/test/spec/modules/adkernelBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/adkernel_spec.js rename to test/spec/modules/adkernelBidAdapter_spec.js index dd7eb82060a..031caa6996a 100644 --- a/test/spec/adapters/adkernel_spec.js +++ b/test/spec/modules/adkernelBidAdapter_spec.js @@ -1,5 +1,5 @@ import {expect} from 'chai'; -import Adapter from 'src/adapters/adkernel'; +import Adapter from 'modules/adkernelBidAdapter'; import * as ajax from 'src/ajax'; import * as utils from 'src/utils'; import bidmanager from 'src/bidmanager'; From 86673d234e605f61fdbfab97b977c812586f8c22 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 8 Jun 2017 11:14:38 -0600 Subject: [PATCH 025/111] admedia bid adapter converted to module --- adapters.json | 1 - .../admedia.js => modules/admediaBidAdapter.js | 15 +++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) rename src/adapters/admedia.js => modules/admediaBidAdapter.js (88%) diff --git a/adapters.json b/adapters.json index ac14c551e45..189f07864a2 100644 --- a/adapters.json +++ b/adapters.json @@ -1,5 +1,4 @@ [ - "admedia", "adyoulike", "bidfluence", "vertamedia", diff --git a/src/adapters/admedia.js b/modules/admediaBidAdapter.js similarity index 88% rename from src/adapters/admedia.js rename to modules/admediaBidAdapter.js index 7fb81868cfd..e933911d537 100644 --- a/src/adapters/admedia.js +++ b/modules/admediaBidAdapter.js @@ -1,9 +1,10 @@ -import { getBidRequest } from '../utils.js'; -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); -var utils = require('../utils.js'); -var CONSTANTS = require('../constants.json'); +import { getBidRequest } from 'src/utils'; +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var utils = require('src/utils.js'); +var CONSTANTS = require('src/constants.json'); +var adaptermanager = require('src/adaptermanager'); /** * Adapter for requesting bids from AdMedia. @@ -99,4 +100,6 @@ var AdmediaAdapter = function AdmediaAdapter() { }; }; +adaptermanager.registerBidAdapter(new AdmediaAdapter, 'admedia'); + module.exports = AdmediaAdapter; From 9df8bb4de32b34dc955ef3e6d27fe3bd90fd839d Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 8 Jun 2017 11:25:19 -0600 Subject: [PATCH 026/111] admixer bid adapter converted to module --- adapters.json | 3 +-- .../admixer.js => modules/admixerBidAdapter.js | 13 +++++++++---- test/spec/adapters/adsupply_spec.js | 5 ++--- .../admixerBidAdapter_spec.js} | 3 +-- 4 files changed, 13 insertions(+), 11 deletions(-) rename src/adapters/admixer.js => modules/admixerBidAdapter.js (87%) rename test/spec/{adapters/admixer_spec.js => modules/admixerBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 189f07864a2..c1db169b940 100644 --- a/adapters.json +++ b/adapters.json @@ -53,7 +53,6 @@ "roxot", "vertoz", "widespace", - "admixer", "atomx", "tapsense", "trion", @@ -93,7 +92,7 @@ }, { "admixer": { - "supportedMediaTypes": ["video"] + "supportedMediaTypes": ["video"] } }, { diff --git a/src/adapters/admixer.js b/modules/admixerBidAdapter.js similarity index 87% rename from src/adapters/admixer.js rename to modules/admixerBidAdapter.js index 24cf81bf9e9..d0b4515133a 100644 --- a/src/adapters/admixer.js +++ b/modules/admixerBidAdapter.js @@ -1,7 +1,8 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var Ajax = require('../ajax'); -var utils = require('../utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var Ajax = require('src/ajax'); +var utils = require('src/utils.js'); +var adaptermanager = require('src/adaptermanager'); /** * Adapter for requesting bids from Admixer. @@ -80,4 +81,8 @@ var AdmixerAdapter = function AdmixerAdapter() { }; }; +adaptermanager.registerBidAdapter(new AdmixerAdapter, 'admixer', { + supportedMediaTypes: ['video'] +}); + module.exports = AdmixerAdapter; diff --git a/test/spec/adapters/adsupply_spec.js b/test/spec/adapters/adsupply_spec.js index 59f7dc42d41..273d8b88361 100644 --- a/test/spec/adapters/adsupply_spec.js +++ b/test/spec/adapters/adsupply_spec.js @@ -1,4 +1,6 @@ describe('adsupply adapter tests', function () { + window.pbjs = window.pbjs || {}; + const expect = require('chai').expect; const AdSupplyAdapter = require('../../../src/adapters/adsupply'); @@ -7,9 +9,6 @@ describe('adsupply adapter tests', function () { const CONSTANTS = require('../../../src/constants.json'); let adsupplyAdapter = new AdSupplyAdapter(); - // before(() => sinon.stub(document.body, 'appendChild')); - // after(() => document.body.appendChild.restore()); - it('adsupply response handler should exist and be a function', function () { expect(pbjs.adSupplyResponseHandler).to.exist.and.to.be.a('function'); }); diff --git a/test/spec/adapters/admixer_spec.js b/test/spec/modules/admixerBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/admixer_spec.js rename to test/spec/modules/admixerBidAdapter_spec.js index 45f18ce7abc..0b66f8a9469 100644 --- a/test/spec/adapters/admixer_spec.js +++ b/test/spec/modules/admixerBidAdapter_spec.js @@ -1,6 +1,5 @@ -window.pbjs = window.pbjs || {}; var chai = require('chai'); -var Adapter = require('src/adapters/admixer')(); +var Adapter = require('modules/admixerBidAdapter')(); var Ajax = require('src/ajax'); var bidmanager = require('src/bidmanager.js'); var CONSTANTS = require('src/constants.json'); From 6dcf4100b7f5556df336740485f13ccd4ff5bf4d Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 13:10:07 -0600 Subject: [PATCH 027/111] fix pbjs global for tests so load order doesn't matter --- karma.conf.js | 6 +----- test/helpers/prebidGlobal.js | 3 +++ test/spec/adapters/adsupply_spec.js | 2 -- test/spec/adapters/atomx_spec.js | 1 - test/spec/adapters/centro_spec.js | 5 ----- test/spec/adapters/indexExchange_request_spec.js | 2 -- test/spec/adapters/indexExchange_response_spec.js | 2 +- test/spec/adapters/indexExchange_validation_spec.js | 2 -- test/spec/adapters/jcm_spec.js | 4 ---- test/spec/adapters/piximedia_spec.js | 1 - test/spec/adapters/tapsense_spec.js | 2 -- test/spec/modules/adbutlerBidAdapter_spec.js | 5 ----- 12 files changed, 5 insertions(+), 30 deletions(-) create mode 100644 test/helpers/prebidGlobal.js diff --git a/karma.conf.js b/karma.conf.js index 3751b73e4dc..96e53779321 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -41,15 +41,11 @@ module.exports = function (config) { // list of files / patterns to load in the browser files: [ + 'test/helpers/prebidGlobal.js', 'test/**/*_spec.js', 'test/helpers/karma-init.js' ], - // list of files to exclude - exclude: [ - 'test/spec/loaders/**/*.js' - ], - // preprocess matching files before serving them to the browser // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor preprocessors: { diff --git a/test/helpers/prebidGlobal.js b/test/helpers/prebidGlobal.js new file mode 100644 index 00000000000..e7ec211b2ff --- /dev/null +++ b/test/helpers/prebidGlobal.js @@ -0,0 +1,3 @@ +window.pbjs = (window.pbjs || {}); +window.pbjs.cmd = window.pbjs.cmd || []; +window.pbjs.que = window.pbjs.que || []; diff --git a/test/spec/adapters/adsupply_spec.js b/test/spec/adapters/adsupply_spec.js index 273d8b88361..74232d61715 100644 --- a/test/spec/adapters/adsupply_spec.js +++ b/test/spec/adapters/adsupply_spec.js @@ -1,6 +1,4 @@ describe('adsupply adapter tests', function () { - window.pbjs = window.pbjs || {}; - const expect = require('chai').expect; const AdSupplyAdapter = require('../../../src/adapters/adsupply'); diff --git a/test/spec/adapters/atomx_spec.js b/test/spec/adapters/atomx_spec.js index db865057d68..7f7059eb0cc 100644 --- a/test/spec/adapters/atomx_spec.js +++ b/test/spec/adapters/atomx_spec.js @@ -1,4 +1,3 @@ -window.pbjs = window.pbjs || {}; var chai = require('chai'); var Adapter = require('src/adapters/atomx')(); var Ajax = require('src/ajax'); diff --git a/test/spec/adapters/centro_spec.js b/test/spec/adapters/centro_spec.js index 73dcf287ff0..407200e781c 100644 --- a/test/spec/adapters/centro_spec.js +++ b/test/spec/adapters/centro_spec.js @@ -9,11 +9,6 @@ describe('centro adapter tests', function () { var adLoader = require('src/adloader'); var utils = require('src/utils'); - window.pbjs = window.pbjs || {}; - if (typeof (pbjs) === 'undefined') { - var pbjs = window.pbjs; - } - let stubLoadScript; beforeEach(function () { stubLoadScript = sinon.stub(adLoader, 'loadScript'); diff --git a/test/spec/adapters/indexExchange_request_spec.js b/test/spec/adapters/indexExchange_request_spec.js index df143b6476c..22756c70e7b 100644 --- a/test/spec/adapters/indexExchange_request_spec.js +++ b/test/spec/adapters/indexExchange_request_spec.js @@ -8,8 +8,6 @@ var HeaderTagRequest = '/cygnus'; var SlotThreshold = 20; var ADAPTER_CODE = 'indexExchange'; -window.pbjs = window.pbjs || {}; - describe('indexExchange adapter - Request', function () { let adapter; let sandbox; diff --git a/test/spec/adapters/indexExchange_response_spec.js b/test/spec/adapters/indexExchange_response_spec.js index 2e563b13398..ef26876eaff 100644 --- a/test/spec/adapters/indexExchange_response_spec.js +++ b/test/spec/adapters/indexExchange_response_spec.js @@ -10,7 +10,7 @@ var ADAPTER_CODE = 'indexExchange'; var DefaultValue = { dealID: 'IXDeal' }; -window.pbjs = window.pbjs || {}; + var ResponseStatus = { noBid: 'Bid returned empty or error response' }; diff --git a/test/spec/adapters/indexExchange_validation_spec.js b/test/spec/adapters/indexExchange_validation_spec.js index fbb3e05f5b0..bd5ed1c1464 100644 --- a/test/spec/adapters/indexExchange_validation_spec.js +++ b/test/spec/adapters/indexExchange_validation_spec.js @@ -7,8 +7,6 @@ var IndexUtils = require('../../helpers/index_adapter_utils.js'); var HeaderTagRequest = '/cygnus'; var ADAPTER_CODE = 'indexExchange'; -window.pbjs = window.pbjs || {}; - describe('indexExchange adapter - Validation', function () { let adapter; let sandbox; diff --git a/test/spec/adapters/jcm_spec.js b/test/spec/adapters/jcm_spec.js index 9d92fcb8e1e..22ba6c4c9af 100644 --- a/test/spec/adapters/jcm_spec.js +++ b/test/spec/adapters/jcm_spec.js @@ -9,10 +9,6 @@ describe('jcm adapter tests', function () { var adLoader = require('src/adloader'); var bidmanager = require('src/bidmanager'); - window.pbjs = window.pbjs || {}; - if (typeof (pbjs) === 'undefined') { - var pbjs = window.pbjs; - } let stubLoadScript; beforeEach(function () { diff --git a/test/spec/adapters/piximedia_spec.js b/test/spec/adapters/piximedia_spec.js index f6168390182..413d45ccf9b 100644 --- a/test/spec/adapters/piximedia_spec.js +++ b/test/spec/adapters/piximedia_spec.js @@ -10,7 +10,6 @@ describe('Piximedia adapter tests', function () { var utils = require('src/utils'); var CONSTANTS = require('src/constants.json'); - var pbjs = window.pbjs = window.pbjs || {}; let stubLoadScript; beforeEach(function () { diff --git a/test/spec/adapters/tapsense_spec.js b/test/spec/adapters/tapsense_spec.js index 162a8307443..9ae501ea7c6 100644 --- a/test/spec/adapters/tapsense_spec.js +++ b/test/spec/adapters/tapsense_spec.js @@ -4,8 +4,6 @@ import bidmanager from 'src/bidmanager'; import adloader from 'src/adloader'; import * as utils from 'src/utils'; -window.pbjs = window.pbjs || {}; - const DEFAULT_BIDDER_REQUEST = { 'bidderCode': 'tapsense', 'bidderRequestId': '141ed07a281ca3', diff --git a/test/spec/modules/adbutlerBidAdapter_spec.js b/test/spec/modules/adbutlerBidAdapter_spec.js index 985014d767c..ec7073545b2 100644 --- a/test/spec/modules/adbutlerBidAdapter_spec.js +++ b/test/spec/modules/adbutlerBidAdapter_spec.js @@ -4,11 +4,6 @@ describe('adbutler adapter tests', function () { var adLoader = require('src/adloader'); var bidmanager = require('src/bidmanager'); - window.pbjs = window.pbjs || {}; - if (typeof (pbjs) === 'undefined') { - var pbjs = window.pbjs; - } - describe('creation of bid url', function () { var stubLoadScript; From 2c9f572b1a97bbbf7a8fb6bf253cc39f709d622c Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 14:15:22 -0600 Subject: [PATCH 028/111] adsuppply bid adpater converted to module --- adapters.json | 3 --- .../adsupply.js => modules/adsupplyBidAdapter.js | 12 ++++++++---- .../adsupplyBidAdapter_spec.js} | 6 +++++- 3 files changed, 13 insertions(+), 8 deletions(-) rename src/adapters/adsupply.js => modules/adsupplyBidAdapter.js (90%) rename test/spec/{adapters/adsupply_spec.js => modules/adsupplyBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index c1db169b940..9c9abc9bac3 100644 --- a/adapters.json +++ b/adapters.json @@ -5,7 +5,6 @@ "aol", "beachfront", "audienceNetwork", - "carambola", "conversant", "districtmDMX", "fidelity", @@ -58,8 +57,6 @@ "trion", "eplanning", "prebidServer", - "adsupply", - "cox", { "vertamedia": { "supportedMediaTypes": ["video"] diff --git a/src/adapters/adsupply.js b/modules/adsupplyBidAdapter.js similarity index 90% rename from src/adapters/adsupply.js rename to modules/adsupplyBidAdapter.js index d6c3cda6334..8d7aa1ef4a6 100644 --- a/src/adapters/adsupply.js +++ b/modules/adsupplyBidAdapter.js @@ -1,7 +1,9 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); -var utils = require('../utils'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var utils = require('src/utils'); +var adaptermanager = require('src/adaptermanager'); + const ADSUPPLY_CODE = 'adsupply'; var AdSupplyAdapter = function AdSupplyAdapter() { @@ -83,4 +85,6 @@ var AdSupplyAdapter = function AdSupplyAdapter() { }; }; +adaptermanager.registerBidAdapter(new AdSupplyAdapter, 'adsupply'); + module.exports = AdSupplyAdapter; diff --git a/test/spec/adapters/adsupply_spec.js b/test/spec/modules/adsupplyBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/adsupply_spec.js rename to test/spec/modules/adsupplyBidAdapter_spec.js index 74232d61715..040c08e0ac1 100644 --- a/test/spec/adapters/adsupply_spec.js +++ b/test/spec/modules/adsupplyBidAdapter_spec.js @@ -1,12 +1,16 @@ describe('adsupply adapter tests', function () { const expect = require('chai').expect; - const AdSupplyAdapter = require('../../../src/adapters/adsupply'); + const AdSupplyAdapter = require('../../../modules/adsupplyBidAdapter'); const adloader = require('../../../src/adloader'); const bidmanager = require('../../../src/bidmanager'); const CONSTANTS = require('../../../src/constants.json'); let adsupplyAdapter = new AdSupplyAdapter(); + beforeEach(() => { + pbjs._bidsRequested = []; + }); + it('adsupply response handler should exist and be a function', function () { expect(pbjs.adSupplyResponseHandler).to.exist.and.to.be.a('function'); }); From 8eac7100793bdc681bbb9eec6c4b8bd9ca7d7407 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 14:23:26 -0600 Subject: [PATCH 029/111] use $$PREBID_GLOBAL$$ rather than pbjs in test files --- karma.conf.js | 1 + test/helpers/prebidGlobal.js | 6 +- test/spec/adapters/bidfluence_spec.js | 4 +- test/spec/adapters/centro_spec.js | 24 ++++---- test/spec/adapters/fidelity_spec.js | 10 +-- test/spec/adapters/gumgum_spec.js | 4 +- test/spec/adapters/jcm_spec.js | 48 +++++++-------- test/spec/adapters/memeglobal_spec.js | 10 +-- test/spec/adapters/openx_spec.js | 14 ++--- test/spec/adapters/piximedia_spec.js | 82 ++++++++++++------------- test/spec/adapters/roxot_spec.js | 10 +-- test/spec/adapters/sharethrough_spec.js | 8 +-- test/spec/adapters/sovrn_spec.js | 10 +-- test/spec/adapters/stickyadstv_spec.js | 6 +- test/spec/adapters/tapsense_spec.js | 8 +-- test/spec/adapters/trion_spec.js | 28 ++++----- test/spec/adapters/triplelift_spec.js | 24 ++++---- test/spec/adapters/vertoz_spec.js | 12 ++-- test/spec/adapters/widespace_spec.js | 10 +-- test/spec/adapters/yieldbot_spec.js | 8 +-- 20 files changed, 164 insertions(+), 163 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index 96e53779321..97a40d8430e 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -50,6 +50,7 @@ module.exports = function (config) { // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor preprocessors: { 'test/**/*_spec.js': ['webpack'], + 'test/helpers/prebidGlobal.js': ['webpack'], '!test/**/*_spec.js': 'coverage', 'src/**/*.js': ['webpack', 'coverage'] }, diff --git a/test/helpers/prebidGlobal.js b/test/helpers/prebidGlobal.js index e7ec211b2ff..597076ab0db 100644 --- a/test/helpers/prebidGlobal.js +++ b/test/helpers/prebidGlobal.js @@ -1,3 +1,3 @@ -window.pbjs = (window.pbjs || {}); -window.pbjs.cmd = window.pbjs.cmd || []; -window.pbjs.que = window.pbjs.que || []; +window.$$PREBID_GLOBAL$$ = (window.$$PREBID_GLOBAL$$ || {}); +window.$$PREBID_GLOBAL$$.cmd = window.$$PREBID_GLOBAL$$.cmd || []; +window.$$PREBID_GLOBAL$$.que = window.$$PREBID_GLOBAL$$.que || []; diff --git a/test/spec/adapters/bidfluence_spec.js b/test/spec/adapters/bidfluence_spec.js index 1e5510c4532..345b760eb3a 100644 --- a/test/spec/adapters/bidfluence_spec.js +++ b/test/spec/adapters/bidfluence_spec.js @@ -38,7 +38,7 @@ describe('Bidfluence Adapter', () => { it('Shoud push a valid bid', () => { var stubAddBidResponse = sinon.stub(bidmanager, 'addBidResponse'); - pbjs._bidsRequested.push(REQUEST); + $$PREBID_GLOBAL$$._bidsRequested.push(REQUEST); adapter(); $$PREBID_GLOBAL$$.bfPbjsCB(RESPONSE); @@ -54,7 +54,7 @@ describe('Bidfluence Adapter', () => { it('Shoud push an empty bid', () => { var stubAddBidResponse = sinon.stub(bidmanager, 'addBidResponse'); - pbjs._bidsRequested.push(REQUEST); + $$PREBID_GLOBAL$$._bidsRequested.push(REQUEST); adapter(); $$PREBID_GLOBAL$$.bfPbjsCB(NO_RESPONSE); diff --git a/test/spec/adapters/centro_spec.js b/test/spec/adapters/centro_spec.js index 407200e781c..1844e2292ec 100644 --- a/test/spec/adapters/centro_spec.js +++ b/test/spec/adapters/centro_spec.js @@ -28,8 +28,8 @@ describe('centro adapter tests', function () { }); describe('creation of bid url', function () { - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = []; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = []; } it('should fix parameter name', function () { @@ -98,14 +98,14 @@ describe('centro adapter tests', function () { }); describe('handling of the callback response', function () { - if (typeof (pbjs._bidsReceived) === 'undefined') { - pbjs._bidsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._bidsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._bidsReceived = []; } - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = []; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = []; } - if (typeof (pbjs._adsReceived) === 'undefined') { - pbjs._adsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._adsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._adsReceived = []; } var params = { @@ -167,13 +167,13 @@ describe('centro adapter tests', function () { unit.sizes = [[300, 250], [728, 90]]; adUnits.push(unit); - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = [params]; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = [params]; } else { - pbjs._bidsRequested.push(params); + $$PREBID_GLOBAL$$._bidsRequested.push(params); } - pbjs.adUnits = adUnits; + $$PREBID_GLOBAL$$.adUnits = adUnits; var response = {'adTag': '
test content
', 'statusMessage': 'Bid available', 'height': 250, '_comment': '', 'value': 0.2, 'width': 300, 'sectionID': 28136}; var response2 = {'adTag': '', 'statusMessage': 'No bid.', 'height': 0, 'value': 0, 'width': 0, 'sectionID': 111111}; diff --git a/test/spec/adapters/fidelity_spec.js b/test/spec/adapters/fidelity_spec.js index 3b852713bff..9e3a3980ed5 100644 --- a/test/spec/adapters/fidelity_spec.js +++ b/test/spec/adapters/fidelity_spec.js @@ -98,7 +98,7 @@ describe('fidelity adapter tests', function() { describe('fidelityResponse', function () { it('should exist and be a function', function () { - expect(pbjs.fidelityResponse).to.exist.and.to.be.a('function'); + expect($$PREBID_GLOBAL$$.fidelityResponse).to.exist.and.to.be.a('function'); }); it('should add empty bid response if no bids returned', function () { @@ -124,11 +124,11 @@ describe('fidelity adapter tests', function() { 'seatbid': [] }; - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); // adapter needs to be called, in order for the stub to register. adapter() - pbjs.fidelityResponse(response); + $$PREBID_GLOBAL$$.fidelityResponse(response); var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; var bidObject1 = stubAddBidResponse.getCall(0).args[1]; @@ -172,11 +172,11 @@ describe('fidelity adapter tests', function() { } ] }; - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); // adapter needs to be called, in order for the stub to register. adapter() - pbjs.fidelityResponse(response); + $$PREBID_GLOBAL$$.fidelityResponse(response); var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; var bidObject1 = stubAddBidResponse.getCall(0).args[1]; diff --git a/test/spec/adapters/gumgum_spec.js b/test/spec/adapters/gumgum_spec.js index a6d33dc5bd0..afc62b9c0da 100644 --- a/test/spec/adapters/gumgum_spec.js +++ b/test/spec/adapters/gumgum_spec.js @@ -79,7 +79,7 @@ describe('gumgum adapter', () => { sandbox.stub(bidManager, 'addBidResponse'); sandbox.stub(adLoader, 'loadScript'); adapter.callBids(bidderRequest); - pbjs.handleGumGumCB['InScreenBidId'](response); + $$PREBID_GLOBAL$$.handleGumGumCB['InScreenBidId'](response); return bidManager.addBidResponse.firstCall.args[1]; } @@ -207,7 +207,7 @@ describe('gumgum adapter', () => { describe('handleGumGumCB[...]', () => { it('exists and is function', () => { - expect(pbjs.handleGumGumCB['InScreenBidId']).to.exist.and.to.be.a('function'); + expect($$PREBID_GLOBAL$$.handleGumGumCB['InScreenBidId']).to.exist.and.to.be.a('function'); }); }); diff --git a/test/spec/adapters/jcm_spec.js b/test/spec/adapters/jcm_spec.js index 22ba6c4c9af..66d72eb324e 100644 --- a/test/spec/adapters/jcm_spec.js +++ b/test/spec/adapters/jcm_spec.js @@ -20,14 +20,14 @@ describe('jcm adapter tests', function () { }); describe('creation of bid url', function () { - if (typeof (pbjs._bidsReceived) === 'undefined') { - pbjs._bidsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._bidsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._bidsReceived = []; } - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = []; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = []; } - if (typeof (pbjs._adsReceived) === 'undefined') { - pbjs._adsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._adsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._adsReceived = []; } it('should be called only once', function () { @@ -94,14 +94,14 @@ describe('jcm adapter tests', function () { }); describe('placement by size', function () { - if (typeof (pbjs._bidsReceived) === 'undefined') { - pbjs._bidsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._bidsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._bidsReceived = []; } - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = []; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = []; } - if (typeof (pbjs._adsReceived) === 'undefined') { - pbjs._adsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._adsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._adsReceived = []; } it('should be called with specific parameters for two bids', function () { @@ -160,14 +160,14 @@ describe('jcm adapter tests', function () { }); describe('handling of the callback response', function () { - if (typeof (pbjs._bidsReceived) === 'undefined') { - pbjs._bidsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._bidsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._bidsReceived = []; } - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = []; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = []; } - if (typeof (pbjs._adsReceived) === 'undefined') { - pbjs._adsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._adsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._adsReceived = []; } var params = { @@ -198,7 +198,7 @@ describe('jcm adapter tests', function () { var response = '{"bids":[{"width":300,"cpm":3,"ad":"%3Cimg+src%3D%22http%3A%2F%2Fmedia.adfrontiers.com%2Fimgs%2Fpartnership_300x250.png%22%3E","callbackId":"3c9408cdbf2f68","height":250},{"width":728,"cpm":0,"ad":"%3Cimg+src%3D%22http%3A%2F%2Fmedia.adfrontiers.com%2Fimgs%2Fpartnership_728x90.png%22%3E","callbackId":"3c9408cdbf2f69","height":90}]}'; it('callback function should exist', function () { - expect(pbjs.processJCMResponse).to.exist.and.to.be.a('function'); + expect($$PREBID_GLOBAL$$.processJCMResponse).to.exist.and.to.be.a('function'); }); it('bidmanager.addBidResponse should be called twice with correct arguments', function () { @@ -213,13 +213,13 @@ describe('jcm adapter tests', function () { unit.sizes = [[300, 250], [728, 90]]; adUnits.push(unit); - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = [params]; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = [params]; } else { - pbjs._bidsRequested.push(params); + $$PREBID_GLOBAL$$._bidsRequested.push(params); } - pbjs.adUnits = adUnits; - pbjs.processJCMResponse(response); + $$PREBID_GLOBAL$$.adUnits = adUnits; + $$PREBID_GLOBAL$$.processJCMResponse(response); var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; var bidObject1 = stubAddBidResponse.getCall(0).args[1]; diff --git a/test/spec/adapters/memeglobal_spec.js b/test/spec/adapters/memeglobal_spec.js index 6aeaf161838..d607e87cb59 100644 --- a/test/spec/adapters/memeglobal_spec.js +++ b/test/spec/adapters/memeglobal_spec.js @@ -15,7 +15,7 @@ describe('memeglobal adapter tests', function () { }); function getBidSetForBidder() { - return pbjs._bidsRequested.find(bidSet => bidSet.bidderCode === bidderName); + return $$PREBID_GLOBAL$$._bidsRequested.find(bidSet => bidSet.bidderCode === bidderName); } function checkBidsRequestedInit() { @@ -28,13 +28,13 @@ describe('memeglobal adapter tests', function () { bidderCode: 'memeglobal', bids: [] }; - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); } } describe('functions and initialization', function () { it('should exist and be a function', function () { - expect(pbjs.mgres).to.exist.and.to.be.a('function'); + expect($$PREBID_GLOBAL$$.mgres).to.exist.and.to.be.a('function'); }); it('callBids with params', function () { @@ -101,7 +101,7 @@ describe('memeglobal adapter tests', function () { // adapter needs to be called for stub registration. adapter() - pbjs.mgres(response); + $$PREBID_GLOBAL$$.mgres(response); expect(stubAddBidResponse.getCall(0)).to.equal(null); // var bidPlacementCode = stubAddBidResponse.getCall(0).args[0]; @@ -149,7 +149,7 @@ describe('memeglobal adapter tests', function () { var bidSet = getBidSetForBidder(); bidSet.bids.push(bid); adapter() - pbjs.mgres(response); + $$PREBID_GLOBAL$$.mgres(response); var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; var bidObject1 = stubAddBidResponse.getCall(0).args[1]; diff --git a/test/spec/adapters/openx_spec.js b/test/spec/adapters/openx_spec.js index 437561a9621..dc18298ad64 100644 --- a/test/spec/adapters/openx_spec.js +++ b/test/spec/adapters/openx_spec.js @@ -11,7 +11,7 @@ describe('openx adapter tests', function () { describe('test openx callback responce', function () { it('should exist and be a function', function () { - expect(pbjs.oxARJResponse).to.exist.and.to.be.a('function'); + expect($$PREBID_GLOBAL$$.oxARJResponse).to.exist.and.to.be.a('function'); }); it('should add empty bid responses if no bids returned', function () { @@ -44,11 +44,11 @@ describe('openx adapter tests', function () { } }; - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); // adapter needs to be called, in order for the stub to register. adapter(); - pbjs.oxARJResponse(response); + $$PREBID_GLOBAL$$.oxARJResponse(response); let bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; let bidResponse1 = stubAddBidResponse.getCall(0).args[1]; @@ -116,11 +116,11 @@ describe('openx adapter tests', function () { } }; - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); // adapter needs to be called, in order for the stub to register. adapter(); - pbjs.oxARJResponse(response); + $$PREBID_GLOBAL$$.oxARJResponse(response); let bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; let bidResponse1 = stubAddBidResponse.getCall(0).args[1]; @@ -193,11 +193,11 @@ describe('openx adapter tests', function () { } }; - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); // adapter needs to be called, in order for the stub to register. adapter(); - pbjs.oxARJResponse(response); + $$PREBID_GLOBAL$$.oxARJResponse(response); let bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; let bidResponse1 = stubAddBidResponse.getCall(0).args[1]; diff --git a/test/spec/adapters/piximedia_spec.js b/test/spec/adapters/piximedia_spec.js index 413d45ccf9b..9a9a977603c 100644 --- a/test/spec/adapters/piximedia_spec.js +++ b/test/spec/adapters/piximedia_spec.js @@ -21,14 +21,14 @@ describe('Piximedia adapter tests', function () { }); describe('creation of prebid url', function () { - if (typeof (pbjs._bidsReceived) === 'undefined') { - pbjs._bidsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._bidsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._bidsReceived = []; } - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = []; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = []; } - if (typeof (pbjs._adsReceived) === 'undefined') { - pbjs._adsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._adsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._adsReceived = []; } it('should call the Piximedia prebid URL once on valid calls', function () { @@ -124,7 +124,7 @@ describe('Piximedia adapter tests', function () { expect(parsedBidUrl.hostname).to.equal('static.adserver.pm'); expect(parsedBidUrl.query).to.equal(''); - expect(parsedBidUrl.pathname.replace(/cbid=[a-f0-9]+/, 'cbid=210af5668b1e23').replace(/rand=[0-9]+$/, 'rand=42')).to.equal('/prebid/site_id=TEST/placement_id=TEST/l_id=1295/custom=bespoke/custom2=bespoke2/custom3=/custom4=/jsonp=pbjs.handlePiximediaCallback/sizes=300x250/cbid=210af5668b1e23/rand=42'); + expect(parsedBidUrl.pathname.replace(/cbid=[a-f0-9]+/, 'cbid=210af5668b1e23').replace(/rand=[0-9]+$/, 'rand=42')).to.equal('/prebid/site_id=TEST/placement_id=TEST/l_id=1295/custom=bespoke/custom2=bespoke2/custom3=/custom4=/jsonp=$$PREBID_GLOBAL$$.handlePiximediaCallback/sizes=300x250/cbid=210af5668b1e23/rand=42'); }); it('should call the correct Prebid URL when using the default URL and overridding sizes', function () { @@ -152,7 +152,7 @@ describe('Piximedia adapter tests', function () { expect(parsedBidUrl.hostname).to.equal('static.adserver.pm'); expect(parsedBidUrl.query).to.equal(''); - expect(parsedBidUrl.pathname.replace(/cbid=[a-f0-9]+/, 'cbid=210af5668b1e23').replace(/rand=[0-9]+$/, 'rand=42')).to.equal('/prebid/site_id=TEST/placement_id=TEST/jsonp=pbjs.handlePiximediaCallback/sizes=300x600%2C728x90/cbid=210af5668b1e23/rand=42'); + expect(parsedBidUrl.pathname.replace(/cbid=[a-f0-9]+/, 'cbid=210af5668b1e23').replace(/rand=[0-9]+$/, 'rand=42')).to.equal('/prebid/site_id=TEST/placement_id=TEST/jsonp=$$PREBID_GLOBAL$$.handlePiximediaCallback/sizes=300x600%2C728x90/cbid=210af5668b1e23/rand=42'); }); it('should call the correct Prebid URL when supplying a custom URL', function () { @@ -180,19 +180,19 @@ describe('Piximedia adapter tests', function () { expect(parsedBidUrl.hostname).to.equal('resources.pm'); expect(parsedBidUrl.query).to.equal(''); - expect(parsedBidUrl.pathname.replace(/cbid=[a-f0-9]+/, 'cbid=210af5668b1e23').replace(/rand=[0-9]+$/, 'rand=42')).to.equal('/tests/prebid/bids.js/site_id=TEST/placement_id=TEST/jsonp=pbjs.handlePiximediaCallback/sizes=300x250/cbid=210af5668b1e23/rand=42'); + expect(parsedBidUrl.pathname.replace(/cbid=[a-f0-9]+/, 'cbid=210af5668b1e23').replace(/rand=[0-9]+$/, 'rand=42')).to.equal('/tests/prebid/bids.js/site_id=TEST/placement_id=TEST/jsonp=$$PREBID_GLOBAL$$.handlePiximediaCallback/sizes=300x250/cbid=210af5668b1e23/rand=42'); }); }); describe('handling of the callback response', function () { - if (typeof (pbjs._bidsReceived) === 'undefined') { - pbjs._bidsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._bidsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._bidsReceived = []; } - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = []; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = []; } - if (typeof (pbjs._adsReceived) === 'undefined') { - pbjs._adsReceived = []; + if (typeof ($$PREBID_GLOBAL$$._adsReceived) === 'undefined') { + $$PREBID_GLOBAL$$._adsReceived = []; } var params = { @@ -211,7 +211,7 @@ describe('Piximedia adapter tests', function () { }; it('Piximedia callback function should exist', function () { - expect(pbjs.handlePiximediaCallback).to.exist.and.to.be.a('function'); + expect($$PREBID_GLOBAL$$.handlePiximediaCallback).to.exist.and.to.be.a('function'); }); it('bidmanager.addBidResponse should be called once with correct arguments', function () { @@ -237,15 +237,15 @@ describe('Piximedia adapter tests', function () { unit.sizes = [[300, 250], [728, 90]]; adUnits.push(unit); - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = [params]; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = [params]; } else { - pbjs._bidsRequested.push(params); + $$PREBID_GLOBAL$$._bidsRequested.push(params); } - pbjs.adUnits = adUnits; + $$PREBID_GLOBAL$$.adUnits = adUnits; response.cbid = stubGetUniqueIdentifierStr.returnValues[0]; - pbjs.handlePiximediaCallback(response); + $$PREBID_GLOBAL$$.handlePiximediaCallback(response); sinon.assert.calledOnce(stubAddBidResponse); var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; @@ -287,15 +287,15 @@ describe('Piximedia adapter tests', function () { unit.sizes = [[300, 250], [728, 90]]; adUnits.push(unit); - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = [params]; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = [params]; } else { - pbjs._bidsRequested.push(params); + $$PREBID_GLOBAL$$._bidsRequested.push(params); } - pbjs.adUnits = adUnits; + $$PREBID_GLOBAL$$.adUnits = adUnits; response.cbid = stubGetUniqueIdentifierStr.returnValues[0]; - pbjs.handlePiximediaCallback(response); + $$PREBID_GLOBAL$$.handlePiximediaCallback(response); sinon.assert.calledOnce(stubAddBidResponse); var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; @@ -330,15 +330,15 @@ describe('Piximedia adapter tests', function () { unit.sizes = [[300, 250], [728, 90]]; adUnits.push(unit); - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = [params]; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = [params]; } else { - pbjs._bidsRequested.push(params); + $$PREBID_GLOBAL$$._bidsRequested.push(params); } - pbjs.adUnits = adUnits; + $$PREBID_GLOBAL$$.adUnits = adUnits; response.cbid = stubGetUniqueIdentifierStr.returnValues[0]; - pbjs.handlePiximediaCallback(response); + $$PREBID_GLOBAL$$.handlePiximediaCallback(response); sinon.assert.calledOnce(stubAddBidResponse); var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; @@ -369,15 +369,15 @@ describe('Piximedia adapter tests', function () { unit.sizes = [[300, 250], [728, 90]]; adUnits.push(unit); - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = [params]; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = [params]; } else { - pbjs._bidsRequested.push(params); + $$PREBID_GLOBAL$$._bidsRequested.push(params); } - pbjs.adUnits = adUnits; + $$PREBID_GLOBAL$$.adUnits = adUnits; response.cbid = stubGetUniqueIdentifierStr.returnValues[0] + '_BOGUS'; - pbjs.handlePiximediaCallback(response); + $$PREBID_GLOBAL$$.handlePiximediaCallback(response); sinon.assert.notCalled(stubAddBidResponse); @@ -399,14 +399,14 @@ describe('Piximedia adapter tests', function () { unit.sizes = [[300, 250], [728, 90]]; adUnits.push(unit); - if (typeof (pbjs._bidsRequested) === 'undefined') { - pbjs._bidsRequested = [params]; + if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') { + $$PREBID_GLOBAL$$._bidsRequested = [params]; } else { - pbjs._bidsRequested.push(params); + $$PREBID_GLOBAL$$._bidsRequested.push(params); } - pbjs.adUnits = adUnits; + $$PREBID_GLOBAL$$.adUnits = adUnits; - pbjs.handlePiximediaCallback(response); + $$PREBID_GLOBAL$$.handlePiximediaCallback(response); sinon.assert.notCalled(stubAddBidResponse); diff --git a/test/spec/adapters/roxot_spec.js b/test/spec/adapters/roxot_spec.js index 471d97d9a22..4d9918f0ad0 100644 --- a/test/spec/adapters/roxot_spec.js +++ b/test/spec/adapters/roxot_spec.js @@ -5,7 +5,7 @@ describe('Roxot adapter tests', function() { describe('roxotResponseHandler', function () { it('should exist and be a function', function () { - expect(pbjs.roxotResponseHandler).to.exist.and.to.be.a('function'); + expect($$PREBID_GLOBAL$$.roxotResponseHandler).to.exist.and.to.be.a('function'); }); it('should add empty bid responses if no bids returned', function () { @@ -35,12 +35,12 @@ describe('Roxot adapter tests', function() { 'bids': [] }; - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); // adapter needs to be called, in order for the stub to register. adapter(); - pbjs.roxotResponseHandler(response); + $$PREBID_GLOBAL$$.roxotResponseHandler(response); var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; var bidObject1 = stubAddBidResponse.getCall(0).args[1]; @@ -93,12 +93,12 @@ describe('Roxot adapter tests', function() { } ]}; - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); // adapter needs to be called, in order for the stub to register. adapter(); - pbjs.roxotResponseHandler(response); + $$PREBID_GLOBAL$$.roxotResponseHandler(response); var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; var bidObject1 = stubAddBidResponse.getCall(0).args[1]; diff --git a/test/spec/adapters/sharethrough_spec.js b/test/spec/adapters/sharethrough_spec.js index 8f0bef53a4a..4c9fc400db5 100644 --- a/test/spec/adapters/sharethrough_spec.js +++ b/test/spec/adapters/sharethrough_spec.js @@ -34,14 +34,14 @@ describe('sharethrough adapter', () => { beforeEach(() => { adapter = new Adapter(); sandbox = sinon.sandbox.create(); - bidsRequestedOriginal = pbjs._bidsRequested; - pbjs._bidsRequested = []; + bidsRequestedOriginal = $$PREBID_GLOBAL$$._bidsRequested; + $$PREBID_GLOBAL$$._bidsRequested = []; }); afterEach(() => { sandbox.restore(); - pbjs._bidsRequested = bidsRequestedOriginal; + $$PREBID_GLOBAL$$._bidsRequested = bidsRequestedOriginal; }); describe('callBids', () => { @@ -74,7 +74,7 @@ describe('sharethrough adapter', () => { sandbox.stub(bidManager, 'addBidResponse'); server = sinon.fakeServer.create(); - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); adapter.str.placementCodeSet['foo'] = {}; adapter.str.placementCodeSet['bar'] = {}; // respond diff --git a/test/spec/adapters/sovrn_spec.js b/test/spec/adapters/sovrn_spec.js index ee36fee5f3b..81a695171d2 100644 --- a/test/spec/adapters/sovrn_spec.js +++ b/test/spec/adapters/sovrn_spec.js @@ -5,7 +5,7 @@ describe('sovrn adapter tests', function () { describe('sovrnResponse', function () { it('should exist and be a function', function () { - expect(pbjs.sovrnResponse).to.exist.and.to.be.a('function'); + expect($$PREBID_GLOBAL$$.sovrnResponse).to.exist.and.to.be.a('function'); }); it('should add empty bid responses if no bids returned', function () { @@ -50,11 +50,11 @@ describe('sovrn adapter tests', function () { 'seatbid': [] }; - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); // adapter needs to be called, in order for the stub to register. adapter() - pbjs.sovrnResponse(response); + $$PREBID_GLOBAL$$.sovrnResponse(response); var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; var bidObject1 = stubAddBidResponse.getCall(0).args[1]; @@ -133,11 +133,11 @@ describe('sovrn adapter tests', function () { } ] }; - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); // adapter needs to be called, in order for the stub to register. adapter() - pbjs.sovrnResponse(response); + $$PREBID_GLOBAL$$.sovrnResponse(response); var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; var bidObject1 = stubAddBidResponse.getCall(0).args[1]; diff --git a/test/spec/adapters/stickyadstv_spec.js b/test/spec/adapters/stickyadstv_spec.js index 96a589ea07d..96f5d4a641d 100644 --- a/test/spec/adapters/stickyadstv_spec.js +++ b/test/spec/adapters/stickyadstv_spec.js @@ -49,13 +49,13 @@ describe('StickyAdsTV Adapter', function () { beforeEach(function () { adapter = new Adapter(); sandbox = sinon.sandbox.create(); - bidsRequestBuff = pbjs._bidsRequested; - pbjs._bidsRequested = []; + bidsRequestBuff = $$PREBID_GLOBAL$$._bidsRequested; + $$PREBID_GLOBAL$$._bidsRequested = []; }); afterEach(function () { sandbox.restore(); - pbjs._bidsRequested = bidsRequestBuff; + $$PREBID_GLOBAL$$._bidsRequested = bidsRequestBuff; }); describe('callBids', function () { diff --git a/test/spec/adapters/tapsense_spec.js b/test/spec/adapters/tapsense_spec.js index 9ae501ea7c6..34c0f00d637 100644 --- a/test/spec/adapters/tapsense_spec.js +++ b/test/spec/adapters/tapsense_spec.js @@ -200,7 +200,7 @@ describe('TapSenseAdapter', () => { }); it('generates callback in namespaced object with correct bidder id', () => { makeSuccessfulRequest(adapter); - expect(pbjs.tapsense.callback_with_price_2b211418dd0575).to.exist.and.to.be.a('function'); + expect($$PREBID_GLOBAL$$.tapsense.callback_with_price_2b211418dd0575).to.exist.and.to.be.a('function'); }) }); @@ -218,7 +218,7 @@ describe('TapSenseAdapter', () => { }); describe('successful response', () => { beforeEach(() => { - pbjs.tapsense.callback_with_price_2b211418dd0575(SUCCESSFUL_RESPONSE, 1.2); + $$PREBID_GLOBAL$$.tapsense.callback_with_price_2b211418dd0575(SUCCESSFUL_RESPONSE, 1.2); }); it('called the bidmanager and registers a bid', () => { sinon.assert.calledOnce(bidmanager.addBidResponse); @@ -231,7 +231,7 @@ describe('TapSenseAdapter', () => { }); describe('unsuccessful response', () => { beforeEach(() => { - pbjs.tapsense.callback_with_price_2b211418dd0575(UNSUCCESSFUL_RESPONSE, 1.2); + $$PREBID_GLOBAL$$.tapsense.callback_with_price_2b211418dd0575(UNSUCCESSFUL_RESPONSE, 1.2); }) it('should call the bidmanger and register an invalid bid', () => { sinon.assert.calledOnce(bidmanager.addBidResponse); @@ -249,7 +249,7 @@ describe('TapSenseAdapter', () => { describe('edge cases', () => { it('does not register a bid if no price is supplied', () => { sandbox.stub(utils, 'logMessage'); - pbjs.tapsense.callback_with_price_2b211418dd0575(SUCCESSFUL_RESPONSE); + $$PREBID_GLOBAL$$.tapsense.callback_with_price_2b211418dd0575(SUCCESSFUL_RESPONSE); sinon.assert.notCalled(bidmanager.addBidResponse); }); }); diff --git a/test/spec/adapters/trion_spec.js b/test/spec/adapters/trion_spec.js index dbbcf66ec87..192ed9c2b06 100644 --- a/test/spec/adapters/trion_spec.js +++ b/test/spec/adapters/trion_spec.js @@ -198,8 +198,8 @@ describe('Trion adapter tests', () => { }); it('when there is no response do not bid', function () { - pbjs._bidsRequested.push(TRION_BID_REQUEST); - pbjs.handleTrionCB(); + $$PREBID_GLOBAL$$._bidsRequested.push(TRION_BID_REQUEST); + $$PREBID_GLOBAL$$.handleTrionCB(); sinon.assert.calledOnce(bidmanager.addBidResponse); const response = bidmanager.addBidResponse.firstCall.args[1]; expect(response.getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); @@ -207,8 +207,8 @@ describe('Trion adapter tests', () => { it('when place bid is returned as false', function () { TRION_BID_RESPONSE.result.placeBid = false; - pbjs._bidsRequested.push(TRION_BID_REQUEST); - pbjs.handleTrionCB(TRION_BID_RESPONSE); + $$PREBID_GLOBAL$$._bidsRequested.push(TRION_BID_REQUEST); + $$PREBID_GLOBAL$$.handleTrionCB(TRION_BID_RESPONSE); sinon.assert.calledOnce(bidmanager.addBidResponse); const response = bidmanager.addBidResponse.firstCall.args[1]; expect(response.getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); @@ -217,8 +217,8 @@ describe('Trion adapter tests', () => { it('when no cpm is in the response', function () { TRION_BID_RESPONSE.result.cpm = 0; - pbjs._bidsRequested.push(TRION_BID_REQUEST); - pbjs.handleTrionCB(TRION_BID_RESPONSE); + $$PREBID_GLOBAL$$._bidsRequested.push(TRION_BID_REQUEST); + $$PREBID_GLOBAL$$.handleTrionCB(TRION_BID_RESPONSE); sinon.assert.calledOnce(bidmanager.addBidResponse); const response = bidmanager.addBidResponse.firstCall.args[1]; expect(response.getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); @@ -227,8 +227,8 @@ describe('Trion adapter tests', () => { it('when no ad is in the response', function () { TRION_BID_RESPONSE.result.ad = null; - pbjs._bidsRequested.push(TRION_BID_REQUEST); - pbjs.handleTrionCB(TRION_BID_RESPONSE); + $$PREBID_GLOBAL$$._bidsRequested.push(TRION_BID_REQUEST); + $$PREBID_GLOBAL$$.handleTrionCB(TRION_BID_RESPONSE); sinon.assert.calledOnce(bidmanager.addBidResponse); const response = bidmanager.addBidResponse.firstCall.args[1]; expect(response.getStatusCode()).to.equal(CONSTANTS.STATUS.NO_BID); @@ -236,8 +236,8 @@ describe('Trion adapter tests', () => { }); it('bid response is formatted correctly', function () { - pbjs._bidsRequested.push(TRION_BID_REQUEST); - pbjs.handleTrionCB(TRION_BID_RESPONSE); + $$PREBID_GLOBAL$$._bidsRequested.push(TRION_BID_REQUEST); + $$PREBID_GLOBAL$$.handleTrionCB(TRION_BID_RESPONSE); const placementCode = bidmanager.addBidResponse.firstCall.args[0]; const response = bidmanager.addBidResponse.firstCall.args[1]; expect(placementCode).to.equal(PLACEMENT_CODE); @@ -250,8 +250,8 @@ describe('Trion adapter tests', () => { let bidHeight = '2'; TRION_BID_RESPONSE.result.width = bidWidth; TRION_BID_RESPONSE.result.height = bidHeight; - pbjs._bidsRequested.push(TRION_BID_REQUEST); - pbjs.handleTrionCB(TRION_BID_RESPONSE); + $$PREBID_GLOBAL$$._bidsRequested.push(TRION_BID_REQUEST); + $$PREBID_GLOBAL$$.handleTrionCB(TRION_BID_RESPONSE); const placementCode = bidmanager.addBidResponse.firstCall.args[0]; const response = bidmanager.addBidResponse.firstCall.args[1]; expect(response.width).to.equal(bidWidth); @@ -263,8 +263,8 @@ describe('Trion adapter tests', () => { it('cpm is properly set and transformed to cents', function () { let bidCpm = 2; TRION_BID_RESPONSE.result.cpm = bidCpm * 100; - pbjs._bidsRequested.push(TRION_BID_REQUEST); - pbjs.handleTrionCB(TRION_BID_RESPONSE); + $$PREBID_GLOBAL$$._bidsRequested.push(TRION_BID_REQUEST); + $$PREBID_GLOBAL$$.handleTrionCB(TRION_BID_RESPONSE); const response = bidmanager.addBidResponse.firstCall.args[1]; expect(response.cpm).to.equal(bidCpm); TRION_BID_RESPONSE.result.cpm = 100; diff --git a/test/spec/adapters/triplelift_spec.js b/test/spec/adapters/triplelift_spec.js index cae78d95e30..dc19be19175 100644 --- a/test/spec/adapters/triplelift_spec.js +++ b/test/spec/adapters/triplelift_spec.js @@ -35,8 +35,8 @@ describe('triplelift adapter', () => { }; beforeEach(() => { - bidsRequestedOriginal = pbjs._bidsRequested; - pbjs._bidsRequested = []; + bidsRequestedOriginal = $$PREBID_GLOBAL$$._bidsRequested; + $$PREBID_GLOBAL$$._bidsRequested = []; adapter = new Adapter(); sandbox = sinon.sandbox.create(); @@ -45,7 +45,7 @@ describe('triplelift adapter', () => { afterEach(() => { sandbox.restore(); - pbjs._bidsRequested = bidsRequestedOriginal; + $$PREBID_GLOBAL$$._bidsRequested = bidsRequestedOriginal; }); describe('callBids', () => { @@ -68,14 +68,14 @@ describe('triplelift adapter', () => { expect(secondBidScriptURL).to.contain(route); let firstScriptParams = parseURL(firstBidScriptURL).search; - expect(firstScriptParams).to.have.property('callback', 'pbjs.TLCB'); + expect(firstScriptParams).to.have.property('callback', '$$PREBID_GLOBAL$$.TLCB'); expect(firstScriptParams).to.have.property('callback_id', 'bidId1'); expect(firstScriptParams).to.have.property('inv_code', 'codeA'); expect(firstScriptParams).to.have.property('size', '728x90'); expect(firstScriptParams).to.have.property('referrer'); let secondScriptParams = parseURL(secondBidScriptURL).search; - expect(secondScriptParams).to.have.property('callback', 'pbjs.TLCB'); + expect(secondScriptParams).to.have.property('callback', '$$PREBID_GLOBAL$$.TLCB'); expect(secondScriptParams).to.have.property('callback_id', 'bidId2'); expect(secondScriptParams).to.have.property('inv_code', 'codeB'); expect(secondScriptParams).to.have.property('size', '300x600'); @@ -86,7 +86,7 @@ describe('triplelift adapter', () => { describe('TLCB', () => { it('should exist and be a function', () => { - expect(pbjs.TLCB).to.exist.and.to.be.a('function'); + expect($$PREBID_GLOBAL$$.TLCB).to.exist.and.to.be.a('function'); }); }); @@ -97,7 +97,7 @@ describe('triplelift adapter', () => { beforeEach(() => { sandbox.stub(bidManager, 'addBidResponse'); - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); // respond let bidderReponse1 = { @@ -119,8 +119,8 @@ describe('triplelift adapter', () => { 'deal_id': 'dealA' }; - pbjs.TLCB(bidderReponse1); - pbjs.TLCB(bidderReponse2); + $$PREBID_GLOBAL$$.TLCB(bidderReponse1); + $$PREBID_GLOBAL$$.TLCB(bidderReponse2); firstBid = bidManager.addBidResponse.firstCall.args[1]; secondBid = bidManager.addBidResponse.secondCall.args[1]; @@ -183,14 +183,14 @@ describe('triplelift adapter', () => { beforeEach(() => { sandbox.stub(bidManager, 'addBidResponse'); - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); // respond let bidderReponse1 = {'status': 'no_bid', 'callback_id': 'bidId1'}; let bidderReponse2 = {'status': 'no_bid', 'callback_id': 'bidId2'}; - pbjs.TLCB(bidderReponse1); - pbjs.TLCB(bidderReponse2); + $$PREBID_GLOBAL$$.TLCB(bidderReponse1); + $$PREBID_GLOBAL$$.TLCB(bidderReponse2); firstBid = bidManager.addBidResponse.firstCall.args[1]; secondBid = bidManager.addBidResponse.secondCall.args[1]; diff --git a/test/spec/adapters/vertoz_spec.js b/test/spec/adapters/vertoz_spec.js index b3881091df4..f896adf4c2e 100755 --- a/test/spec/adapters/vertoz_spec.js +++ b/test/spec/adapters/vertoz_spec.js @@ -46,13 +46,13 @@ describe('Vertoz Adapter', () => { beforeEach(() => { adapter = new Adapter(); sandbox = sinon.sandbox.create(); - bidsRequestBuff = pbjs._bidsRequested; - pbjs._bidsRequested = []; + bidsRequestBuff = $$PREBID_GLOBAL$$._bidsRequested; + $$PREBID_GLOBAL$$._bidsRequested = []; }); afterEach(() => { sandbox.restore(); - pbjs._bidsRequested = bidsRequestBuff; + $$PREBID_GLOBAL$$._bidsRequested = bidsRequestBuff; }); describe('callBids', () => { @@ -81,7 +81,7 @@ describe('Vertoz Adapter', () => { }; beforeEach(() => { - pbjs._bidsRequested.push(bidderRequest); + $$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); }); describe('success', () => { @@ -90,7 +90,7 @@ describe('Vertoz Adapter', () => { beforeEach(() => { sandbox.stub(bidManager, 'addBidResponse'); - pbjs.vzResponse(bidderReponse); + $$PREBID_GLOBAL$$.vzResponse(bidderReponse); firstBidReg = bidManager.addBidResponse.firstCall.args[1]; adSpaceId = bidManager.addBidResponse.firstCall.args[0]; }); @@ -121,7 +121,7 @@ describe('Vertoz Adapter', () => { beforeEach(() => { sandbox.stub(bidManager, 'addBidResponse'); - pbjs.vzResponse(bidderResponse); + $$PREBID_GLOBAL$$.vzResponse(bidderResponse); secondBidReg = bidManager.addBidResponse.firstCall.args[1]; adSpaceId = bidManager.addBidResponse.firstCall.args[0]; }); diff --git a/test/spec/adapters/widespace_spec.js b/test/spec/adapters/widespace_spec.js index 95f4a16458c..261ec23497e 100644 --- a/test/spec/adapters/widespace_spec.js +++ b/test/spec/adapters/widespace_spec.js @@ -118,7 +118,7 @@ describe('WidespaceAdapter', () => { describe('widespaceHandleCB', () => { it('should exist and be a function', () => { - expect(pbjs.widespaceHandleCB).to.exist.and.to.be.a('function'); + expect($$PREBID_GLOBAL$$.widespaceHandleCB).to.exist.and.to.be.a('function'); }); }); @@ -131,8 +131,8 @@ describe('WidespaceAdapter', () => { sandbox.stub(adLoader, 'loadScript'); adapter.callBids(BID_REQUEST); - pbjs._bidsRequested.push(BID_REQUEST); - pbjs.widespaceHandleCB(BID_RESPONSE); + $$PREBID_GLOBAL$$._bidsRequested.push(BID_REQUEST); + $$PREBID_GLOBAL$$.widespaceHandleCB(BID_RESPONSE); successfulBid = bidManager.addBidResponse.firstCall.args[1]; placementCode = bidManager.addBidResponse.firstCall.args[0]; @@ -168,8 +168,8 @@ describe('WidespaceAdapter', () => { sandbox.stub(adLoader, 'loadScript'); adapter.callBids(BID_REQUEST); - pbjs._bidsRequested.push(BID_REQUEST); - pbjs.widespaceHandleCB(BID_NOAD_RESPONSE); + $$PREBID_GLOBAL$$._bidsRequested.push(BID_REQUEST); + $$PREBID_GLOBAL$$.widespaceHandleCB(BID_NOAD_RESPONSE); noadBid = bidManager.addBidResponse.firstCall.args[1]; }); diff --git a/test/spec/adapters/yieldbot_spec.js b/test/spec/adapters/yieldbot_spec.js index 3a8f52ca05e..d7c15fd026a 100644 --- a/test/spec/adapters/yieldbot_spec.js +++ b/test/spec/adapters/yieldbot_spec.js @@ -72,7 +72,7 @@ let bidManagerStub; let yieldbotLibStub; before(function() { - window.pbjs._bidsRequested.push(bidderRequest); + window.$$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); }); describe('Yieldbot adapter tests', function() { @@ -184,7 +184,7 @@ describe('Yieldbot adapter tests', function() { expect(window.yieldbot._initialized).to.equal(true); - window.pbjs._bidsRequested = window.pbjs._bidsRequested.filter(o => { + window.$$PREBID_GLOBAL$$._bidsRequested = window.$$PREBID_GLOBAL$$._bidsRequested.filter(o => { return o.bidderCode !== 'yieldbot'; }); @@ -194,7 +194,7 @@ describe('Yieldbot adapter tests', function() { }); it('should not add empty bidResponse on callBids without bidsRequested', function() { - window.pbjs._bidsRequested = window.pbjs._bidsRequested.filter(o => { + window.$$PREBID_GLOBAL$$._bidsRequested = window.$$PREBID_GLOBAL$$._bidsRequested.filter(o => { return o.bidderCode !== 'yieldbot'; }); @@ -202,7 +202,7 @@ describe('Yieldbot adapter tests', function() { adapter.callBids(bidderRequest); mockYieldbotInitBidRequest(); - let bidResponses = window.pbjs._bidsReceived.filter(o => { + let bidResponses = window.$$PREBID_GLOBAL$$._bidsReceived.filter(o => { return o.bidderCode === 'yieldbot'; }); From 524fdd9b7192344074919ac5249226880fcb7c31 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 14:29:56 -0600 Subject: [PATCH 030/111] adyoulike bid adapter converted to module --- adapters.json | 1 - src/adapters/adyoulike.js => modules/adyoulikeBidAdapter.js | 5 ++++- .../adyoulikeBidAdapter_spec.js} | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) rename src/adapters/adyoulike.js => modules/adyoulikeBidAdapter.js (97%) rename test/spec/{adapters/adyoulike_spec.js => modules/adyoulikeBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 9c9abc9bac3..50d3a56976b 100644 --- a/adapters.json +++ b/adapters.json @@ -1,5 +1,4 @@ [ - "adyoulike", "bidfluence", "vertamedia", "aol", diff --git a/src/adapters/adyoulike.js b/modules/adyoulikeBidAdapter.js similarity index 97% rename from src/adapters/adyoulike.js rename to modules/adyoulikeBidAdapter.js index 7ee65eebe06..b9e958ac16b 100644 --- a/src/adapters/adyoulike.js +++ b/modules/adyoulikeBidAdapter.js @@ -1,10 +1,11 @@ -import Adapter from 'src/adapters/adapter'; +import Adapter from 'src/adapter'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; import { format } from 'src/url'; import { ajax } from 'src/ajax'; import { STATUS } from 'src/constants'; +import adaptermanager from 'src/adaptermanager'; var AdyoulikeAdapter = function AdyoulikeAdapter() { const _VERSION = '0.1'; @@ -198,4 +199,6 @@ AdyoulikeAdapter.createNew = function () { return new AdyoulikeAdapter(); }; +adaptermanager.registerBidAdapter(new AdyoulikeAdapter, 'adyoulike'); + module.exports = AdyoulikeAdapter; diff --git a/test/spec/adapters/adyoulike_spec.js b/test/spec/modules/adyoulikeBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/adyoulike_spec.js rename to test/spec/modules/adyoulikeBidAdapter_spec.js index d702b0ec283..539fd2da85c 100644 --- a/test/spec/adapters/adyoulike_spec.js +++ b/test/spec/modules/adyoulikeBidAdapter_spec.js @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { parse } from '../../../src/url'; -import AdyoulikAdapter from '../../../src/adapters/adyoulike'; +import AdyoulikAdapter from '../../../modules/adyoulikeBidAdapter'; import bidmanager from 'src/bidmanager'; import { STATUS } from 'src/constants'; From 9830c814487c56481eccb73e6a48ae97b89c472a Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 14:30:18 -0600 Subject: [PATCH 031/111] fixed adapter location in some adapters --- modules/adkernelBidAdapter.js | 2 +- modules/appnexusAstBidAdapter.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/adkernelBidAdapter.js b/modules/adkernelBidAdapter.js index 916a8dcf46c..39975a78447 100644 --- a/modules/adkernelBidAdapter.js +++ b/modules/adkernelBidAdapter.js @@ -2,7 +2,7 @@ import bidmanager from 'src/bidmanager'; import bidfactory from 'src/bidfactory'; import * as utils from 'src/utils'; import {ajax} from 'src/ajax'; -import Adapter from 'src/adapters/adapter'; +import Adapter from 'src/adapter'; import adaptermanager from 'src/adaptermanager'; /** diff --git a/modules/appnexusAstBidAdapter.js b/modules/appnexusAstBidAdapter.js index 91d9d68b286..c7434680349 100644 --- a/modules/appnexusAstBidAdapter.js +++ b/modules/appnexusAstBidAdapter.js @@ -1,4 +1,4 @@ -import Adapter from 'src/adapters/adapter'; +import Adapter from 'src/adapter'; import { Renderer } from 'src/Renderer'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; From 14d81a039489878c78db221cbf22e190fcbe1084 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 14:36:26 -0600 Subject: [PATCH 032/111] aol bid adapter converted to module --- adapters.json | 1 - src/adapters/aol.js => modules/aolBidAdapter.js | 13 ++++++++----- .../aol_spec.js => modules/aolBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) rename src/adapters/aol.js => modules/aolBidAdapter.js (96%) rename test/spec/{adapters/aol_spec.js => modules/aolBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 50d3a56976b..cd855a0492a 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,6 @@ [ "bidfluence", "vertamedia", - "aol", "beachfront", "audienceNetwork", "conversant", diff --git a/src/adapters/aol.js b/modules/aolBidAdapter.js similarity index 96% rename from src/adapters/aol.js rename to modules/aolBidAdapter.js index 32039b14362..1f0b3a5bbb0 100644 --- a/src/adapters/aol.js +++ b/modules/aolBidAdapter.js @@ -1,8 +1,9 @@ -const utils = require('../utils.js'); -const ajax = require('../ajax.js').ajax; -const bidfactory = require('../bidfactory.js'); -const bidmanager = require('../bidmanager.js'); -const constants = require('../constants.json'); +const utils = require('src/utils.js'); +const ajax = require('src/ajax.js').ajax; +const bidfactory = require('src/bidfactory.js'); +const bidmanager = require('src/bidmanager.js'); +const constants = require('src/constants.json'); +const adaptermanager = require('src/adaptermanager'); $$PREBID_GLOBAL$$.aolGlobals = { pixelsDropped: false @@ -302,4 +303,6 @@ const AolAdapter = function AolAdapter() { }; }; +adaptermanager.registerBidAdapter(new AolAdapter, 'aol'); + module.exports = AolAdapter; diff --git a/test/spec/adapters/aol_spec.js b/test/spec/modules/aolBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/aol_spec.js rename to test/spec/modules/aolBidAdapter_spec.js index aa41f92b75c..d48de9eb37b 100644 --- a/test/spec/adapters/aol_spec.js +++ b/test/spec/modules/aolBidAdapter_spec.js @@ -1,6 +1,6 @@ import {expect} from 'chai'; import * as utils from 'src/utils'; -import AolAdapter from 'src/adapters/aol'; +import AolAdapter from 'modules/aolBidAdapter'; import bidmanager from 'src/bidmanager'; let getDefaultBidResponse = () => { From a1853eef83d6a06eff64e9ae3a590ab46dfca177 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 14:40:37 -0600 Subject: [PATCH 033/111] atomx bid adapter converted to module --- adapters.json | 1 - .../atomx.js => modules/atomxBidAdapter.js | 14 +++++++++----- .../atomxBidAdapter_spec.js} | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) rename src/adapters/atomx.js => modules/atomxBidAdapter.js (85%) rename test/spec/{adapters/atomx_spec.js => modules/atomxBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index cd855a0492a..cb5174de96a 100644 --- a/adapters.json +++ b/adapters.json @@ -50,7 +50,6 @@ "roxot", "vertoz", "widespace", - "atomx", "tapsense", "trion", "eplanning", diff --git a/src/adapters/atomx.js b/modules/atomxBidAdapter.js similarity index 85% rename from src/adapters/atomx.js rename to modules/atomxBidAdapter.js index 4935382123a..9acf2339af9 100644 --- a/src/adapters/atomx.js +++ b/modules/atomxBidAdapter.js @@ -1,9 +1,10 @@ -var CONSTANTS = require('../constants.json'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); +var CONSTANTS = require('src/constants.json'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); var adloader = require('src/adloader.js'); -var Ajax = require('../ajax'); -var utils = require('../utils.js'); +var Ajax = require('src/ajax'); +var utils = require('src/utils.js'); +var adaptermanager = require('src/adaptermanager'); /** * Adapter for requesting bids from Atomx. @@ -72,4 +73,7 @@ var AtomxAdapter = function AtomxAdapter() { }; }; + +adaptermanager.registerBidAdapter(new AtomxAdapter, 'atomx'); + module.exports = AtomxAdapter; diff --git a/test/spec/adapters/atomx_spec.js b/test/spec/modules/atomxBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/atomx_spec.js rename to test/spec/modules/atomxBidAdapter_spec.js index 7f7059eb0cc..1a62bac28a1 100644 --- a/test/spec/adapters/atomx_spec.js +++ b/test/spec/modules/atomxBidAdapter_spec.js @@ -1,5 +1,5 @@ var chai = require('chai'); -var Adapter = require('src/adapters/atomx')(); +var Adapter = require('modules/atomxBidAdapter')(); var Ajax = require('src/ajax'); var adLoader = require('src/adloader'); var bidmanager = require('src/bidmanager.js'); From 2a9bfd5bd8c35f502ff85a3aae223d8a31f6061d Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 14:46:25 -0600 Subject: [PATCH 034/111] audienceNetwork bid adapter converted to module --- adapters.json | 1 - .../audienceNetworkBidAdapter.js | 17 ++++++++++------- .../audienceNetworkBidAdapter_spec.js} | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) rename src/adapters/audienceNetwork.js => modules/audienceNetworkBidAdapter.js (96%) rename test/spec/{adapters/audienceNetwork_spec.js => modules/audienceNetworkBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index cb5174de96a..72b68178744 100644 --- a/adapters.json +++ b/adapters.json @@ -2,7 +2,6 @@ "bidfluence", "vertamedia", "beachfront", - "audienceNetwork", "conversant", "districtmDMX", "fidelity", diff --git a/src/adapters/audienceNetwork.js b/modules/audienceNetworkBidAdapter.js similarity index 96% rename from src/adapters/audienceNetwork.js rename to modules/audienceNetworkBidAdapter.js index 867f3c6f89a..7e054fe7d54 100644 --- a/src/adapters/audienceNetwork.js +++ b/modules/audienceNetworkBidAdapter.js @@ -1,13 +1,14 @@ /** * @file AudienceNetwork adapter. */ -import { ajax } from '../ajax'; -import { createBid } from '../bidfactory'; -import { addBidResponse } from '../bidmanager'; -import { STATUS } from '../constants.json'; -import { format } from '../url'; -import { logError } from '../utils'; -import { createNew } from './adapter'; +import { ajax } from 'src/ajax'; +import { createBid } from 'src/bidfactory'; +import { addBidResponse } from 'src/bidmanager'; +import { STATUS } from 'src/constants.json'; +import { format } from 'src/url'; +import { logError } from 'src/utils'; +import { createNew } from 'src/adapter'; +import adaptermanager from 'src/adaptermanager'; const { setBidderCode, getBidderCode } = createNew('audienceNetwork'); @@ -201,4 +202,6 @@ const callBids = bidRequest => { */ const AudienceNetwork = () => ({ callBids, setBidderCode, getBidderCode }); +adaptermanager.registerBidAdapter(new AudienceNetwork, 'audienceNetwork'); + module.exports = AudienceNetwork; diff --git a/test/spec/adapters/audienceNetwork_spec.js b/test/spec/modules/audienceNetworkBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/audienceNetwork_spec.js rename to test/spec/modules/audienceNetworkBidAdapter_spec.js index fa8d2b31fb2..0ed80086802 100644 --- a/test/spec/adapters/audienceNetwork_spec.js +++ b/test/spec/modules/audienceNetworkBidAdapter_spec.js @@ -7,7 +7,7 @@ import bidmanager from 'src/bidmanager'; import { STATUS } from 'src/constants.json'; import * as utils from 'src/utils'; -import AudienceNetwork from 'src/adapters/audienceNetwork'; +import AudienceNetwork from 'modules/audienceNetworkBidAdapter'; const bidderCode = 'audienceNetwork'; const placementId = 'test-placement-id'; From 3aa893d581115f84631cf44cfd134f81deee7e08 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 15:24:10 -0600 Subject: [PATCH 035/111] beachfront bid adapter converted to module --- adapters.json | 6 ------ .../beachfront.js => modules/beachfrontBidAdapter.js | 7 ++++++- .../beachfrontBidAdapter_spec.js} | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) rename src/adapters/beachfront.js => modules/beachfrontBidAdapter.js (95%) rename test/spec/{adapters/beachfront_spec.js => modules/beachfrontBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 72b68178744..57c10e5abd8 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,6 @@ [ "bidfluence", "vertamedia", - "beachfront", "conversant", "districtmDMX", "fidelity", @@ -58,11 +57,6 @@ "supportedMediaTypes": ["video"] } }, - { - "beachfront": { - "supportedMediaTypes": ["video"] - } - }, { "adkernel": { "alias": "headbidding" diff --git a/src/adapters/beachfront.js b/modules/beachfrontBidAdapter.js similarity index 95% rename from src/adapters/beachfront.js rename to modules/beachfrontBidAdapter.js index de596f76e7e..059d15ac79d 100644 --- a/src/adapters/beachfront.js +++ b/modules/beachfrontBidAdapter.js @@ -1,9 +1,10 @@ -import Adapter from 'src/adapters/adapter'; +import Adapter from 'src/adapter'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; import { ajax } from 'src/ajax'; import { STATUS } from 'src/constants'; +import adaptermanager from 'src/adaptermanager'; const ENDPOINT = '//reachms.bfmio.com/bid.json?exchange_id='; @@ -132,4 +133,8 @@ BeachfrontAdapter.createNew = function () { return new BeachfrontAdapter(); }; +adaptermanager.registerBidAdapter(new BeachfrontAdapter, 'beachfront', { + supportedMediaTypes: ['video'] +}); + module.exports = BeachfrontAdapter; diff --git a/test/spec/adapters/beachfront_spec.js b/test/spec/modules/beachfrontBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/beachfront_spec.js rename to test/spec/modules/beachfrontBidAdapter_spec.js index 3d5396b7b76..ad313acc84a 100644 --- a/test/spec/adapters/beachfront_spec.js +++ b/test/spec/modules/beachfrontBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import BeachfrontAdapter from 'src/adapters/beachfront'; +import BeachfrontAdapter from 'modules/beachfrontBidAdapter'; import bidmanager from 'src/bidmanager'; const ENDPOINT = '//reachms.bfmio.com/bid.json?exchange_id=11bc5dd5-7421-4dd8-c926-40fa653bec76'; From e6f37db90a8cbdeeee7e701b4cbd4a677990b968 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 15:37:33 -0600 Subject: [PATCH 036/111] bidfluence bid adapter converted to module --- adapters.json | 1 - .../bidfluenceBidAdapter.js | 109 +++++++++--------- .../bidfluenceBidAdapter_spec.js} | 2 +- 3 files changed, 57 insertions(+), 55 deletions(-) rename src/adapters/bidfluence.js => modules/bidfluenceBidAdapter.js (82%) rename test/spec/{adapters/bidfluence_spec.js => modules/bidfluenceBidAdapter_spec.js} (96%) diff --git a/adapters.json b/adapters.json index 57c10e5abd8..ca016b87c5e 100644 --- a/adapters.json +++ b/adapters.json @@ -1,5 +1,4 @@ [ - "bidfluence", "vertamedia", "conversant", "districtmDMX", diff --git a/src/adapters/bidfluence.js b/modules/bidfluenceBidAdapter.js similarity index 82% rename from src/adapters/bidfluence.js rename to modules/bidfluenceBidAdapter.js index c3c32c579f1..da22096b7e6 100644 --- a/src/adapters/bidfluence.js +++ b/modules/bidfluenceBidAdapter.js @@ -1,55 +1,58 @@ -const bidmanager = require('../bidmanager.js'); -const bidfactory = require('../bidfactory.js'); -const utils = require('../utils.js'); -const adloader = require('../adloader'); - +const bidmanager = require('src/bidmanager'); +const bidfactory = require('src/bidfactory'); +const utils = require('src/utils'); +const adloader = require('src/adloader'); +const adaptermanager = require('src/adaptermanager'); + var BidfluenceAdapter = function BidfluenceAdapter() { - const scriptUrl = '//cdn.bidfluence.com/forge.js'; - - $$PREBID_GLOBAL$$.bfPbjsCB = function (bfr) { - var bidRequest = utils.getBidRequest(bfr.cbID); - var bidObject = null; - if (bfr.cpm > 0) { - bidObject = bidfactory.createBid(1, bidRequest); - bidObject.bidderCode = 'bidfluence'; - bidObject.cpm = bfr.cpm; - bidObject.ad = bfr.ad; - bidObject.width = bfr.width; - bidObject.height = bfr.height; - } else { - bidObject = bidfactory.createBid(2, bidRequest); - bidObject.bidderCode = 'bidfluence'; - } - - bidmanager.addBidResponse(bfr.placementCode, bidObject); - }; - - function _callBids(params) { - var bfbids = params.bids || []; - for (var i = 0; i < bfbids.length; i++) { - var bid = bfbids[i]; - call(bid); - } - } + const scriptUrl = '//cdn.bidfluence.com/forge.js'; + + $$PREBID_GLOBAL$$.bfPbjsCB = function (bfr) { + var bidRequest = utils.getBidRequest(bfr.cbID); + var bidObject = null; + if (bfr.cpm > 0) { + bidObject = bidfactory.createBid(1, bidRequest); + bidObject.bidderCode = 'bidfluence'; + bidObject.cpm = bfr.cpm; + bidObject.ad = bfr.ad; + bidObject.width = bfr.width; + bidObject.height = bfr.height; + } else { + bidObject = bidfactory.createBid(2, bidRequest); + bidObject.bidderCode = 'bidfluence'; + } + + bidmanager.addBidResponse(bfr.placementCode, bidObject); + }; + + function _callBids(params) { + var bfbids = params.bids || []; + for (var i = 0; i < bfbids.length; i++) { + var bid = bfbids[i]; + call(bid); + } + } function call(bid) { - var adunitId = utils.getBidIdParameter('adunitId', bid.params); - var publisherId = utils.getBidIdParameter('pubId', bid.params); - var reservePrice = utils.getBidIdParameter('reservePrice', bid.params); - var pbjsBfobj = { - placementCode: bid.placementCode, - cbID: bid.bidId - }; - - var cb = function () { - /* globals FORGE */ - FORGE.init([adunitId, publisherId, pbjsBfobj, reservePrice]); - }; - - adloader.loadScript(scriptUrl, cb); - } - return { - callBids: _callBids - }; -}; - -module.exports = BidfluenceAdapter; + var adunitId = utils.getBidIdParameter('adunitId', bid.params); + var publisherId = utils.getBidIdParameter('pubId', bid.params); + var reservePrice = utils.getBidIdParameter('reservePrice', bid.params); + var pbjsBfobj = { + placementCode: bid.placementCode, + cbID: bid.bidId + }; + + var cb = function () { + /* globals FORGE */ + FORGE.init([adunitId, publisherId, pbjsBfobj, reservePrice]); + }; + + adloader.loadScript(scriptUrl, cb); + } + return { + callBids: _callBids + }; +}; + +adaptermanager.registerBidAdapter(new BidfluenceAdapter, 'bidfluence'); + +module.exports = BidfluenceAdapter; diff --git a/test/spec/adapters/bidfluence_spec.js b/test/spec/modules/bidfluenceBidAdapter_spec.js similarity index 96% rename from test/spec/adapters/bidfluence_spec.js rename to test/spec/modules/bidfluenceBidAdapter_spec.js index 345b760eb3a..f623954fa9f 100644 --- a/test/spec/adapters/bidfluence_spec.js +++ b/test/spec/modules/bidfluenceBidAdapter_spec.js @@ -1,6 +1,6 @@ describe('Bidfluence Adapter', () => { const expect = require('chai').expect; - const adapter = require('src/adapters/bidfluence'); + const adapter = require('modules/bidfluenceBidAdapter'); const bidmanager = require('src/bidmanager'); var REQUEST = { From 7614fc39cf120054ef302049ce9bc506f2165527 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 15:57:46 -0600 Subject: [PATCH 037/111] brightcom bid adapter converted to module --- adapters.json | 1 - .../brightcom.js => modules/brightcomBidAdapter.js | 13 ++++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/brightcom.js => modules/brightcomBidAdapter.js (95%) diff --git a/adapters.json b/adapters.json index ca016b87c5e..b22c1499ed4 100644 --- a/adapters.json +++ b/adapters.json @@ -35,7 +35,6 @@ "twenga", "yieldbot", "nginad", - "brightcom", "wideorbit", "jcm", "underdogmedia", diff --git a/src/adapters/brightcom.js b/modules/brightcomBidAdapter.js similarity index 95% rename from src/adapters/brightcom.js rename to modules/brightcomBidAdapter.js index 23cd6269b40..2f6d30275ea 100644 --- a/src/adapters/brightcom.js +++ b/modules/brightcomBidAdapter.js @@ -1,8 +1,9 @@ -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); /** * Adapter for requesting bids from Brightcom @@ -199,4 +200,6 @@ var BrightcomAdapter = function BrightcomAdapter() { }; }; +adaptermanager.registerBidAdapter(new BrightcomAdapter, 'brightcom'); + module.exports = BrightcomAdapter; From 80a75ff523fa307061a6cdc883f5686cfeff5bfa Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 16:10:41 -0600 Subject: [PATCH 038/111] centro bid adapter converted to module --- adapters.json | 1 - src/adapters/centro.js => modules/centroBidAdapter.js | 11 +++++++---- .../centroBidAdapter_spec.js} | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/centro.js => modules/centroBidAdapter.js (92%) rename test/spec/{adapters/centro_spec.js => modules/centroBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index b22c1499ed4..410bfdc4227 100644 --- a/adapters.json +++ b/adapters.json @@ -40,7 +40,6 @@ "underdogmedia", "memeglobal", "criteo", - "centro", "xhb", "sharethrough", "roxot", diff --git a/src/adapters/centro.js b/modules/centroBidAdapter.js similarity index 92% rename from src/adapters/centro.js rename to modules/centroBidAdapter.js index 903d475d712..5a04f330820 100644 --- a/src/adapters/centro.js +++ b/modules/centroBidAdapter.js @@ -1,7 +1,8 @@ -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); var CentroAdapter = function CentroAdapter() { var baseUrl = '//t.brand-server.com/hb', @@ -114,4 +115,6 @@ var CentroAdapter = function CentroAdapter() { }; }; +adaptermanager.registerBidAdapter(new CentroAdapter, 'centro'); + module.exports = CentroAdapter; diff --git a/test/spec/adapters/centro_spec.js b/test/spec/modules/centroBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/centro_spec.js rename to test/spec/modules/centroBidAdapter_spec.js index 1844e2292ec..53283a92afe 100644 --- a/test/spec/adapters/centro_spec.js +++ b/test/spec/modules/centroBidAdapter_spec.js @@ -4,7 +4,7 @@ describe('centro adapter tests', function () { var urlParse = require('url-parse'); var querystringify = require('querystringify'); - var adapter = require('src/adapters/centro'); + var adapter = require('modules/centroBidAdapter'); var bidmanager = require('src/bidmanager'); var adLoader = require('src/adloader'); var utils = require('src/utils'); From 397399493c8ac1d9091d4bd422bddc258761de73 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 16:11:23 -0600 Subject: [PATCH 039/111] rubicon spec file name changed --- test/spec/modules/{rubicon_spec.js => rubiconBidAdapter_spec.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/spec/modules/{rubicon_spec.js => rubiconBidAdapter_spec.js} (100%) diff --git a/test/spec/modules/rubicon_spec.js b/test/spec/modules/rubiconBidAdapter_spec.js similarity index 100% rename from test/spec/modules/rubicon_spec.js rename to test/spec/modules/rubiconBidAdapter_spec.js From 3ecde27869e940d08efd5406586a5e8c68e13f4b Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 16:16:18 -0600 Subject: [PATCH 040/111] conversant bid adapter converted to module --- adapters.json | 1 - .../conversantBidAdapter.js | 15 +++++++++------ .../conversantBidAdapter_spec.js} | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) rename src/adapters/conversant.js => modules/conversantBidAdapter.js (95%) rename test/spec/{adapters/conversant_spec.js => modules/conversantBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 410bfdc4227..eb906418632 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "conversant", "districtmDMX", "fidelity", "gumgum", diff --git a/src/adapters/conversant.js b/modules/conversantBidAdapter.js similarity index 95% rename from src/adapters/conversant.js rename to modules/conversantBidAdapter.js index 974eb4c8100..1623ec28709 100644 --- a/src/adapters/conversant.js +++ b/modules/conversantBidAdapter.js @@ -1,11 +1,12 @@ 'use strict'; var VERSION = '2.1.0'; -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); -var ajax = require('../ajax').ajax; +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var ajax = require('src/ajax').ajax; +var adaptermanager = require('src/adaptermanager'); /** * Adapter for requesting bids from Conversant @@ -270,4 +271,6 @@ var ConversantAdapter = function () { }; }; +adaptermanager.registerBidAdapter(new ConversantAdapter, 'conversant'); + module.exports = ConversantAdapter; diff --git a/test/spec/adapters/conversant_spec.js b/test/spec/modules/conversantBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/conversant_spec.js rename to test/spec/modules/conversantBidAdapter_spec.js index 09d5132683f..57cd9411e66 100644 --- a/test/spec/adapters/conversant_spec.js +++ b/test/spec/modules/conversantBidAdapter_spec.js @@ -1,5 +1,5 @@ var expect = require('chai').expect; -var Adapter = require('src/adapters/conversant'); +var Adapter = require('modules/conversantBidAdapter'); var bidManager = require('src/bidmanager'); describe('Conversant adapter tests', function () { From 718332567a937b7842794f24a0100c6fe3af8a12 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 16:22:09 -0600 Subject: [PATCH 041/111] criteo bid adapter converted to module --- adapters.json | 1 - src/adapters/criteo.js => modules/criteoBidAdapter.js | 9 ++++++--- .../criteo_spec.js => modules/criteoBidAdapter_spec.js} | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) rename src/adapters/criteo.js => modules/criteoBidAdapter.js (93%) rename test/spec/{adapters/criteo_spec.js => modules/criteoBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index eb906418632..4c76f9996a0 100644 --- a/adapters.json +++ b/adapters.json @@ -38,7 +38,6 @@ "jcm", "underdogmedia", "memeglobal", - "criteo", "xhb", "sharethrough", "roxot", diff --git a/src/adapters/criteo.js b/modules/criteoBidAdapter.js similarity index 93% rename from src/adapters/criteo.js rename to modules/criteoBidAdapter.js index c0e14fb3d51..c380a2885f9 100644 --- a/src/adapters/criteo.js +++ b/modules/criteoBidAdapter.js @@ -1,6 +1,7 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); var CriteoAdapter = function CriteoAdapter() { var sProt = (window.location.protocol === 'http:') ? 'http:' : 'https:'; @@ -134,4 +135,6 @@ var CriteoAdapter = function CriteoAdapter() { }; }; +adaptermanager.registerBidAdapter(new CriteoAdapter, 'criteo'); + module.exports = CriteoAdapter; diff --git a/test/spec/adapters/criteo_spec.js b/test/spec/modules/criteoBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/criteo_spec.js rename to test/spec/modules/criteoBidAdapter_spec.js index 5cf1549eef6..c686f284134 100644 --- a/test/spec/adapters/criteo_spec.js +++ b/test/spec/modules/criteoBidAdapter_spec.js @@ -1,4 +1,4 @@ -import Adapter from '../../../src/adapters/criteo'; +import Adapter from '../../../modules/criteoBidAdapter'; import bidManager from '../../../src/bidmanager'; import {ajax} from '../../../src/ajax' import {expect} from 'chai'; From b662394c906a192e10ff481c0d7258a592231408 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 16:37:13 -0600 Subject: [PATCH 042/111] districtmDMX bid adapter converted to module --- adapters.json | 1 - .../districtmDMX.js => modules/districtmDMXBidAdapter.js | 9 ++++++--- .../districtmDMXBidAdapter_spec.js} | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) rename src/adapters/districtmDMX.js => modules/districtmDMXBidAdapter.js (84%) rename test/spec/{adapters/districtm_spec.js => modules/districtmDMXBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 4c76f9996a0..6265bcb5f16 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "districtmDMX", "fidelity", "gumgum", "hiromedia", diff --git a/src/adapters/districtmDMX.js b/modules/districtmDMXBidAdapter.js similarity index 84% rename from src/adapters/districtmDMX.js rename to modules/districtmDMXBidAdapter.js index d8e78d97401..d07985097ef 100644 --- a/src/adapters/districtmDMX.js +++ b/modules/districtmDMXBidAdapter.js @@ -1,6 +1,7 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adLoader = require('../adloader'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adLoader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); var DistrictmAdaptor = function districtmAdaptor() { let districtmUrl = window.location.protocol + '//prebid.districtm.ca/lib.js'; @@ -50,4 +51,6 @@ var DistrictmAdaptor = function districtmAdaptor() { }; }; +adaptermanager.registerBidAdapter(new DistrictmAdaptor, 'districtmDMX'); + module.exports = DistrictmAdaptor; diff --git a/test/spec/adapters/districtm_spec.js b/test/spec/modules/districtmDMXBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/districtm_spec.js rename to test/spec/modules/districtmDMXBidAdapter_spec.js index 6c703bff191..6fc83d88e6d 100644 --- a/test/spec/adapters/districtm_spec.js +++ b/test/spec/modules/districtmDMXBidAdapter_spec.js @@ -4,7 +4,7 @@ import {expect} from 'chai'; import {should} from 'chai'; -import Adaptor from '../../../src/adapters/districtmDMX'; +import Adaptor from '../../../modules/districtmDMXBidAdapter'; import adLoader from '../../../src/adloader'; From dcd118a900db0720af402a15563e468be9eecc05 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 16:50:54 -0600 Subject: [PATCH 043/111] fidelity bid adapter converted to module --- adapters.json | 1 - .../fidelity.js => modules/fidelityBidAdapter.js | 13 ++++++++----- .../fidelityBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) rename src/adapters/fidelity.js => modules/fidelityBidAdapter.js (91%) rename test/spec/{adapters/fidelity_spec.js => modules/fidelityBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 6265bcb5f16..d3d8acc8bd4 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "fidelity", "gumgum", "hiromedia", "indexExchange", diff --git a/src/adapters/fidelity.js b/modules/fidelityBidAdapter.js similarity index 91% rename from src/adapters/fidelity.js rename to modules/fidelityBidAdapter.js index 0d623bfd162..2bd585c15c1 100644 --- a/src/adapters/fidelity.js +++ b/modules/fidelityBidAdapter.js @@ -1,8 +1,9 @@ -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); -var STATUS = require('../constants').STATUS; +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var STATUS = require('src/constants').STATUS; +var adaptermanager = require('src/adaptermanager'); var FidelityAdapter = function FidelityAdapter() { var FIDELITY_BIDDER_NAME = 'fidelity'; @@ -96,4 +97,6 @@ var FidelityAdapter = function FidelityAdapter() { }; }; +adaptermanager.registerBidAdapter(new FidelityAdapter, 'fidelity'); + module.exports = FidelityAdapter; diff --git a/test/spec/adapters/fidelity_spec.js b/test/spec/modules/fidelityBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/fidelity_spec.js rename to test/spec/modules/fidelityBidAdapter_spec.js index 9e3a3980ed5..5777c6af8cd 100644 --- a/test/spec/adapters/fidelity_spec.js +++ b/test/spec/modules/fidelityBidAdapter_spec.js @@ -1,6 +1,6 @@ describe('fidelity adapter tests', function() { const expect = require('chai').expect; - const adapter = require('src/adapters/fidelity'); + const adapter = require('modules/fidelityBidAdapter'); const adLoader = require('src/adloader'); const bidmanager = require('src/bidmanager'); const STATUS = require('src/constants').STATUS; From ad1d6cd3606155b6fa24bd961c7a47842abefbce Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 9 Jun 2017 16:55:32 -0600 Subject: [PATCH 044/111] getintent bid adapter converted to module --- adapters.json | 6 ------ .../getintent.js => modules/getintentBidAdapter.js | 11 ++++++++--- .../getintentBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) rename src/adapters/getintent.js => modules/getintentBidAdapter.js (87%) rename test/spec/{adapters/getintent_spec.js => modules/getintentBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index d3d8acc8bd4..e55ef35b5d2 100644 --- a/adapters.json +++ b/adapters.json @@ -5,7 +5,6 @@ "indexExchange", "innity", "kruxlink", - "getintent", "inneractive", "komoona", "lifestreet", @@ -55,11 +54,6 @@ "alias": "headbidding" } }, - { - "getintent": { - "supportedMediaTypes" : ["video"] - } - }, { "stickyadstv": { "alias": "freewheel-ssp" diff --git a/src/adapters/getintent.js b/modules/getintentBidAdapter.js similarity index 87% rename from src/adapters/getintent.js rename to modules/getintentBidAdapter.js index 604294a7a22..909b767e508 100644 --- a/src/adapters/getintent.js +++ b/modules/getintentBidAdapter.js @@ -1,8 +1,9 @@ import { STATUS } from 'src/constants'; +import adaptermanager from 'src/adaptermanager'; -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); var GetIntentAdapter = function GetIntentAdapter() { var headerBiddingStaticJS = window.location.protocol + '//cdn.adhigh.net/adserver/hb.js'; @@ -69,4 +70,8 @@ var GetIntentAdapter = function GetIntentAdapter() { }; }; +adaptermanager.registerBidAdapter(new GetIntentAdapter, 'getintent', { + supportedMediaTypes: ['video'] +}); + module.exports = GetIntentAdapter; diff --git a/test/spec/adapters/getintent_spec.js b/test/spec/modules/getintentBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/getintent_spec.js rename to test/spec/modules/getintentBidAdapter_spec.js index 3537564f029..e66d2138eaf 100644 --- a/test/spec/adapters/getintent_spec.js +++ b/test/spec/modules/getintentBidAdapter_spec.js @@ -1,4 +1,4 @@ -import Adapter from '../../../src/adapters/getintent'; +import Adapter from '../../../modules/getintentBidAdapter'; import bidManager from '../../../src/bidmanager'; import {expect} from 'chai'; From fc9d31eaaca74ee85c1b4c90f0005c697fbe67a7 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 09:43:27 -0600 Subject: [PATCH 045/111] gumgum bid adapter converted to module --- adapters.json | 1 - src/adapters/gumgum.js => modules/gumgumBidAdapter.js | 11 +++++++---- .../gumgumBidAdapter_spec.js} | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/gumgum.js => modules/gumgumBidAdapter.js (94%) rename test/spec/{adapters/gumgum_spec.js => modules/gumgumBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index e55ef35b5d2..398cb3ae98f 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "gumgum", "hiromedia", "indexExchange", "innity", diff --git a/src/adapters/gumgum.js b/modules/gumgumBidAdapter.js similarity index 94% rename from src/adapters/gumgum.js rename to modules/gumgumBidAdapter.js index 4196287c520..7d99cfbff69 100644 --- a/src/adapters/gumgum.js +++ b/modules/gumgumBidAdapter.js @@ -1,7 +1,8 @@ -const bidfactory = require('../bidfactory'); -const bidmanager = require('../bidmanager'); -const utils = require('../utils'); -const adloader = require('../adloader'); +const bidfactory = require('src/bidfactory'); +const bidmanager = require('src/bidmanager'); +const utils = require('src/utils'); +const adloader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); const BIDDER_CODE = 'gumgum'; const CALLBACKS = {}; @@ -170,4 +171,6 @@ const GumgumAdapter = function GumgumAdapter() { }; }; +adaptermanager.registerBidAdapter(new GumgumAdapter, 'gumgum'); + module.exports = GumgumAdapter; diff --git a/test/spec/adapters/gumgum_spec.js b/test/spec/modules/gumgumBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/gumgum_spec.js rename to test/spec/modules/gumgumBidAdapter_spec.js index afc62b9c0da..b90a1a48b15 100644 --- a/test/spec/adapters/gumgum_spec.js +++ b/test/spec/modules/gumgumBidAdapter_spec.js @@ -1,5 +1,5 @@ import {expect} from 'chai'; -import Adapter from '../../../src/adapters/gumgum'; +import Adapter from '../../../modules/gumgumBidAdapter'; import bidManager from '../../../src/bidmanager'; import adLoader from '../../../src/adloader'; import * as utils from '../../../src/utils'; From c249da4442da051f39253f3c1f5e234cadce6d17 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 09:46:52 -0600 Subject: [PATCH 046/111] hiromedia bid adapter converted to module --- adapters.json | 1 - .../hiromediaBidAdapter.js | 729 +++++++++--------- .../hiromediaBidAdapter_spec.js} | 626 +++++++-------- 3 files changed, 679 insertions(+), 677 deletions(-) rename src/adapters/hiromedia.js => modules/hiromediaBidAdapter.js (96%) rename test/spec/{adapters/hiromedia_spec.js => modules/hiromediaBidAdapter_spec.js} (96%) diff --git a/adapters.json b/adapters.json index 398cb3ae98f..5be7d27ceda 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "hiromedia", "indexExchange", "innity", "kruxlink", diff --git a/src/adapters/hiromedia.js b/modules/hiromediaBidAdapter.js similarity index 96% rename from src/adapters/hiromedia.js rename to modules/hiromediaBidAdapter.js index 8bef4bc6cd3..5a2fe8a0f8a 100644 --- a/src/adapters/hiromedia.js +++ b/modules/hiromediaBidAdapter.js @@ -1,372 +1,375 @@ /** - * Adapter for HIRO Media - * - * @module HiroMediaAdapter - * - * @requires src/ajax - * @requires src/bidfactory - * @requires src/bidmanager - * @requires src/constants - * @requires src/utils - */ -var Ajax = require('src/ajax'); -var bidfactory = require('src/bidfactory'); -var bidmanager = require('src/bidmanager'); -var utils = require('src/utils'); -var STATUS = require('src/constants').STATUS; - -var HiroMediaAdapter = function HiroMediaAdapter() { - 'use strict'; - - /** - * Bidder code - * - * @memberof module:HiroMediaAdapter~ - * @constant {string} - * @private - */ - var BIDDER_CODE = 'hiromedia'; - - /** - * Adapter version - * - * @memberof module:HiroMediaAdapter~ - * @constant {number} - * @private - */ - var ADAPTER_VERSION = 3; - - /** - * Default bid param values - * - * @memberof module:HiroMediaAdapter~ - * @constant {array.} - * @private - */ - var REQUIRED_BID_PARAMS = ['accountId']; - - /** - * Default bid param values - * - * @memberof module:HiroMediaAdapter~ - * @constant {module:HiroMediaAdapter~bidParams} - * @private - */ - var DEFAULT_BID_PARAMS = { - bidUrl: 'https://hb-rtb.ktdpublishers.com/bid/get' - }; - - /** - * Returns true if the given value is `undefined` - * - * @memberof module:HiroMediaAdapter~ - * @private - * - * @param {*} value value to check - * @return {boolean} true if the given value is `undefined`, false otherwise - */ - function isUndefined(value) { - return typeof value === 'undefined'; - } - - /** - * Call bidmanager.addBidResponse - * - * Simple wrapper that will create a bid object with the correct status - * and add the response for the placement. - * - * @memberof module:HiroMediaAdapter~ - * @private - * - * @param {object} bid bid object connected to the response - * @param {object|boolean} [bidResponse] response object for bid, if not - * set the response will be an empty bid response. - */ - function addBidResponse(bid, bidResponse) { - var placementCode = bid.placementCode; - var bidStatus = bidResponse ? STATUS.GOOD : STATUS.NO_BID; - var bidObject = bidfactory.createBid(bidStatus, bid); - - bidObject.bidderCode = BIDDER_CODE; - - if (bidResponse) { - bidObject.cpm = bidResponse.cpm; - bidObject.ad = bidResponse.ad; - bidObject.width = bidResponse.width; - bidObject.height = bidResponse.height; - } - - utils.logMessage('hiromedia.callBids, addBidResponse for ' + placementCode + ' status: ' + bidStatus); - bidmanager.addBidResponse(placementCode, bidObject); - } - - /** - * Return `true` if sampling is larger than a newly created random value - * - * @memberof module:HiroMediaAdapter~ - * @private - * - * @param {number} sampling the value to check - * @return {boolean} `true` if the sampling is larger, `false` otherwise - */ - function checkChance(sampling) { - return Math.random() < sampling; - } - - /** - * Apply a response for all pending bids that have the same response batch key - * - * @memberof module:HiroMediaAdapter~ - * @private - * - * @param {object} response bid response object - * @param {object} bid bid object connected to response - */ - function handleResponse(response, bid) { - // Sample the bid responses according to `response.chance`, - // if `response.chance` is not provided, sample at 100%. - if (isUndefined(response.chance) || checkChance(response.chance)) { - addBidResponse(bid, response); - } else { - addBidResponse(bid, false); - } - } - - /** - * Find browser name and version - * - * Super basic UA parser for the major browser configurations. - * - * @memberof module:HiroMediaAdapter~ - * @private - * - * @return {module:HiroMediaAdapter~browserInfo} object containing name and version of browser - * or empty strings. - */ - function getBrowser() { - var ua = navigator.userAgent; - var browsers = [{ - name: 'Mobile', - stringSearch: 'Mobi' - }, { - name: 'Edge' - }, { - name: 'Chrome' - }, { - name: 'Firefox' - }, { - name: 'IE', - versionSearch: /MSIE\s(\d+)/ - }, { - name: 'IE', - stringSearch: 'Trident', - versionSearch: /rv:(\d+)/ - }]; - - var name = ''; - var version = ''; - - browsers.some(function (browser) { - var nameSearch = browser.stringSearch || browser.name; - var defaultVersionSearch = nameSearch + '\\/(\\d+)'; - var versionSearch = browser.versionSearch || defaultVersionSearch; - var versionMatch; - - if (ua.indexOf(nameSearch) !== -1) { - name = browser.name; - versionMatch = ua.match(versionSearch); - if (versionMatch) { - version = versionMatch && versionMatch[1]; - } - return true; - } - }); - - return { - name: name, - version: version - }; - } - - /** - * Return top context domain - * - * @memberof module:HiroMediaAdapter~ - * @private - * - * @return {string} domain of top context url. - */ - function getDomain() { - var a = document.createElement('a'); - a.href = utils.getTopWindowUrl(); - return a.hostname; - } - - /** - * Apply default parameters to an object if the parameters are not set - * - * @memberof module:HiroMediaAdapter~ - * @private - * - * @param {module:HiroMediaAdapter~bidParams} bidParams custom parameters for bid - * @return {module:HiroMediaAdapter~bidParams} `bidParams` shallow merged with - * {@linkcode module:HiroMediaAdapter~DEFAULT_BID_PARAMS|DEFAULT_BID_PARAMS} - */ - function defaultParams(bidParams) { - return Object.assign({}, DEFAULT_BID_PARAMS, bidParams); - } - - /** - * Build a {@linkcode module:HiroMediaAdapter~bidInfo|bidInfo} object based on a - * bid sent to {@linkcode module:HiroMediaAdapter#callBids|callBids} - * - * @memberof module:HiroMediaAdapter~ - * @private - * - * @param {object} bid bid from `Prebid.js` - * @return {module:HiroMediaAdapter~bidInfo} information for bid request - */ - function processBid(bid) { - var sizes = utils.parseSizesInput(bid.sizes); - var bidParams = defaultParams(bid.params); - var hasValidBidRequest = utils.hasValidBidRequest(bidParams, REQUIRED_BID_PARAMS, BIDDER_CODE); - var shouldBid = hasValidBidRequest; - var bidInfo = { - bidParams: bidParams, - shouldBid: shouldBid, - selectedSize: sizes[0], - additionalSizes: sizes.slice(1).join(',') - }; - - return bidInfo; - } - - /** - * Wrapper around `JSON.parse()` that returns false on error - * - * @memberof module:HiroMediaAdapter~ - * @private - * - * @param {string} text potential JSON string to convert to object - * @return {object|boolean} object parsed from text or `false` in case of and error - */ - function tryJson(text) { - var object = false; - - try { - object = JSON.parse(text); - } catch (ignore) { - // Ignored - } - - return object; - } - - /** - * Receive a set of bid placements and create bid requests and responses accordingly - * - * @alias module:HiroMediaAdapter#callBids - * - * @param {object} params placement and bid data from `Prebid.js` - */ - function _callBids(params) { - var browser = getBrowser(); - var domain = getDomain(); - var bids = params && params.bids; - var ajaxOptions = { - method: 'GET', - withCredentials: true - }; - - // Fixed data, shared by all requests - var fixedRequest = { - adapterVersion: ADAPTER_VERSION, - browser: browser.name, - browserVersion: browser.version, - domain: domain - }; - - utils.logMessage('hiromedia.callBids'); - - if (bids && bids.length) { - bids.forEach(function (bid) { - var bidInfo = processBid(bid); - var bidParams = bidInfo.bidParams; - utils.logMessage('hiromedia.callBids, bidInfo ' + bid.placementCode + ' ' + bidInfo.shouldBid); + * Adapter for HIRO Media + * + * @module HiroMediaAdapter + * + * @requires src/ajax + * @requires src/bidfactory + * @requires src/bidmanager + * @requires src/constants + * @requires src/utils + */ +var Ajax = require('src/ajax'); +var bidfactory = require('src/bidfactory'); +var bidmanager = require('src/bidmanager'); +var utils = require('src/utils'); +var STATUS = require('src/constants').STATUS; +var adaptermanager = require('src/adaptermanager'); + +var HiroMediaAdapter = function HiroMediaAdapter() { + 'use strict'; + + /** + * Bidder code + * + * @memberof module:HiroMediaAdapter~ + * @constant {string} + * @private + */ + var BIDDER_CODE = 'hiromedia'; + + /** + * Adapter version + * + * @memberof module:HiroMediaAdapter~ + * @constant {number} + * @private + */ + var ADAPTER_VERSION = 3; + + /** + * Default bid param values + * + * @memberof module:HiroMediaAdapter~ + * @constant {array.} + * @private + */ + var REQUIRED_BID_PARAMS = ['accountId']; + + /** + * Default bid param values + * + * @memberof module:HiroMediaAdapter~ + * @constant {module:HiroMediaAdapter~bidParams} + * @private + */ + var DEFAULT_BID_PARAMS = { + bidUrl: 'https://hb-rtb.ktdpublishers.com/bid/get' + }; + + /** + * Returns true if the given value is `undefined` + * + * @memberof module:HiroMediaAdapter~ + * @private + * + * @param {*} value value to check + * @return {boolean} true if the given value is `undefined`, false otherwise + */ + function isUndefined(value) { + return typeof value === 'undefined'; + } + + /** + * Call bidmanager.addBidResponse + * + * Simple wrapper that will create a bid object with the correct status + * and add the response for the placement. + * + * @memberof module:HiroMediaAdapter~ + * @private + * + * @param {object} bid bid object connected to the response + * @param {object|boolean} [bidResponse] response object for bid, if not + * set the response will be an empty bid response. + */ + function addBidResponse(bid, bidResponse) { + var placementCode = bid.placementCode; + var bidStatus = bidResponse ? STATUS.GOOD : STATUS.NO_BID; + var bidObject = bidfactory.createBid(bidStatus, bid); + + bidObject.bidderCode = BIDDER_CODE; + + if (bidResponse) { + bidObject.cpm = bidResponse.cpm; + bidObject.ad = bidResponse.ad; + bidObject.width = bidResponse.width; + bidObject.height = bidResponse.height; + } + + utils.logMessage('hiromedia.callBids, addBidResponse for ' + placementCode + ' status: ' + bidStatus); + bidmanager.addBidResponse(placementCode, bidObject); + } + + /** + * Return `true` if sampling is larger than a newly created random value + * + * @memberof module:HiroMediaAdapter~ + * @private + * + * @param {number} sampling the value to check + * @return {boolean} `true` if the sampling is larger, `false` otherwise + */ + function checkChance(sampling) { + return Math.random() < sampling; + } + + /** + * Apply a response for all pending bids that have the same response batch key + * + * @memberof module:HiroMediaAdapter~ + * @private + * + * @param {object} response bid response object + * @param {object} bid bid object connected to response + */ + function handleResponse(response, bid) { + // Sample the bid responses according to `response.chance`, + // if `response.chance` is not provided, sample at 100%. + if (isUndefined(response.chance) || checkChance(response.chance)) { + addBidResponse(bid, response); + } else { + addBidResponse(bid, false); + } + } + + /** + * Find browser name and version + * + * Super basic UA parser for the major browser configurations. + * + * @memberof module:HiroMediaAdapter~ + * @private + * + * @return {module:HiroMediaAdapter~browserInfo} object containing name and version of browser + * or empty strings. + */ + function getBrowser() { + var ua = navigator.userAgent; + var browsers = [{ + name: 'Mobile', + stringSearch: 'Mobi' + }, { + name: 'Edge' + }, { + name: 'Chrome' + }, { + name: 'Firefox' + }, { + name: 'IE', + versionSearch: /MSIE\s(\d+)/ + }, { + name: 'IE', + stringSearch: 'Trident', + versionSearch: /rv:(\d+)/ + }]; + + var name = ''; + var version = ''; + + browsers.some(function (browser) { + var nameSearch = browser.stringSearch || browser.name; + var defaultVersionSearch = nameSearch + '\\/(\\d+)'; + var versionSearch = browser.versionSearch || defaultVersionSearch; + var versionMatch; + + if (ua.indexOf(nameSearch) !== -1) { + name = browser.name; + versionMatch = ua.match(versionSearch); + if (versionMatch) { + version = versionMatch && versionMatch[1]; + } + return true; + } + }); + + return { + name: name, + version: version + }; + } + + /** + * Return top context domain + * + * @memberof module:HiroMediaAdapter~ + * @private + * + * @return {string} domain of top context url. + */ + function getDomain() { + var a = document.createElement('a'); + a.href = utils.getTopWindowUrl(); + return a.hostname; + } + + /** + * Apply default parameters to an object if the parameters are not set + * + * @memberof module:HiroMediaAdapter~ + * @private + * + * @param {module:HiroMediaAdapter~bidParams} bidParams custom parameters for bid + * @return {module:HiroMediaAdapter~bidParams} `bidParams` shallow merged with + * {@linkcode module:HiroMediaAdapter~DEFAULT_BID_PARAMS|DEFAULT_BID_PARAMS} + */ + function defaultParams(bidParams) { + return Object.assign({}, DEFAULT_BID_PARAMS, bidParams); + } + + /** + * Build a {@linkcode module:HiroMediaAdapter~bidInfo|bidInfo} object based on a + * bid sent to {@linkcode module:HiroMediaAdapter#callBids|callBids} + * + * @memberof module:HiroMediaAdapter~ + * @private + * + * @param {object} bid bid from `Prebid.js` + * @return {module:HiroMediaAdapter~bidInfo} information for bid request + */ + function processBid(bid) { + var sizes = utils.parseSizesInput(bid.sizes); + var bidParams = defaultParams(bid.params); + var hasValidBidRequest = utils.hasValidBidRequest(bidParams, REQUIRED_BID_PARAMS, BIDDER_CODE); + var shouldBid = hasValidBidRequest; + var bidInfo = { + bidParams: bidParams, + shouldBid: shouldBid, + selectedSize: sizes[0], + additionalSizes: sizes.slice(1).join(',') + }; + + return bidInfo; + } + + /** + * Wrapper around `JSON.parse()` that returns false on error + * + * @memberof module:HiroMediaAdapter~ + * @private + * + * @param {string} text potential JSON string to convert to object + * @return {object|boolean} object parsed from text or `false` in case of and error + */ + function tryJson(text) { + var object = false; + + try { + object = JSON.parse(text); + } catch (ignore) { + // Ignored + } + + return object; + } + + /** + * Receive a set of bid placements and create bid requests and responses accordingly + * + * @alias module:HiroMediaAdapter#callBids + * + * @param {object} params placement and bid data from `Prebid.js` + */ + function _callBids(params) { + var browser = getBrowser(); + var domain = getDomain(); + var bids = params && params.bids; + var ajaxOptions = { + method: 'GET', + withCredentials: true + }; + + // Fixed data, shared by all requests + var fixedRequest = { + adapterVersion: ADAPTER_VERSION, + browser: browser.name, + browserVersion: browser.version, + domain: domain + }; + + utils.logMessage('hiromedia.callBids'); + + if (bids && bids.length) { + bids.forEach(function (bid) { + var bidInfo = processBid(bid); + var bidParams = bidInfo.bidParams; + utils.logMessage('hiromedia.callBids, bidInfo ' + bid.placementCode + ' ' + bidInfo.shouldBid); if (bidInfo.shouldBid) { - var url = bidParams.bidUrl; - var requestParams = Object.assign({}, fixedRequest, bidInfo.bidParams, { - placementCode: bid.placementCode, - selectedSize: bidInfo.selectedSize, - additionalSizes: bidInfo.additionalSizes + var url = bidParams.bidUrl; + var requestParams = Object.assign({}, fixedRequest, bidInfo.bidParams, { + placementCode: bid.placementCode, + selectedSize: bidInfo.selectedSize, + additionalSizes: bidInfo.additionalSizes }); Object.keys(requestParams).forEach(function (key) { - if (requestParams[key] === '' || isUndefined(requestParams[key])) { - delete requestParams[key]; - } + if (requestParams[key] === '' || isUndefined(requestParams[key])) { + delete requestParams[key]; + } }); - utils.logMessage('hiromedia.callBids, bid request ' + url + ' ' + JSON.stringify(bidInfo.bidRequest)); - - Ajax.ajax(url, { - - success: function(responseText) { + utils.logMessage('hiromedia.callBids, bid request ' + url + ' ' + JSON.stringify(bidInfo.bidRequest)); + + Ajax.ajax(url, { + + success: function(responseText) { var response = tryJson(responseText); - handleResponse(response, bid); - }, - - error: function(err, xhr) { - utils.logError('hiromedia.callBids, bid request error', xhr.status, err); + handleResponse(response, bid); + }, + + error: function(err, xhr) { + utils.logError('hiromedia.callBids, bid request error', xhr.status, err); addBidResponse(bid, false); - } - - }, requestParams, ajaxOptions); - } else { - // No bid - addBidResponse(bid, false); - } - }); - } - } - - return { - callBids: _callBids - }; - - - // JSDoc typedefs - - /** - * Parameters for bids to HIRO Media adapter - * - * @typedef {object} module:HiroMediaAdapter~bidParams - * @private - * - * @property {string} bidUrl the bid server endpoint url - */ - - /** - * Bid object wrapper - * - * @typedef {object} module:HiroMediaAdapter~bidInfo - * @private - * - * @property {string} selectedSize the first size in the the placement sizes array - * @property {string} additionalSizes list of sizes in the placement sizes array besides the first - * @property {module:HiroMediaAdapter~bidParams} bidParams original params passed for bid in #callBids - * @property {boolean} shouldBid flag to determine if the bid is valid for bidding or not - */ - - /** - * browserInfo - * - * @typedef {object} module:HiroMediaAdapter~browserInfo - * @private - * - * @property {string} name browser name (e.g. `'Chrome'` or `'Firefox'`) - * @property {string} version browser major version (e.g. `'53'`) - */ -}; - -module.exports = HiroMediaAdapter; + } + + }, requestParams, ajaxOptions); + } else { + // No bid + addBidResponse(bid, false); + } + }); + } + } + + return { + callBids: _callBids + }; + + + // JSDoc typedefs + + /** + * Parameters for bids to HIRO Media adapter + * + * @typedef {object} module:HiroMediaAdapter~bidParams + * @private + * + * @property {string} bidUrl the bid server endpoint url + */ + + /** + * Bid object wrapper + * + * @typedef {object} module:HiroMediaAdapter~bidInfo + * @private + * + * @property {string} selectedSize the first size in the the placement sizes array + * @property {string} additionalSizes list of sizes in the placement sizes array besides the first + * @property {module:HiroMediaAdapter~bidParams} bidParams original params passed for bid in #callBids + * @property {boolean} shouldBid flag to determine if the bid is valid for bidding or not + */ + + /** + * browserInfo + * + * @typedef {object} module:HiroMediaAdapter~browserInfo + * @private + * + * @property {string} name browser name (e.g. `'Chrome'` or `'Firefox'`) + * @property {string} version browser major version (e.g. `'53'`) + */ +}; + +adaptermanager.registerBidAdapter(new HiroMediaAdapter, 'hiromedia'); + +module.exports = HiroMediaAdapter; diff --git a/test/spec/adapters/hiromedia_spec.js b/test/spec/modules/hiromediaBidAdapter_spec.js similarity index 96% rename from test/spec/adapters/hiromedia_spec.js rename to test/spec/modules/hiromediaBidAdapter_spec.js index 643379b4ff2..c1ed4ee6e11 100644 --- a/test/spec/adapters/hiromedia_spec.js +++ b/test/spec/modules/hiromediaBidAdapter_spec.js @@ -1,331 +1,331 @@ import { expect } from 'chai'; -import urlParse from 'url-parse'; - -import Adapter from 'src/adapters/hiromedia'; -import bidmanager from 'src/bidmanager'; -import { STATUS } from 'src/constants'; -import * as utils from 'src/utils'; - -describe('hiromedia adapter', function () { - const BIDDER_CODE = 'hiromedia'; - const DEFAULT_ENDPOINT = 'https://hb-rtb.ktdpublishers.com/bid/get'; - - let adapter; - let sandbox; - let xhr; - let addBidResponseStub; - let hasValidBidRequestSpy; - let placementId = 0; - - window.$$PREBID_GLOBAL$$ = window.$$PREBID_GLOBAL$$ || {}; - - beforeEach(() => { - adapter = new Adapter(); - sandbox = sinon.sandbox.create(); - - // Used to spy on bid requests - xhr = sandbox.useFakeXMLHttpRequest(); - - // Used to spy on bid responses - addBidResponseStub = sandbox.stub(bidmanager, 'addBidResponse'); - - // Used to spy on bid validation - hasValidBidRequestSpy = sandbox.spy(utils, 'hasValidBidRequest'); - - placementId = 0; - }); - - afterEach(() => { - sandbox.restore(); - }); - - // Helper function that asserts that no bidding activity (requests nor responses) - // was made during a test. - const assertNoBids = () => { - expect(xhr.requests.length).to.be.equal(0); - sinon.assert.notCalled(addBidResponseStub); - }; - - // Helper function to generate a 'mock' bid object - const makePlacement = (size) => { - placementId += 1; - - return { - bidder: BIDDER_CODE, - sizes: [size], - params: { - accountId: '1337' - }, - placementCode: 'div-gpt-ad-12345-' + placementId - }; - }; - - // 300x250 are in the allowed size by default - const tilePlacement = () => makePlacement([300, 250]); - - // anything else should have no bid by default - const leaderPlacement = () => makePlacement([728, 90]); - - describe('callbids', () => { - it('exists and is a function', () => { - expect(adapter.callBids).to.exist.and.to.be.a('function'); - }); - - it('tolerates empty arguments', () => { - expect(adapter.callBids).to.not.throw(Error); - assertNoBids(); - }); - - it('tolerates empty params', () => { - expect(adapter.callBids.bind(adapter, {})).to.not.throw(Error); - assertNoBids(); - }); - - it('tolerates empty bids', () => { - expect(adapter.callBids.bind(adapter, {bids: []})).to.not.throw(Error); - assertNoBids(); - }); - - it('invokes a bid request per placement', () => { - const expectedRequests = [{ - placementCode: 'div-gpt-ad-12345-1', - selectedSize: '300x250' - }, { - placementCode: 'div-gpt-ad-12345-2', - selectedSize: '728x90' - }, { - placementCode: 'div-gpt-ad-12345-3', - selectedSize: '300x250' - }]; - - const params = { - bids: [tilePlacement(), leaderPlacement(), tilePlacement()] - }; - - adapter.callBids(params); - expect(xhr.requests.length).to.equal(3); - sinon.assert.notCalled(addBidResponseStub); - sinon.assert.calledThrice(hasValidBidRequestSpy); - - expectedRequests.forEach(function(request, index) { - expect(hasValidBidRequestSpy.returnValues[index]).to.be.equal(true); - - // validate request - const bidRequest = xhr.requests[index].url; - const defaultBidUrl = urlParse(DEFAULT_ENDPOINT); - const bidUrl = urlParse(bidRequest, true); - const query = bidUrl.query; - - expect(bidUrl.hostname).to.equal(defaultBidUrl.hostname); - expect(bidUrl.pathname).to.equal(defaultBidUrl.pathname); - - expect(query).to.have.property('adapterVersion').and.to.equal('3'); - expect(query).to.have.property('placementCode').and.to.equal(request.placementCode); - expect(query).to.have.property('accountId').and.to.equal('1337'); - expect(query).to.have.property('selectedSize').and.to.equal(request.selectedSize); - expect(query).to.not.have.property('additionalSizes'); - expect(query).to.have.property('domain').and.to.equal(window.top.location.hostname); - }); - }); - - // Test additionalSizes parameter - it('attaches multiple sizes to additionalSizes', () => { - const placement = tilePlacement(); - - // Append additional - placement.sizes.push([300, 600]); - placement.sizes.push([300, 900]); - - const params = { - bids: [placement] - }; - - adapter.callBids(params); - expect(xhr.requests.length).to.be.equal(1); - - const bidRequest = xhr.requests[0].url; - const bidUrl = urlParse(bidRequest, true); - const query = bidUrl.query; - - expect(query).to.have.property('selectedSize').and.to.equal('300x250'); - expect(query).to.have.property('additionalSizes').and.to.equal('300x600,300x900'); - }); - - // Test `params.accountId` validation - it('invalidates bids with no id', () => { - const placement = tilePlacement(); - delete placement.params; - - const params = { - bids: [placement] - }; - - adapter.callBids(params); - expect(xhr.requests.length).to.be.equal(0); - sinon.assert.calledOnce(hasValidBidRequestSpy); - sinon.assert.calledOnce(addBidResponseStub); - - expect(hasValidBidRequestSpy.returnValues[0]).to.be.equal(false); - const placementCode = addBidResponseStub.getCall(0).args[0]; - const bidObject = addBidResponseStub.getCall(0).args[1]; - - expect(placementCode).to.be.equal('div-gpt-ad-12345-1'); - expect(bidObject.getStatusCode()).to.be.equal(STATUS.NO_BID); - }); - - // Test `params.bidUrl` - it('accepts a custom bid endpoint url', () => { - const placement = tilePlacement(); - placement.params.bidUrl = DEFAULT_ENDPOINT + '?someparam=value'; - - const params = { - bids: [placement] - }; - - adapter.callBids(params); - expect(xhr.requests.length).to.be.equal(1); - - const bidRequest = xhr.requests[0].url; - const defaultBidUrl = urlParse(DEFAULT_ENDPOINT); - const bidUrl = urlParse(bidRequest, true); - const query = bidUrl.query; - - expect(bidUrl.hostname).to.equal(defaultBidUrl.hostname); - expect(bidUrl.pathname).to.equal(defaultBidUrl.pathname); - - expect(query).to.have.property('someparam').and.to.equal('value'); +import urlParse from 'url-parse'; + +import Adapter from 'modules/hiromediaBidAdapter'; +import bidmanager from 'src/bidmanager'; +import { STATUS } from 'src/constants'; +import * as utils from 'src/utils'; + +describe('hiromedia adapter', function () { + const BIDDER_CODE = 'hiromedia'; + const DEFAULT_ENDPOINT = 'https://hb-rtb.ktdpublishers.com/bid/get'; + + let adapter; + let sandbox; + let xhr; + let addBidResponseStub; + let hasValidBidRequestSpy; + let placementId = 0; + + window.$$PREBID_GLOBAL$$ = window.$$PREBID_GLOBAL$$ || {}; + + beforeEach(() => { + adapter = new Adapter(); + sandbox = sinon.sandbox.create(); + + // Used to spy on bid requests + xhr = sandbox.useFakeXMLHttpRequest(); + + // Used to spy on bid responses + addBidResponseStub = sandbox.stub(bidmanager, 'addBidResponse'); + + // Used to spy on bid validation + hasValidBidRequestSpy = sandbox.spy(utils, 'hasValidBidRequest'); + + placementId = 0; + }); + + afterEach(() => { + sandbox.restore(); + }); + + // Helper function that asserts that no bidding activity (requests nor responses) + // was made during a test. + const assertNoBids = () => { + expect(xhr.requests.length).to.be.equal(0); + sinon.assert.notCalled(addBidResponseStub); + }; + + // Helper function to generate a 'mock' bid object + const makePlacement = (size) => { + placementId += 1; + + return { + bidder: BIDDER_CODE, + sizes: [size], + params: { + accountId: '1337' + }, + placementCode: 'div-gpt-ad-12345-' + placementId + }; + }; + + // 300x250 are in the allowed size by default + const tilePlacement = () => makePlacement([300, 250]); + + // anything else should have no bid by default + const leaderPlacement = () => makePlacement([728, 90]); + + describe('callbids', () => { + it('exists and is a function', () => { + expect(adapter.callBids).to.exist.and.to.be.a('function'); + }); + + it('tolerates empty arguments', () => { + expect(adapter.callBids).to.not.throw(Error); + assertNoBids(); + }); + + it('tolerates empty params', () => { + expect(adapter.callBids.bind(adapter, {})).to.not.throw(Error); + assertNoBids(); + }); + + it('tolerates empty bids', () => { + expect(adapter.callBids.bind(adapter, {bids: []})).to.not.throw(Error); + assertNoBids(); + }); + + it('invokes a bid request per placement', () => { + const expectedRequests = [{ + placementCode: 'div-gpt-ad-12345-1', + selectedSize: '300x250' + }, { + placementCode: 'div-gpt-ad-12345-2', + selectedSize: '728x90' + }, { + placementCode: 'div-gpt-ad-12345-3', + selectedSize: '300x250' + }]; + + const params = { + bids: [tilePlacement(), leaderPlacement(), tilePlacement()] + }; + + adapter.callBids(params); + expect(xhr.requests.length).to.equal(3); + sinon.assert.notCalled(addBidResponseStub); + sinon.assert.calledThrice(hasValidBidRequestSpy); + + expectedRequests.forEach(function(request, index) { + expect(hasValidBidRequestSpy.returnValues[index]).to.be.equal(true); + + // validate request + const bidRequest = xhr.requests[index].url; + const defaultBidUrl = urlParse(DEFAULT_ENDPOINT); + const bidUrl = urlParse(bidRequest, true); + const query = bidUrl.query; + + expect(bidUrl.hostname).to.equal(defaultBidUrl.hostname); + expect(bidUrl.pathname).to.equal(defaultBidUrl.pathname); + + expect(query).to.have.property('adapterVersion').and.to.equal('3'); + expect(query).to.have.property('placementCode').and.to.equal(request.placementCode); + expect(query).to.have.property('accountId').and.to.equal('1337'); + expect(query).to.have.property('selectedSize').and.to.equal(request.selectedSize); + expect(query).to.not.have.property('additionalSizes'); + expect(query).to.have.property('domain').and.to.equal(window.top.location.hostname); + }); + }); + + // Test additionalSizes parameter + it('attaches multiple sizes to additionalSizes', () => { + const placement = tilePlacement(); + + // Append additional + placement.sizes.push([300, 600]); + placement.sizes.push([300, 900]); + + const params = { + bids: [placement] + }; + + adapter.callBids(params); + expect(xhr.requests.length).to.be.equal(1); + + const bidRequest = xhr.requests[0].url; + const bidUrl = urlParse(bidRequest, true); + const query = bidUrl.query; + + expect(query).to.have.property('selectedSize').and.to.equal('300x250'); + expect(query).to.have.property('additionalSizes').and.to.equal('300x600,300x900'); + }); + + // Test `params.accountId` validation + it('invalidates bids with no id', () => { + const placement = tilePlacement(); + delete placement.params; + + const params = { + bids: [placement] + }; + + adapter.callBids(params); + expect(xhr.requests.length).to.be.equal(0); + sinon.assert.calledOnce(hasValidBidRequestSpy); + sinon.assert.calledOnce(addBidResponseStub); + + expect(hasValidBidRequestSpy.returnValues[0]).to.be.equal(false); + const placementCode = addBidResponseStub.getCall(0).args[0]; + const bidObject = addBidResponseStub.getCall(0).args[1]; + + expect(placementCode).to.be.equal('div-gpt-ad-12345-1'); + expect(bidObject.getStatusCode()).to.be.equal(STATUS.NO_BID); + }); + + // Test `params.bidUrl` + it('accepts a custom bid endpoint url', () => { + const placement = tilePlacement(); + placement.params.bidUrl = DEFAULT_ENDPOINT + '?someparam=value'; + + const params = { + bids: [placement] + }; + + adapter.callBids(params); + expect(xhr.requests.length).to.be.equal(1); + + const bidRequest = xhr.requests[0].url; + const defaultBidUrl = urlParse(DEFAULT_ENDPOINT); + const bidUrl = urlParse(bidRequest, true); + const query = bidUrl.query; + + expect(bidUrl.hostname).to.equal(defaultBidUrl.hostname); + expect(bidUrl.pathname).to.equal(defaultBidUrl.pathname); + + expect(query).to.have.property('someparam').and.to.equal('value'); }); }); describe('response handler', () => { let server; - beforeEach(() => { - server = sandbox.useFakeServer(); + beforeEach(() => { + server = sandbox.useFakeServer(); }); const assertSingleFailedBidResponse = () => { - sinon.assert.calledOnce(addBidResponseStub); - const placementCode = addBidResponseStub.getCall(0).args[0]; - const bidObject = addBidResponseStub.getCall(0).args[1]; - - expect(placementCode).to.be.equal('div-gpt-ad-12345-1'); + sinon.assert.calledOnce(addBidResponseStub); + const placementCode = addBidResponseStub.getCall(0).args[0]; + const bidObject = addBidResponseStub.getCall(0).args[1]; + + expect(placementCode).to.be.equal('div-gpt-ad-12345-1'); expect(bidObject.getStatusCode()).to.be.equal(STATUS.NO_BID); - }; - + }; + it('tolerates an empty response', () => { - server.respondWith(''); - adapter.callBids({bids: [tilePlacement()]}); - server.respond(); - + server.respondWith(''); + adapter.callBids({bids: [tilePlacement()]}); + server.respond(); + assertSingleFailedBidResponse(); - }); - + }); + it('tolerates a response error', () => { - server.respondWith([500, {}, '']); - adapter.callBids({bids: [tilePlacement()]}); - server.respond(); - + server.respondWith([500, {}, '']); + adapter.callBids({bids: [tilePlacement()]}); + server.respond(); + assertSingleFailedBidResponse(); - }); - + }); + it('tolerates an invalid response', () => { - server.respondWith('not json'); - adapter.callBids({bids: [tilePlacement()]}); - server.respond(); - + server.respondWith('not json'); + adapter.callBids({bids: [tilePlacement()]}); + server.respond(); + assertSingleFailedBidResponse(); - }); - - it('adds a bid reponse for each pending bid', () => { - const responses = [{ - width: '300', - height: '250', - cpm: 0.4, - ad: '' - }, { - width: '728', - height: '90', - cpm: 0.4, - ad: '' - }]; - - let id = 0; - server.respondWith((request) => { - request.respond(200, {}, JSON.stringify(responses[id])); - id += 1; - }); - - const params = { - bids: [tilePlacement(), leaderPlacement()] - }; - - adapter.callBids(params); - server.respond(); - - expect(server.requests.length).to.be.equal(2); - sinon.assert.calledTwice(addBidResponseStub); - - responses.forEach((expectedResponse, i) => { - const placementCode = addBidResponseStub.getCall(i).args[0]; - const bidObject = addBidResponseStub.getCall(i).args[1]; - - expect(placementCode).to.be.equal('div-gpt-ad-12345-' + (i + 1)); - - expect(bidObject.getStatusCode()).to.be.equal(STATUS.GOOD); - expect(bidObject).to.have.property('cpm').and.to.equal(expectedResponse.cpm); - expect(bidObject).to.have.property('ad').and.to.equal(expectedResponse.ad); - expect(bidObject).to.have.property('width').and.to.equal(expectedResponse.width); - expect(bidObject).to.have.property('height').and.to.equal(expectedResponse.height); - }); - }); - - // We want to check that responses are added according to a sampling value, - // this is possible by stubbing `Math.random`, to ensure the effect is - // limited to the area we check, we create a self destructing stub which - // restores itself once called. - it('adds responses according to the sampling defined in the response', () => { - const response = { - cpm: 0.4, - chance: 0.25, - ad: '' - }; - - // List of "random" values. We check that the first two pass and the last - // one is skipped. - const randomValues = [0.2, 0.3]; - let randomIndex = 0; - + }); + + it('adds a bid reponse for each pending bid', () => { + const responses = [{ + width: '300', + height: '250', + cpm: 0.4, + ad: '' + }, { + width: '728', + height: '90', + cpm: 0.4, + ad: '' + }]; + + let id = 0; server.respondWith((request) => { - const mathRandomStub = sandbox.stub(Math, 'random', function () { - const randomValue = randomValues[randomIndex]; - - randomIndex += 1; - mathRandomStub.restore(); // self destruct on call - - return randomValue; - }); - - request.respond(200, {}, JSON.stringify(response)); - - mathRandomStub.restore(); - }); - - const params = { - bids: [tilePlacement()] - }; - - adapter.callBids(params); - adapter.callBids(params); - server.respond(); - - sinon.assert.calledTwice(addBidResponseStub); - - const firstBidObject = addBidResponseStub.getCall(0).args[1]; - const secondBidObject = addBidResponseStub.getCall(1).args[1]; - - expect(firstBidObject.getStatusCode()).to.be.equal(STATUS.GOOD); - expect(secondBidObject.getStatusCode()).to.be.equal(STATUS.NO_BID); - }); - }); -}); + request.respond(200, {}, JSON.stringify(responses[id])); + id += 1; + }); + + const params = { + bids: [tilePlacement(), leaderPlacement()] + }; + + adapter.callBids(params); + server.respond(); + + expect(server.requests.length).to.be.equal(2); + sinon.assert.calledTwice(addBidResponseStub); + + responses.forEach((expectedResponse, i) => { + const placementCode = addBidResponseStub.getCall(i).args[0]; + const bidObject = addBidResponseStub.getCall(i).args[1]; + + expect(placementCode).to.be.equal('div-gpt-ad-12345-' + (i + 1)); + + expect(bidObject.getStatusCode()).to.be.equal(STATUS.GOOD); + expect(bidObject).to.have.property('cpm').and.to.equal(expectedResponse.cpm); + expect(bidObject).to.have.property('ad').and.to.equal(expectedResponse.ad); + expect(bidObject).to.have.property('width').and.to.equal(expectedResponse.width); + expect(bidObject).to.have.property('height').and.to.equal(expectedResponse.height); + }); + }); + + // We want to check that responses are added according to a sampling value, + // this is possible by stubbing `Math.random`, to ensure the effect is + // limited to the area we check, we create a self destructing stub which + // restores itself once called. + it('adds responses according to the sampling defined in the response', () => { + const response = { + cpm: 0.4, + chance: 0.25, + ad: '' + }; + + // List of "random" values. We check that the first two pass and the last + // one is skipped. + const randomValues = [0.2, 0.3]; + let randomIndex = 0; + + server.respondWith((request) => { + const mathRandomStub = sandbox.stub(Math, 'random', function () { + const randomValue = randomValues[randomIndex]; + + randomIndex += 1; + mathRandomStub.restore(); // self destruct on call + + return randomValue; + }); + + request.respond(200, {}, JSON.stringify(response)); + + mathRandomStub.restore(); + }); + + const params = { + bids: [tilePlacement()] + }; + + adapter.callBids(params); + adapter.callBids(params); + server.respond(); + + sinon.assert.calledTwice(addBidResponseStub); + + const firstBidObject = addBidResponseStub.getCall(0).args[1]; + const secondBidObject = addBidResponseStub.getCall(1).args[1]; + + expect(firstBidObject.getStatusCode()).to.be.equal(STATUS.GOOD); + expect(secondBidObject.getStatusCode()).to.be.equal(STATUS.NO_BID); + }); + }); +}); From c080a9b637fa9436dc0ba62e155488c0bf7fa37e Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 09:52:18 -0600 Subject: [PATCH 047/111] huddledmasses bid adapter converted to module --- adapters.json | 1 - .../huddledmasses.js => modules/huddledmassesBidAdapter.js | 5 ++++- .../huddledmassesBidAdapter_spec.js} | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) rename src/adapters/huddledmasses.js => modules/huddledmassesBidAdapter.js (96%) rename test/spec/{adapters/huddledmasses_spec.js => modules/huddledmassesBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 5be7d27ceda..6d5563a5fc3 100644 --- a/adapters.json +++ b/adapters.json @@ -16,7 +16,6 @@ "quantcast", "rhythmone", "smartyads", - "huddledmasses", "smartadserver", "sekindoUM", "serverbid", diff --git a/src/adapters/huddledmasses.js b/modules/huddledmassesBidAdapter.js similarity index 96% rename from src/adapters/huddledmasses.js rename to modules/huddledmassesBidAdapter.js index 8fdfee0fc4d..0014f4d3fe6 100644 --- a/src/adapters/huddledmasses.js +++ b/modules/huddledmassesBidAdapter.js @@ -1,9 +1,10 @@ -import * as Adapter from './adapter.js'; +import * as Adapter from 'src/adapter.js'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; import {ajax} from 'src/ajax'; import {STATUS} from 'src/constants'; +import adaptermanager from 'src/adaptermanager'; var BIDDER_CODE = 'huddledmasses'; @@ -166,4 +167,6 @@ HuddledMassesAdapter.createNew = function () { return new HuddledMassesAdapter(); }; +adaptermanager.registerBidAdapter(new HuddledMassesAdapter, 'huddledmasses'); + module.exports = HuddledMassesAdapter; diff --git a/test/spec/adapters/huddledmasses_spec.js b/test/spec/modules/huddledmassesBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/huddledmasses_spec.js rename to test/spec/modules/huddledmassesBidAdapter_spec.js index e045d96f997..34218ed8e83 100644 --- a/test/spec/adapters/huddledmasses_spec.js +++ b/test/spec/modules/huddledmassesBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import Adapter from '../../../src/adapters/huddledmasses'; +import Adapter from '../../../modules/huddledmassesBidAdapter'; import adapterManager from 'src/adaptermanager'; import bidManager from 'src/bidmanager'; import CONSTANTS from 'src/constants.json'; From b921e9521b0215d869f807e543387a0cb4d7ae03 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 09:58:07 -0600 Subject: [PATCH 048/111] indexExchange bid adapter converted to module --- adapters.json | 1 - .../indexExchangeBidAdapter.js | 11 +++++++---- .../indexExchangeBidAdapter_request_spec.js} | 3 +-- .../indexExchangeBidAdapter_response_spec.js} | 2 +- .../indexExchangeBidAdapter_validadtion_spec.js} | 3 +-- 5 files changed, 10 insertions(+), 10 deletions(-) rename src/adapters/indexExchange.js => modules/indexExchangeBidAdapter.js (98%) rename test/spec/{adapters/indexExchange_request_spec.js => modules/indexExchangeBidAdapter_request_spec.js} (99%) rename test/spec/{adapters/indexExchange_response_spec.js => modules/indexExchangeBidAdapter_response_spec.js} (99%) rename test/spec/{adapters/indexExchange_validation_spec.js => modules/indexExchangeBidAdapter_validadtion_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 6d5563a5fc3..09f05f88204 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "indexExchange", "innity", "kruxlink", "inneractive", diff --git a/src/adapters/indexExchange.js b/modules/indexExchangeBidAdapter.js similarity index 98% rename from src/adapters/indexExchange.js rename to modules/indexExchangeBidAdapter.js index 133ee8e3cf2..f411fa93cfd 100644 --- a/src/adapters/indexExchange.js +++ b/modules/indexExchangeBidAdapter.js @@ -1,8 +1,9 @@ // Factory for creating the bidderAdaptor -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var adaptermanager = require('src/adaptermanager'); var ADAPTER_NAME = 'INDEXEXCHANGE'; var ADAPTER_CODE = 'indexExchange'; @@ -661,4 +662,6 @@ var IndexExchangeAdapter = function IndexExchangeAdapter() { }; }; +adaptermanager.registerBidAdapter(new IndexExchangeAdapter, 'indexExchange'); + module.exports = IndexExchangeAdapter; diff --git a/test/spec/adapters/indexExchange_request_spec.js b/test/spec/modules/indexExchangeBidAdapter_request_spec.js similarity index 99% rename from test/spec/adapters/indexExchange_request_spec.js rename to test/spec/modules/indexExchangeBidAdapter_request_spec.js index 22756c70e7b..3a20b6a6d22 100644 --- a/test/spec/adapters/indexExchange_request_spec.js +++ b/test/spec/modules/indexExchangeBidAdapter_request_spec.js @@ -1,5 +1,4 @@ -import Adapter from '../../../src/adapters/indexExchange'; -import bidManager from '../../../src/bidmanager'; +import Adapter from '../../../modules/indexExchangeBidAdapter'; import adLoader from '../../../src/adloader'; var assert = require('chai').assert; diff --git a/test/spec/adapters/indexExchange_response_spec.js b/test/spec/modules/indexExchangeBidAdapter_response_spec.js similarity index 99% rename from test/spec/adapters/indexExchange_response_spec.js rename to test/spec/modules/indexExchangeBidAdapter_response_spec.js index ef26876eaff..86a73a25c81 100644 --- a/test/spec/adapters/indexExchange_response_spec.js +++ b/test/spec/modules/indexExchangeBidAdapter_response_spec.js @@ -1,4 +1,4 @@ -import Adapter from '../../../src/adapters/indexExchange'; +import Adapter from '../../../modules/indexExchangeBidAdapter'; import bidManager from '../../../src/bidmanager'; import adLoader from '../../../src/adloader'; diff --git a/test/spec/adapters/indexExchange_validation_spec.js b/test/spec/modules/indexExchangeBidAdapter_validadtion_spec.js similarity index 99% rename from test/spec/adapters/indexExchange_validation_spec.js rename to test/spec/modules/indexExchangeBidAdapter_validadtion_spec.js index bd5ed1c1464..da0907cbf48 100644 --- a/test/spec/adapters/indexExchange_validation_spec.js +++ b/test/spec/modules/indexExchangeBidAdapter_validadtion_spec.js @@ -1,5 +1,4 @@ -import Adapter from '../../../src/adapters/indexExchange'; -import bidManager from '../../../src/bidmanager'; +import Adapter from '../../../modules/indexExchangeBidAdapter'; import adLoader from '../../../src/adloader'; var assert = require('chai').assert; From d8106b9c6eae0c45af30b0c84d8a55b81a0ccd04 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:01:59 -0600 Subject: [PATCH 049/111] inneractive bid adapter converted to module --- adapters.json | 1 - .../inneractiveBidAdapter.js | 12 ++++++++---- .../inneractiveBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) rename src/adapters/inneractive.js => modules/inneractiveBidAdapter.js (98%) rename test/spec/{adapters/inneractive_spec.js => modules/inneractiveBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 09f05f88204..5ce81e6c17c 100644 --- a/adapters.json +++ b/adapters.json @@ -2,7 +2,6 @@ "vertamedia", "innity", "kruxlink", - "inneractive", "komoona", "lifestreet", "mantis", diff --git a/src/adapters/inneractive.js b/modules/inneractiveBidAdapter.js similarity index 98% rename from src/adapters/inneractive.js rename to modules/inneractiveBidAdapter.js index 77fb3999834..84b53f12798 100644 --- a/src/adapters/inneractive.js +++ b/modules/inneractiveBidAdapter.js @@ -1,10 +1,11 @@ -import * as utils from '../utils'; -import Adapter from './adapter'; -import {ajax} from '../ajax'; +import * as utils from 'src/utils'; +import Adapter from 'src/adapter'; +import {ajax} from 'src/ajax'; import bidManager from 'src/bidmanager'; import bidFactory from 'src/bidfactory'; import {STATUS} from 'src/constants'; -import {formatQS} from '../url'; +import {formatQS} from 'src/url'; +import adaptermanager from 'src/adaptermanager'; /** * @type {{IA_JS: string, ADAPTER_NAME: string, V: string, RECTANGLE_SIZE: {W: number, H: number}, SPOT_TYPES: {INTERSTITIAL: string, RECTANGLE: string, FLOATING: string, BANNER: string}, DISPLAY_AD: number, ENDPOINT_URL: string, EVENTS_ENDPOINT_URL: string, RESPONSE_HEADERS_NAME: {PRICING_VALUE: string, AD_H: string, AD_W: string}}} @@ -457,4 +458,7 @@ class InnerActiveAdapter { return new InnerActiveAdapter(); } } + +adaptermanager.registerBidAdapter(new InnerActiveAdapter, 'inneractive'); + module.exports = InnerActiveAdapter; diff --git a/test/spec/adapters/inneractive_spec.js b/test/spec/modules/inneractiveBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/inneractive_spec.js rename to test/spec/modules/inneractiveBidAdapter_spec.js index be062ed29dd..b92c173d78b 100644 --- a/test/spec/adapters/inneractive_spec.js +++ b/test/spec/modules/inneractiveBidAdapter_spec.js @@ -1,7 +1,7 @@ /* globals context */ import {expect} from 'chai'; -import {default as InneractiveAdapter} from 'src/adapters/inneractive'; +import {default as InneractiveAdapter} from 'modules/inneractiveBidAdapter'; import bidmanager from 'src/bidmanager'; // Using plain-old-style functions, why? see: http://mochajs.org/#arrow-functions From 63cb70d06734470f57a356bcf88bee9c9d62c0ca Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:06:26 -0600 Subject: [PATCH 050/111] innity bid adapter converted to module --- adapters.json | 1 - .../innity.js => modules/innityBidAdapter.js | 13 ++++++++----- .../innityBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) rename src/adapters/innity.js => modules/innityBidAdapter.js (86%) rename test/spec/{adapters/innity_spec.js => modules/innityBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 5ce81e6c17c..0e6f9e4faff 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "innity", "kruxlink", "komoona", "lifestreet", diff --git a/src/adapters/innity.js b/modules/innityBidAdapter.js similarity index 86% rename from src/adapters/innity.js rename to modules/innityBidAdapter.js index b49f297e8e6..23e2b0c9527 100644 --- a/src/adapters/innity.js +++ b/modules/innityBidAdapter.js @@ -1,8 +1,9 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); -var utils = require('../utils.js'); -var CONSTANTS = require('../constants.json'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var utils = require('src/utils.js'); +var CONSTANTS = require('src/constants.json'); +var adaptermanager = require('src/adaptermanager'); var InnityAdapter = function InnityAdapter() { function _callBids(params) { @@ -52,4 +53,6 @@ var InnityAdapter = function InnityAdapter() { }; }; +adaptermanager.registerBidAdapter(new InnityAdapter, 'innity'); + module.exports = InnityAdapter; diff --git a/test/spec/adapters/innity_spec.js b/test/spec/modules/innityBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/innity_spec.js rename to test/spec/modules/innityBidAdapter_spec.js index c87c8deca22..7e4ac147c68 100644 --- a/test/spec/adapters/innity_spec.js +++ b/test/spec/modules/innityBidAdapter_spec.js @@ -2,7 +2,7 @@ describe('innity adapter tests', function () { var expect = require('chai').expect; var urlParse = require('url-parse'); var querystringify = require('querystringify'); - var adapter = require('src/adapters/innity'); + var adapter = require('modules/innityBidAdapter'); var adLoader = require('src/adloader'); var bidmanager = require('src/bidmanager'); From 73f0b55e098b892651c6ed761360759605992a2f Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:08:33 -0600 Subject: [PATCH 051/111] jcm bid adapter converted to module --- adapters.json | 1 - src/adapters/jcm.js => modules/jcmBidAdapter.js | 3 +++ .../{adapters/jcm_spec.js => modules/jcmBidAdapter_spec.js} | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) rename src/adapters/jcm.js => modules/jcmBidAdapter.js (94%) rename test/spec/{adapters/jcm_spec.js => modules/jcmBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 0e6f9e4faff..17bf3921233 100644 --- a/adapters.json +++ b/adapters.json @@ -26,7 +26,6 @@ "yieldbot", "nginad", "wideorbit", - "jcm", "underdogmedia", "memeglobal", "xhb", diff --git a/src/adapters/jcm.js b/modules/jcmBidAdapter.js similarity index 94% rename from src/adapters/jcm.js rename to modules/jcmBidAdapter.js index cb429156dac..b1648e1731f 100644 --- a/src/adapters/jcm.js +++ b/modules/jcmBidAdapter.js @@ -2,6 +2,7 @@ var bidfactory = require('src/bidfactory.js'); var bidmanager = require('src/bidmanager.js'); var adloader = require('src/adloader.js'); var utils = require('src/utils.js'); +var adaptermanager = require('src/adaptermanager'); var JCMAdapter = function JCMAdapter() { window.pbjs = window.pbjs || {}; @@ -63,4 +64,6 @@ var JCMAdapter = function JCMAdapter() { }; }; +adaptermanager.registerBidAdapter(new JCMAdapter, 'jcm'); + module.exports = JCMAdapter; diff --git a/test/spec/adapters/jcm_spec.js b/test/spec/modules/jcmBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/jcm_spec.js rename to test/spec/modules/jcmBidAdapter_spec.js index 66d72eb324e..59f95dfe6e6 100644 --- a/test/spec/adapters/jcm_spec.js +++ b/test/spec/modules/jcmBidAdapter_spec.js @@ -5,7 +5,7 @@ describe('jcm adapter tests', function () { // FYI: querystringify will perform encoding/decoding var querystringify = require('querystringify'); - var adapter = require('src/adapters/jcm'); + var adapter = require('modules/jcmBidAdapter'); var adLoader = require('src/adloader'); var bidmanager = require('src/bidmanager'); From e0ab8d930a5db797fe351f3825aee705d662c8e6 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:10:48 -0600 Subject: [PATCH 052/111] komoona bid adapter converted to module --- adapters.json | 1 - src/adapters/komoona.js => modules/komoonaBidAdapter.js | 5 ++++- .../komoona_spec.js => modules/komoonaBidAdapter_spec.js} | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) rename src/adapters/komoona.js => modules/komoonaBidAdapter.js (95%) rename test/spec/{adapters/komoona_spec.js => modules/komoonaBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 17bf3921233..6fac36610e3 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,6 @@ [ "vertamedia", "kruxlink", - "komoona", "lifestreet", "mantis", "openx", diff --git a/src/adapters/komoona.js b/modules/komoonaBidAdapter.js similarity index 95% rename from src/adapters/komoona.js rename to modules/komoonaBidAdapter.js index 33fb798facb..35cc4cbaa36 100644 --- a/src/adapters/komoona.js +++ b/modules/komoonaBidAdapter.js @@ -1,9 +1,10 @@ -import Adapter from 'src/adapters/adapter'; +import Adapter from 'src/adapter'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; import { ajax } from 'src/ajax'; import { STATUS } from 'src/constants'; +import adaptermanager from 'src/adaptermanager'; const ENDPOINT = '//bidder.komoona.com/v1/GetSBids'; @@ -116,4 +117,6 @@ KomoonaAdapter.createNew = function() { return new KomoonaAdapter(); }; +adaptermanager.registerBidAdapter(new KomoonaAdapter, 'komoona'); + module.exports = KomoonaAdapter; diff --git a/test/spec/adapters/komoona_spec.js b/test/spec/modules/komoonaBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/komoona_spec.js rename to test/spec/modules/komoonaBidAdapter_spec.js index 30ba04a508e..f0e4a7086d3 100644 --- a/test/spec/adapters/komoona_spec.js +++ b/test/spec/modules/komoonaBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import Adapter from 'src/adapters/komoona'; +import Adapter from 'modules/komoonaBidAdapter'; import bidmanager from 'src/bidmanager'; const ENDPOINT = '//bidder.komoona.com/v1/GetSBids'; From 0a9acdd9b1227d3dd30b676c7a4d793fdc2d3c8f Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:18:17 -0600 Subject: [PATCH 053/111] kruxlink bid adapter converted to module --- adapters.json | 1 - .../kruxlink.js => modules/kruxlinkBidAdapter.js | 15 ++++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) rename src/adapters/kruxlink.js => modules/kruxlinkBidAdapter.js (87%) diff --git a/adapters.json b/adapters.json index 6fac36610e3..4cab8bcebb0 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "kruxlink", "lifestreet", "mantis", "openx", diff --git a/src/adapters/kruxlink.js b/modules/kruxlinkBidAdapter.js similarity index 87% rename from src/adapters/kruxlink.js rename to modules/kruxlinkBidAdapter.js index 37f258284c2..4606a27958b 100644 --- a/src/adapters/kruxlink.js +++ b/modules/kruxlinkBidAdapter.js @@ -1,6 +1,7 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var adaptermanager = require('src/adaptermanager'); function _qs(key, value) { return encodeURIComponent(key) + '=' + encodeURIComponent(value); @@ -78,8 +79,12 @@ function _callBids(params) { adloader.loadScript(url); } -module.exports = function KruxAdapter() { +function KruxAdapter() { return { callBids: _callBids }; -}; +} + +adaptermanager.registerBidAdapter(new KruxAdapter, 'kruxlink'); + +module.exports = KruxAdapter; From 5e4da444d65ef8458e803514bf16b400c67845dc Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:21:13 -0600 Subject: [PATCH 054/111] lifestreet bid adapter converted to module --- adapters.json | 1 - .../lifestreet.js => modules/lifestreetBidAdapter.js | 11 +++++++---- .../lifestreetBidAdapter_spec.js} | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/lifestreet.js => modules/lifestreetBidAdapter.js (94%) rename test/spec/{adapters/lifestreet_spec.js => modules/lifestreetBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 4cab8bcebb0..2abc2d80da1 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "lifestreet", "mantis", "openx", "piximedia", diff --git a/src/adapters/lifestreet.js b/modules/lifestreetBidAdapter.js similarity index 94% rename from src/adapters/lifestreet.js rename to modules/lifestreetBidAdapter.js index a38c1a080da..fa05d2f7c4e 100644 --- a/src/adapters/lifestreet.js +++ b/modules/lifestreetBidAdapter.js @@ -1,7 +1,8 @@ -const bidfactory = require('../bidfactory.js'); -const bidmanager = require('../bidmanager'); -const utils = require('../utils.js'); -const adloader = require('../adloader'); +const bidfactory = require('src/bidfactory.js'); +const bidmanager = require('src/bidmanager'); +const utils = require('src/utils.js'); +const adloader = require('src/adloader'); +const adaptermanager = require('src/adaptermanager'); const LifestreetAdapter = function LifestreetAdapter() { const BIDDER_CODE = 'lifestreet'; @@ -160,4 +161,6 @@ const LifestreetAdapter = function LifestreetAdapter() { }; }; +adaptermanager.registerBidAdapter(new LifestreetAdapter, 'lifestreet'); + module.exports = LifestreetAdapter; diff --git a/test/spec/adapters/lifestreet_spec.js b/test/spec/modules/lifestreetBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/lifestreet_spec.js rename to test/spec/modules/lifestreetBidAdapter_spec.js index 63922799a4c..bb93ad90ef2 100644 --- a/test/spec/adapters/lifestreet_spec.js +++ b/test/spec/modules/lifestreetBidAdapter_spec.js @@ -2,7 +2,7 @@ import {expect} from 'chai'; import {cloneJson} from 'src/utils'; import adloader from 'src/adloader'; import bidmanager from 'src/bidmanager'; -import LifestreetAdapter from 'src/adapters/lifestreet'; +import LifestreetAdapter from 'modules/lifestreetBidAdapter'; const BIDDER_REQUEST = { auctionStart: new Date().getTime(), From 3db67a524523af4a062e8ec3143fabc4fb985088 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:24:53 -0600 Subject: [PATCH 055/111] mantis bid adapter converted to module --- adapters.json | 1 - .../mantis.js => modules/mantisBidAdapter.js | 17 +++++++++++------ .../mantisBidAdapter_spec.js} | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) rename src/adapters/mantis.js => modules/mantisBidAdapter.js (93%) rename test/spec/{adapters/mantis_spec.js => modules/mantisBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 2abc2d80da1..96deb0db7d9 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "mantis", "openx", "piximedia", "pubmatic", diff --git a/src/adapters/mantis.js b/modules/mantisBidAdapter.js similarity index 93% rename from src/adapters/mantis.js rename to modules/mantisBidAdapter.js index f4bb2f56e41..8c01c7bb888 100644 --- a/src/adapters/mantis.js +++ b/modules/mantisBidAdapter.js @@ -1,9 +1,10 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); -var constants = require('../constants.json'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var constants = require('src/constants.json'); +var adaptermanager = require('src/adaptermanager'); -module.exports = function () { +function MantisAdapter () { function inIframe() { try { return window.self !== window.top && !window.mantis_link; @@ -220,4 +221,8 @@ module.exports = function () { }; return new Prebid(bidfactory, bidmanager, adloader, constants); -}; +} + +adaptermanager.registerBidAdapter(new MantisAdapter, 'mantis'); + +module.exports = MantisAdapter; diff --git a/test/spec/adapters/mantis_spec.js b/test/spec/modules/mantisBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/mantis_spec.js rename to test/spec/modules/mantisBidAdapter_spec.js index 29332dacf7e..7803bf947e2 100644 --- a/test/spec/adapters/mantis_spec.js +++ b/test/spec/modules/mantisBidAdapter_spec.js @@ -2,7 +2,7 @@ describe('mantis adapter tests', function () { const expect = require('chai').expect; - const adapter = require('src/adapters/mantis.js'); + const adapter = require('modules/mantisBidAdapter'); const bidmanager = require('src/bidmanager'); const adloader = require('src/adloader'); const constants = require('src/constants.json'); From fbfa8eecac88386578ef552317f0caac0e5417c7 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:26:56 -0600 Subject: [PATCH 056/111] memeglobal bid adapter converted to module --- adapters.json | 1 - .../memeglobalBidAdapter.js | 13 ++++++++----- .../memeglobalBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) rename src/adapters/memeglobal.js => modules/memeglobalBidAdapter.js (91%) rename test/spec/{adapters/memeglobal_spec.js => modules/memeglobalBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 96deb0db7d9..fadf112f744 100644 --- a/adapters.json +++ b/adapters.json @@ -23,7 +23,6 @@ "nginad", "wideorbit", "underdogmedia", - "memeglobal", "xhb", "sharethrough", "roxot", diff --git a/src/adapters/memeglobal.js b/modules/memeglobalBidAdapter.js similarity index 91% rename from src/adapters/memeglobal.js rename to modules/memeglobalBidAdapter.js index 1f70d18e666..fecd09899a7 100644 --- a/src/adapters/memeglobal.js +++ b/modules/memeglobalBidAdapter.js @@ -1,8 +1,9 @@ -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); var defaultPlacementForBadBid = null; var bidderName = 'memeglobal'; @@ -122,4 +123,6 @@ var MemeGlobalAdapter = function MemeGlobalAdapter() { }; }; +adaptermanager.registerBidAdapter(new MemeGlobalAdapter, 'memeglobal'); + module.exports = MemeGlobalAdapter; diff --git a/test/spec/adapters/memeglobal_spec.js b/test/spec/modules/memeglobalBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/memeglobal_spec.js rename to test/spec/modules/memeglobalBidAdapter_spec.js index d607e87cb59..6f770c290d0 100644 --- a/test/spec/adapters/memeglobal_spec.js +++ b/test/spec/modules/memeglobalBidAdapter_spec.js @@ -1,6 +1,6 @@ describe('memeglobal adapter tests', function () { const expect = require('chai').expect; - const adapter = require('src/adapters/memeglobal'); + const adapter = require('modules/memeglobalBidAdapter'); const bidmanager = require('src/bidmanager'); const adLoader = require('src/adloader'); var bidderName = 'memeglobal'; From 53c39960dab64930ed2ac21f3dbc57375fe6a965 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:29:10 -0600 Subject: [PATCH 057/111] nginad bid adapter converted to module --- adapters.json | 1 - .../nginad.js => modules/nginadBidAdapter.js | 13 ++++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/nginad.js => modules/nginadBidAdapter.js (93%) diff --git a/adapters.json b/adapters.json index fadf112f744..e7c2da8afef 100644 --- a/adapters.json +++ b/adapters.json @@ -20,7 +20,6 @@ "triplelift", "twenga", "yieldbot", - "nginad", "wideorbit", "underdogmedia", "xhb", diff --git a/src/adapters/nginad.js b/modules/nginadBidAdapter.js similarity index 93% rename from src/adapters/nginad.js rename to modules/nginadBidAdapter.js index cedebfbd1e1..b94e68fe9ab 100644 --- a/src/adapters/nginad.js +++ b/modules/nginadBidAdapter.js @@ -1,8 +1,9 @@ -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); var defaultPlacementForBadBid = null; @@ -180,4 +181,6 @@ var NginAdAdapter = function NginAdAdapter() { }; }; +adaptermanager.registerBidAdapter(new NginAdAdapter, 'nginad'); + module.exports = NginAdAdapter; From 26d8cf698afe78fba00455f2a8cd37f2db25b4b3 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:31:27 -0600 Subject: [PATCH 058/111] openx bid adapter converted to module --- adapters.json | 1 - src/adapters/openx.js => modules/openxBidAdapter.js | 13 ++++++++----- .../openxBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) rename src/adapters/openx.js => modules/openxBidAdapter.js (94%) rename test/spec/{adapters/openx_spec.js => modules/openxBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index e7c2da8afef..8ddb724bf70 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "openx", "piximedia", "pubmatic", "pubgears", diff --git a/src/adapters/openx.js b/modules/openxBidAdapter.js similarity index 94% rename from src/adapters/openx.js rename to modules/openxBidAdapter.js index 6341b860134..8dddd138e3b 100644 --- a/src/adapters/openx.js +++ b/modules/openxBidAdapter.js @@ -1,8 +1,9 @@ -const bidfactory = require('../bidfactory.js'); -const bidmanager = require('../bidmanager.js'); -const adloader = require('../adloader'); -const CONSTANTS = require('../constants.json'); -const utils = require('../utils.js'); +const bidfactory = require('src/bidfactory.js'); +const bidmanager = require('src/bidmanager.js'); +const adloader = require('src/adloader'); +const CONSTANTS = require('src/constants.json'); +const utils = require('src/utils.js'); +const adaptermanager = require('src/adaptermanager'); const OpenxAdapter = function OpenxAdapter() { const BIDDER_CODE = 'openx'; @@ -230,4 +231,6 @@ const OpenxAdapter = function OpenxAdapter() { }; }; +adaptermanager.registerBidAdapter(new OpenxAdapter, 'openx'); + module.exports = OpenxAdapter; diff --git a/test/spec/adapters/openx_spec.js b/test/spec/modules/openxBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/openx_spec.js rename to test/spec/modules/openxBidAdapter_spec.js index dc18298ad64..c828aacda6a 100644 --- a/test/spec/adapters/openx_spec.js +++ b/test/spec/modules/openxBidAdapter_spec.js @@ -1,7 +1,7 @@ describe('openx adapter tests', function () { const expect = require('chai').expect; const assert = require('chai').assert; - const adapter = require('src/adapters/openx'); + const adapter = require('modules/openxBidAdapter'); const bidmanager = require('src/bidmanager'); const adloader = require('src/adloader'); const CONSTANTS = require('src/constants.json'); From 49b32fe29ca22185329da7991e2550c02b723a91 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:33:57 -0600 Subject: [PATCH 059/111] piximedia bid adapter converted to module --- adapters.json | 1 - .../piximediaBidAdapter.js | 15 +++++++++------ .../piximediaBidAdapter_spec.js} | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) rename src/adapters/piximedia.js => modules/piximediaBidAdapter.js (93%) rename test/spec/{adapters/piximedia_spec.js => modules/piximediaBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 8ddb724bf70..9892bdab35f 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "piximedia", "pubmatic", "pubgears", "pulsepoint", diff --git a/src/adapters/piximedia.js b/modules/piximediaBidAdapter.js similarity index 93% rename from src/adapters/piximedia.js rename to modules/piximediaBidAdapter.js index b075259fae9..8d79f6f4468 100644 --- a/src/adapters/piximedia.js +++ b/modules/piximediaBidAdapter.js @@ -1,9 +1,10 @@ -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var bidmanager = require('../bidmanager.js'); -var bidfactory = require('../bidfactory.js'); -var adloader = require('../adloader.js'); -var Adapter = require('./adapter.js'); +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var bidmanager = require('src/bidmanager.js'); +var bidfactory = require('src/bidfactory.js'); +var adloader = require('src/adloader.js'); +var Adapter = require('src/adapter.js'); +var adaptermanager = require('src/adaptermanager'); var PiximediaAdapter = function PiximediaAdapter() { var PREBID_URL = '//static.adserver.pm/prebid'; @@ -149,4 +150,6 @@ var PiximediaAdapter = function PiximediaAdapter() { }; }; +adaptermanager.registerBidAdapter(new PiximediaAdapter, 'piximedia'); + module.exports = PiximediaAdapter; diff --git a/test/spec/adapters/piximedia_spec.js b/test/spec/modules/piximediaBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/piximedia_spec.js rename to test/spec/modules/piximediaBidAdapter_spec.js index 9a9a977603c..76e4ded1b1b 100644 --- a/test/spec/adapters/piximedia_spec.js +++ b/test/spec/modules/piximediaBidAdapter_spec.js @@ -4,7 +4,7 @@ describe('Piximedia adapter tests', function () { // var querystringify = require('querystringify'); - var adapter = require('src/adapters/piximedia'); + var adapter = require('modules/piximediaBidAdapter'); var adLoader = require('src/adloader'); var bidmanager = require('src/bidmanager'); var utils = require('src/utils'); From 1b6186bfe9d89dd44726f63c960c080f17855731 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 10:58:01 -0600 Subject: [PATCH 060/111] prebidServer bid adapter converted to module --- adapters.json | 2 -- .../prebidServer.js => modules/prebidServerBidAdapter.js | 5 ++++- .../prebidServerBidAdapter_spec.js} | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) rename src/adapters/prebidServer.js => modules/prebidServerBidAdapter.js (97%) rename test/spec/{adapters/prebidServer_spec.js => modules/prebidServerBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 9892bdab35f..7b0112a6dec 100644 --- a/adapters.json +++ b/adapters.json @@ -27,8 +27,6 @@ "widespace", "tapsense", "trion", - "eplanning", - "prebidServer", { "vertamedia": { "supportedMediaTypes": ["video"] diff --git a/src/adapters/prebidServer.js b/modules/prebidServerBidAdapter.js similarity index 97% rename from src/adapters/prebidServer.js rename to modules/prebidServerBidAdapter.js index 5dc78008060..96821bc6211 100644 --- a/src/adapters/prebidServer.js +++ b/modules/prebidServerBidAdapter.js @@ -1,10 +1,11 @@ -import Adapter from 'src/adapters/adapter'; +import Adapter from 'src/adapter'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; import { ajax } from 'src/ajax'; import { STATUS } from 'src/constants'; import { queueSync, persist } from 'src/cookie'; +import adaptermanager from 'src/adaptermanager'; const TYPE = 's2s'; const cookiePersistMessage = `Your browser may be blocking 3rd party cookies. By clicking on this page you allow Prebid Server and other advertising partners to place cookies to help us advertise. You can opt out of their cookies here.`; @@ -183,4 +184,6 @@ PrebidServer.createNew = function() { return new PrebidServer(); }; +adaptermanager.registerBidAdapter(new PrebidServer, 'prebidServer'); + module.exports = PrebidServer; diff --git a/test/spec/adapters/prebidServer_spec.js b/test/spec/modules/prebidServerBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/prebidServer_spec.js rename to test/spec/modules/prebidServerBidAdapter_spec.js index fe1cb7e9894..0216937a788 100644 --- a/test/spec/adapters/prebidServer_spec.js +++ b/test/spec/modules/prebidServerBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import Adapter from 'src/adapters/prebidServer'; +import Adapter from 'modules/prebidServerBidAdapter'; import bidmanager from 'src/bidmanager'; import CONSTANTS from 'src/constants.json'; import * as utils from 'src/utils'; @@ -160,6 +160,7 @@ describe('S2S Adapter', () => { utils.getBidRequest.restore(); }); + // TODO: test dependent on pbjs_api_spec. Needs to be isolated it('registers bids', () => { server.respondWith(JSON.stringify(RESPONSE)); From 6118aacc0a866ffd59b5a84f3810b864ca658eec Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 11:01:42 -0600 Subject: [PATCH 061/111] pubgears bid adapter converted to module --- adapters.json | 1 - .../pubgears.js => modules/pubgearsBidAdapter.js | 11 +++++++---- .../pubgearsBidAdapter_spec.js} | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/pubgears.js => modules/pubgearsBidAdapter.js (94%) rename test/spec/{adapters/pubgears_spec.js => modules/pubgearsBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 7b0112a6dec..bb59e286d7a 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,6 @@ [ "vertamedia", "pubmatic", - "pubgears", "pulsepoint", "pulsepointLite", "quantcast", diff --git a/src/adapters/pubgears.js b/modules/pubgearsBidAdapter.js similarity index 94% rename from src/adapters/pubgears.js rename to modules/pubgearsBidAdapter.js index 2da723606c0..354fe8a7f59 100644 --- a/src/adapters/pubgears.js +++ b/modules/pubgearsBidAdapter.js @@ -1,7 +1,8 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var consts = require('../constants.json'); -var utils = require('../utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var consts = require('src/constants.json'); +var utils = require('src/utils.js'); +var adaptermanager = require('src/adaptermanager'); var d = document; var SCRIPT = 'script'; var PARAMS = 'params'; @@ -32,6 +33,8 @@ var CREATIVE_TEMPLATE = decodeURIComponent("%3Cscript%3E%0A(function(define)%7B% var TAG_URL = '//c.pubgears.com/tags/h'; var publisher = ''; +adaptermanager.registerBidAdapter(new PubGearsAdapter, BIDDER_CODE); + module.exports = PubGearsAdapter; function PubGearsAdapter() { diff --git a/test/spec/adapters/pubgears_spec.js b/test/spec/modules/pubgearsBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/pubgears_spec.js rename to test/spec/modules/pubgearsBidAdapter_spec.js index 724b9dcd368..c0179bc0d83 100644 --- a/test/spec/adapters/pubgears_spec.js +++ b/test/spec/modules/pubgearsBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import Adapter from 'src/adapters/pubgears' +import Adapter from 'modules/pubgearsBidAdapter' import bidmanager from 'src/bidmanager' describe('PubGearsAdapter', () => { From d601de102258157b1b423d387f7e69ee13c91f2f Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 11:04:01 -0600 Subject: [PATCH 062/111] pubmatic bid adapter converted to module --- adapters.json | 1 - .../pubmatic.js => modules/pubmaticBidAdapter.js | 13 ++++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/pubmatic.js => modules/pubmaticBidAdapter.js (94%) diff --git a/adapters.json b/adapters.json index bb59e286d7a..92958e496f3 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "pubmatic", "pulsepoint", "pulsepointLite", "quantcast", diff --git a/src/adapters/pubmatic.js b/modules/pubmaticBidAdapter.js similarity index 94% rename from src/adapters/pubmatic.js rename to modules/pubmaticBidAdapter.js index 5ad17a1dccd..e573daf68d3 100644 --- a/src/adapters/pubmatic.js +++ b/modules/pubmaticBidAdapter.js @@ -1,6 +1,7 @@ -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adaptermanager = require('src/adaptermanager'); /** * Adapter for requesting bids from Pubmatic. @@ -8,7 +9,7 @@ var bidmanager = require('../bidmanager.js'); * @returns {{callBids: _callBids}} * @constructor */ -var PubmaticAdapter = function PubmaticAdapter() { +function PubmaticAdapter() { var bids; var _pm_pub_id; var _pm_pub_age; @@ -146,6 +147,8 @@ var PubmaticAdapter = function PubmaticAdapter() { return { callBids: _callBids }; -}; +} + +adaptermanager.registerBidAdapter(new PubmaticAdapter, 'pubmatic'); module.exports = PubmaticAdapter; From 26aabc936a6ca51984e8b00480e612f05a22e8ad Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 11:08:45 -0600 Subject: [PATCH 063/111] pulsepoint and pulsepointLite bid adapter converted to module --- adapters.json | 2 -- .../pulsepoint.js => modules/pulsepointBidAdapter.js | 11 +++++++---- .../pulsepointLiteBidAdapter.js | 3 +++ .../pulsepointBidAdapter_spec.js} | 2 +- .../pulsepointLiteBidAdapter_spec.js} | 2 +- 5 files changed, 12 insertions(+), 8 deletions(-) rename src/adapters/pulsepoint.js => modules/pulsepointBidAdapter.js (88%) rename src/adapters/pulsepointLite.js => modules/pulsepointLiteBidAdapter.js (95%) rename test/spec/{adapters/pulsepoint_spec.js => modules/pulsepointBidAdapter_spec.js} (98%) rename test/spec/{adapters/pulsepointLite_spec.js => modules/pulsepointLiteBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 92958e496f3..1982a376941 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,5 @@ [ "vertamedia", - "pulsepoint", - "pulsepointLite", "quantcast", "rhythmone", "smartyads", diff --git a/src/adapters/pulsepoint.js b/modules/pulsepointBidAdapter.js similarity index 88% rename from src/adapters/pulsepoint.js rename to modules/pulsepointBidAdapter.js index 9a426bc5815..bff36bbda64 100644 --- a/src/adapters/pulsepoint.js +++ b/modules/pulsepointBidAdapter.js @@ -1,7 +1,8 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); -var utils = require('../utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var utils = require('src/utils.js'); +var adaptermanager = require('src/adaptermanager'); var PulsePointAdapter = function PulsePointAdapter() { var getJsStaticUrl = window.location.protocol + '//tag-st.contextweb.com/getjs.static.js'; @@ -79,4 +80,6 @@ var PulsePointAdapter = function PulsePointAdapter() { }; }; +adaptermanager.registerBidAdapter(new PulsePointAdapter, 'pulsepoint'); + module.exports = PulsePointAdapter; diff --git a/src/adapters/pulsepointLite.js b/modules/pulsepointLiteBidAdapter.js similarity index 95% rename from src/adapters/pulsepointLite.js rename to modules/pulsepointLiteBidAdapter.js index be2fc01934a..807477f729d 100644 --- a/src/adapters/pulsepointLite.js +++ b/modules/pulsepointLiteBidAdapter.js @@ -3,6 +3,7 @@ import {addBidResponse} from 'src/bidmanager'; import {logError, getTopWindowLocation} from 'src/utils'; import {ajax} from 'src/ajax'; import {STATUS} from 'src/constants'; +import adaptermanager from 'src/adaptermanager'; function PulsePointLiteAdapter() { const bidUrl = window.location.protocol + '//bid.contextweb.com/header/tag?'; @@ -85,4 +86,6 @@ function PulsePointLiteAdapter() { }; } +adaptermanager.registerBidAdapter(new PulsePointLiteAdapter, 'pulsepointLite'); + module.exports = PulsePointLiteAdapter; diff --git a/test/spec/adapters/pulsepoint_spec.js b/test/spec/modules/pulsepointBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/pulsepoint_spec.js rename to test/spec/modules/pulsepointBidAdapter_spec.js index cd56485b91a..07639310c36 100644 --- a/test/spec/adapters/pulsepoint_spec.js +++ b/test/spec/modules/pulsepointBidAdapter_spec.js @@ -1,5 +1,5 @@ import {expect} from 'chai'; -import PulsePointAdapter from '../../../src/adapters/pulsepoint'; +import PulsePointAdapter from '../../../modules/pulsepointBidAdapter'; import bidManager from '../../../src/bidmanager'; import adLoader from '../../../src/adloader'; diff --git a/test/spec/adapters/pulsepointLite_spec.js b/test/spec/modules/pulsepointLiteBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/pulsepointLite_spec.js rename to test/spec/modules/pulsepointLiteBidAdapter_spec.js index 85eb28ef46b..f48d361d4cd 100644 --- a/test/spec/adapters/pulsepointLite_spec.js +++ b/test/spec/modules/pulsepointLiteBidAdapter_spec.js @@ -1,5 +1,5 @@ import {expect} from 'chai'; -import PulsePointAdapter from 'src/adapters/pulsepointLite'; +import PulsePointAdapter from 'modules/pulsepointLiteBidAdapter'; import bidManager from 'src/bidmanager'; import * as ajax from 'src/ajax'; import {parse as parseURL} from 'src/url'; From 5ca71c696a784ca6d34468346f63b5fb9b1d9abb Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 11:11:52 -0600 Subject: [PATCH 064/111] quantcast bid adapter converted to module --- adapters.json | 1 - .../quantcast.js => modules/quantcastBidAdapter.js | 12 +++++++----- .../quantcastBidAdapter_spec.js} | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) rename src/adapters/quantcast.js => modules/quantcastBidAdapter.js (91%) rename test/spec/{adapters/quantcast_spec.js => modules/quantcastBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 1982a376941..5677de0e17a 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "quantcast", "rhythmone", "smartyads", "smartadserver", diff --git a/src/adapters/quantcast.js b/modules/quantcastBidAdapter.js similarity index 91% rename from src/adapters/quantcast.js rename to modules/quantcastBidAdapter.js index 1cdbbac00c1..52d28a6361e 100644 --- a/src/adapters/quantcast.js +++ b/modules/quantcastBidAdapter.js @@ -1,8 +1,9 @@ -const utils = require('../utils.js'); -const bidfactory = require('../bidfactory.js'); -const bidmanager = require('../bidmanager.js'); -const ajax = require('../ajax.js'); -const CONSTANTS = require('../constants.json'); +const utils = require('src/utils.js'); +const bidfactory = require('src/bidfactory.js'); +const bidmanager = require('src/bidmanager.js'); +const ajax = require('src/ajax.js'); +const CONSTANTS = require('src/constants.json'); +const adaptermanager = require('src/adaptermanager'); const QUANTCAST_CALLBACK_URL = 'http://global.qc.rtb.quantserve.com:8080/qchb'; var QuantcastAdapter = function QuantcastAdapter() { @@ -128,5 +129,6 @@ exports.createNew = function() { return new QuantcastAdapter(); }; +adaptermanager.registerBidAdapter(new QuantcastAdapter, 'quantcast'); module.exports = QuantcastAdapter; diff --git a/test/spec/adapters/quantcast_spec.js b/test/spec/modules/quantcastBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/quantcast_spec.js rename to test/spec/modules/quantcastBidAdapter_spec.js index daebdd4e470..0d139ac3ec2 100644 --- a/test/spec/adapters/quantcast_spec.js +++ b/test/spec/modules/quantcastBidAdapter_spec.js @@ -1,5 +1,5 @@ import {expect} from 'chai'; -import Adapter from '../../../src/adapters/quantcast'; +import Adapter from '../../../modules/quantcastBidAdapter'; import * as ajax from 'src/ajax'; import bidManager from '../../../src/bidmanager'; import adLoader from '../../../src/adloader'; From c0d81722c84937ba24bc7c980436bc8dbb2f7038 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 11:16:32 -0600 Subject: [PATCH 065/111] rhythmone bid adapter converted to module --- adapters.json | 16 ---------------- .../rhythmoneBidAdapter.js | 19 +++++++++++++------ .../rhythmoneBidAdapter_spec.js} | 2 +- 3 files changed, 14 insertions(+), 23 deletions(-) rename src/adapters/rhythmone.js => modules/rhythmoneBidAdapter.js (95%) rename test/spec/{adapters/rhythmone_spec.js => modules/rhythmoneBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 5677de0e17a..b4317c43a46 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "rhythmone", "smartyads", "smartadserver", "sekindoUM", @@ -36,20 +35,5 @@ "stickyadstv": { "alias": "freewheel-ssp" } - }, - { - "rhythmone": { - "supportedMediaTypes": ["video"] - } - }, - { - "admixer": { - "supportedMediaTypes": ["video"] - } - }, - { - "conversant": { - "supportedMediaTypes": ["video"] - } } ] diff --git a/src/adapters/rhythmone.js b/modules/rhythmoneBidAdapter.js similarity index 95% rename from src/adapters/rhythmone.js rename to modules/rhythmoneBidAdapter.js index 17264350009..b8bf79ac765 100644 --- a/src/adapters/rhythmone.js +++ b/modules/rhythmoneBidAdapter.js @@ -1,10 +1,11 @@ -var bidmanager = require('../bidmanager.js'), - bidfactory = require('../bidfactory.js'), - CONSTANTS = require('../constants.json'); +import {ajax} from 'src/ajax'; +import adaptermanager from 'src/adaptermanager'; -import {ajax} from '../ajax'; +var bidmanager = require('src/bidmanager.js'), + bidfactory = require('src/bidfactory.js'), + CONSTANTS = require('src/constants.json'); -module.exports = function(bidManager, global, loader) { +function RhythmoneAdapter (bidManager, global, loader) { var version = '0.9.0.0', defaultZone = '1r', defaultPath = 'mvo', @@ -290,4 +291,10 @@ module.exports = function(bidManager, global, loader) { logToConsole('version: ' + version); }; -}; +} + +adaptermanager.registerBidAdapter(new RhythmoneAdapter, 'rhythmone', { + supportedMediaTypes: ['video'] +}); + +module.exports = RhythmoneAdapter; diff --git a/test/spec/adapters/rhythmone_spec.js b/test/spec/modules/rhythmoneBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/rhythmone_spec.js rename to test/spec/modules/rhythmoneBidAdapter_spec.js index efc964b6b6e..002d021b574 100644 --- a/test/spec/adapters/rhythmone_spec.js +++ b/test/spec/modules/rhythmoneBidAdapter_spec.js @@ -1,4 +1,4 @@ -var r1 = require('../../../src/adapters/rhythmone.js'); +var r1 = require('../../../modules/rhythmoneBidAdapter'); var assert = require('assert'); describe('rhythmone adapter tests', function () { From f1d931751f4f6cca609167cd1383d89046d84230 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 11:17:55 -0600 Subject: [PATCH 066/111] added adkernel alias to headbidding to adkernalBidAdapter module --- adapters.json | 5 ----- modules/adkernelBidAdapter.js | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/adapters.json b/adapters.json index b4317c43a46..5733f91ea7a 100644 --- a/adapters.json +++ b/adapters.json @@ -26,11 +26,6 @@ "supportedMediaTypes": ["video"] } }, - { - "adkernel": { - "alias": "headbidding" - } - }, { "stickyadstv": { "alias": "freewheel-ssp" diff --git a/modules/adkernelBidAdapter.js b/modules/adkernelBidAdapter.js index 39975a78447..cd0ec8eb3cd 100644 --- a/modules/adkernelBidAdapter.js +++ b/modules/adkernelBidAdapter.js @@ -269,5 +269,6 @@ AdKernelAdapter.createNew = function() { }; adaptermanager.registerBidAdapter(new AdKernelAdapter, 'adkernel'); +adaptermanager.aliasBidAdapter('adkernel', 'headbidding'); module.exports = AdKernelAdapter; From 12990f316fb3642008896b0d44285509fed6ffd2 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 15:28:08 -0600 Subject: [PATCH 067/111] roxot bid adapter converted to module --- adapters.json | 1 - src/adapters/roxot.js => modules/roxotBidAdapter.js | 13 ++++++++----- .../roxotBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) rename src/adapters/roxot.js => modules/roxotBidAdapter.js (89%) rename test/spec/{adapters/roxot_spec.js => modules/roxotBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 5733f91ea7a..89a01c5c860 100644 --- a/adapters.json +++ b/adapters.json @@ -16,7 +16,6 @@ "underdogmedia", "xhb", "sharethrough", - "roxot", "vertoz", "widespace", "tapsense", diff --git a/src/adapters/roxot.js b/modules/roxotBidAdapter.js similarity index 89% rename from src/adapters/roxot.js rename to modules/roxotBidAdapter.js index 21d40597d7b..a106342ae4f 100644 --- a/src/adapters/roxot.js +++ b/modules/roxotBidAdapter.js @@ -1,8 +1,9 @@ -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); var RoxotAdapter = function RoxotAdapter() { var roxotUrl = 'r.rxthdr.com'; @@ -110,4 +111,6 @@ var RoxotAdapter = function RoxotAdapter() { } }; +adaptermanager.registerBidAdapter(new RoxotAdapter, 'roxot'); + module.exports = RoxotAdapter; diff --git a/test/spec/adapters/roxot_spec.js b/test/spec/modules/roxotBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/roxot_spec.js rename to test/spec/modules/roxotBidAdapter_spec.js index 4d9918f0ad0..af7bef291e1 100644 --- a/test/spec/adapters/roxot_spec.js +++ b/test/spec/modules/roxotBidAdapter_spec.js @@ -1,6 +1,6 @@ describe('Roxot adapter tests', function() { const expect = require('chai').expect; - const adapter = require('src/adapters/roxot'); + const adapter = require('modules/roxotBidAdapter'); const bidmanager = require('src/bidmanager'); describe('roxotResponseHandler', function () { From f87d5e1132d1c7190b4eb27b2053960b605fac16 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 15:31:16 -0600 Subject: [PATCH 068/111] sekindoUM bid adapter converted to module --- adapters.json | 1 - .../sekindoUMBidAdapter.js | 15 +++++++++------ .../sekindoUMBidAdapter_spec.js} | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) rename src/adapters/sekindoUM.js => modules/sekindoUMBidAdapter.js (88%) rename test/spec/{adapters/sekindoUM_spec.js => modules/sekindoUMBidAdapter_spec.js} (96%) diff --git a/adapters.json b/adapters.json index 89a01c5c860..e6bdab5fea2 100644 --- a/adapters.json +++ b/adapters.json @@ -2,7 +2,6 @@ "vertamedia", "smartyads", "smartadserver", - "sekindoUM", "serverbid", "sonobi", "sovrn", diff --git a/src/adapters/sekindoUM.js b/modules/sekindoUMBidAdapter.js similarity index 88% rename from src/adapters/sekindoUM.js rename to modules/sekindoUMBidAdapter.js index 62be5c2095d..caf4e82cf81 100755 --- a/src/adapters/sekindoUM.js +++ b/modules/sekindoUMBidAdapter.js @@ -1,9 +1,10 @@ -import { getBidRequest } from '../utils.js'; -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); +import { getBidRequest } from 'src/utils.js'; +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var adaptermanager = require('src/adaptermanager'); var sekindoUMAdapter; sekindoUMAdapter = function sekindoUMAdapter() { @@ -84,4 +85,6 @@ sekindoUMAdapter = function sekindoUMAdapter() { }; }; +adaptermanager.registerBidAdapter(new sekindoUMAdapter, 'sekindoUM'); + module.exports = sekindoUMAdapter; diff --git a/test/spec/adapters/sekindoUM_spec.js b/test/spec/modules/sekindoUMBidAdapter_spec.js similarity index 96% rename from test/spec/adapters/sekindoUM_spec.js rename to test/spec/modules/sekindoUMBidAdapter_spec.js index d1bd1d4b9f5..074e51b3a9d 100644 --- a/test/spec/adapters/sekindoUM_spec.js +++ b/test/spec/modules/sekindoUMBidAdapter_spec.js @@ -1,5 +1,5 @@ import {expect} from 'chai'; -import sekindoUMAdapter from '../../../src/adapters/sekindoUM'; +import sekindoUMAdapter from '../../../modules/sekindoUMBidAdapter'; var bidManager = require('src/bidmanager'); describe('sekindoUM Adapter Tests', () => { From 6d5fe5f42d1dc2f56a96a309a7422555aadd7246 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 15:35:23 -0600 Subject: [PATCH 069/111] remove baseAdapter --- src/adaptermanager.js | 12 +++--------- src/adapters/baseAdapter.js | 17 ----------------- 2 files changed, 3 insertions(+), 26 deletions(-) delete mode 100644 src/adapters/baseAdapter.js diff --git a/src/adaptermanager.js b/src/adaptermanager.js index cb5d86e8aad..8ff971b43be 100644 --- a/src/adaptermanager.js +++ b/src/adaptermanager.js @@ -7,7 +7,6 @@ import { processNativeAdUnitParams, nativeAdapters } from './native'; var utils = require('./utils.js'); var CONSTANTS = require('./constants.json'); var events = require('./events'); -import { BaseAdapter } from './adapters/baseAdapter'; var _bidderRegistry = {}; exports.bidderRegistry = _bidderRegistry; @@ -186,14 +185,9 @@ exports.aliasBidAdapter = function (bidderCode, alias) { } else { try { let newAdapter = null; - if (bidAdaptor instanceof BaseAdapter) { - // newAdapter = new bidAdaptor.constructor(alias); - utils.logError(bidderCode + ' bidder does not currently support aliasing.', 'adaptermanager.aliasBidAdapter'); - } else { - newAdapter = bidAdaptor.createNew(); - newAdapter.setBidderCode(alias); - this.registerBidAdapter(newAdapter, alias); - } + newAdapter = bidAdaptor.createNew(); + newAdapter.setBidderCode(alias); + this.registerBidAdapter(newAdapter, alias); } catch (e) { utils.logError(bidderCode + ' bidder does not currently support aliasing.', 'adaptermanager.aliasBidAdapter'); } diff --git a/src/adapters/baseAdapter.js b/src/adapters/baseAdapter.js deleted file mode 100644 index 819436b4fee..00000000000 --- a/src/adapters/baseAdapter.js +++ /dev/null @@ -1,17 +0,0 @@ -export class BaseAdapter { - constructor(code) { - this.code = code; - } - - getCode() { - return this.code; - } - - setCode(code) { - this.code = code; - } - - callBids() { - throw 'adapter implementation must override callBids method'; - } -} From b849a44cb8735998a9c3137d6cc81cd69a16d951 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 15:38:29 -0600 Subject: [PATCH 070/111] serverbid bid adapter converted to module --- adapters.json | 1 - src/adapters/serverbid.js => modules/serverbidBidAdapter.js | 5 ++++- .../serverbidBidAdapter_spec.js} | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) rename src/adapters/serverbid.js => modules/serverbidBidAdapter.js (96%) rename test/spec/{adapters/serverbid_spec.js => modules/serverbidBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index e6bdab5fea2..0ed93f6738d 100644 --- a/adapters.json +++ b/adapters.json @@ -2,7 +2,6 @@ "vertamedia", "smartyads", "smartadserver", - "serverbid", "sonobi", "sovrn", "springserve", diff --git a/src/adapters/serverbid.js b/modules/serverbidBidAdapter.js similarity index 96% rename from src/adapters/serverbid.js rename to modules/serverbidBidAdapter.js index a7ba5f6a57e..c29e1bc8617 100644 --- a/src/adapters/serverbid.js +++ b/modules/serverbidBidAdapter.js @@ -1,8 +1,9 @@ -import Adapter from 'src/adapters/adapter'; +import Adapter from 'src/adapter'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; import { ajax } from 'src/ajax'; +import adaptermanager from 'src/adaptermanager'; const ServerBidAdapter = function ServerBidAdapter() { const baseAdapter = Adapter.createNew('serverbid'); @@ -150,4 +151,6 @@ ServerBidAdapter.createNew = function() { return new ServerBidAdapter(); }; +adaptermanager.registerBidAdapter(new ServerBidAdapter, 'serverbid'); + module.exports = ServerBidAdapter; diff --git a/test/spec/adapters/serverbid_spec.js b/test/spec/modules/serverbidBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/serverbid_spec.js rename to test/spec/modules/serverbidBidAdapter_spec.js index 6151c99b21a..ed1a227235f 100644 --- a/test/spec/adapters/serverbid_spec.js +++ b/test/spec/modules/serverbidBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import Adapter from 'src/adapters/serverbid'; +import Adapter from 'modules/serverbidBidAdapter'; import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; From 660dcf29afd2e87445c1bf5323b0e564ff6ae724 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 15:41:26 -0600 Subject: [PATCH 071/111] sharethrough bid adapter converted to module --- adapters.json | 1 - .../sharethroughBidAdapter.js | 11 +++++++---- .../sharethroughBidAdapter_spec.js} | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/sharethrough.js => modules/sharethroughBidAdapter.js (92%) rename test/spec/{adapters/sharethrough_spec.js => modules/sharethroughBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 0ed93f6738d..2e129b3060a 100644 --- a/adapters.json +++ b/adapters.json @@ -13,7 +13,6 @@ "wideorbit", "underdogmedia", "xhb", - "sharethrough", "vertoz", "widespace", "tapsense", diff --git a/src/adapters/sharethrough.js b/modules/sharethroughBidAdapter.js similarity index 92% rename from src/adapters/sharethrough.js rename to modules/sharethroughBidAdapter.js index c8d4ca12e2d..9ab67af89bb 100644 --- a/src/adapters/sharethrough.js +++ b/modules/sharethroughBidAdapter.js @@ -1,7 +1,8 @@ -var utils = require('../utils.js'); -var bidmanager = require('../bidmanager.js'); -var bidfactory = require('../bidfactory.js'); -var ajax = require('../ajax.js').ajax; +var utils = require('src/utils.js'); +var bidmanager = require('src/bidmanager.js'); +var bidfactory = require('src/bidfactory.js'); +var ajax = require('src/ajax.js').ajax; +var adaptermanager = require('src/adaptermanager'); const STR_BIDDER_CODE = 'sharethrough'; const STR_VERSION = '1.2.0'; @@ -103,4 +104,6 @@ var SharethroughAdapter = function SharethroughAdapter() { }; }; +adaptermanager.registerBidAdapter(new SharethroughAdapter, 'sharethrough'); + module.exports = SharethroughAdapter; diff --git a/test/spec/adapters/sharethrough_spec.js b/test/spec/modules/sharethroughBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/sharethrough_spec.js rename to test/spec/modules/sharethroughBidAdapter_spec.js index 4c9fc400db5..070f20958bb 100644 --- a/test/spec/adapters/sharethrough_spec.js +++ b/test/spec/modules/sharethroughBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import Adapter from '../../../src/adapters/sharethrough'; +import Adapter from '../../../modules/sharethroughBidAdapter'; import bidManager from '../../../src/bidmanager'; describe('sharethrough adapter', () => { From 5f254d9a6fe06b4f6cbee1d936f3b2f919971645 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 15:43:56 -0600 Subject: [PATCH 072/111] smartyads bid adapter converted to module --- adapters.json | 1 - src/adapters/smartyads.js => modules/smartyadsBidAdapter.js | 5 ++++- .../smartyadsBidAdapter_spec.js} | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) rename src/adapters/smartyads.js => modules/smartyadsBidAdapter.js (96%) rename test/spec/{adapters/smartyads_spec.js => modules/smartyadsBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 2e129b3060a..231faefe4dd 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "vertamedia", - "smartyads", "smartadserver", "sonobi", "sovrn", diff --git a/src/adapters/smartyads.js b/modules/smartyadsBidAdapter.js similarity index 96% rename from src/adapters/smartyads.js rename to modules/smartyadsBidAdapter.js index 8416f90a701..2c6cde0c8e8 100755 --- a/src/adapters/smartyads.js +++ b/modules/smartyadsBidAdapter.js @@ -1,9 +1,10 @@ -import * as Adapter from './adapter.js'; +import * as Adapter from 'src/adapter.js'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; import {ajax} from 'src/ajax'; import {STATUS} from 'src/constants'; +import adaptermanager from 'src/adaptermanager'; const SMARTYADS_BIDDER_CODE = 'smartyads'; @@ -179,4 +180,6 @@ SmartyadsAdapter.createNew = function () { return new SmartyadsAdapter(); }; +adaptermanager.registerBidAdapter(new SmartyadsAdapter, 'smartyads'); + module.exports = SmartyadsAdapter; diff --git a/test/spec/adapters/smartyads_spec.js b/test/spec/modules/smartyadsBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/smartyads_spec.js rename to test/spec/modules/smartyadsBidAdapter_spec.js index 7d568573646..88213504a7d 100644 --- a/test/spec/adapters/smartyads_spec.js +++ b/test/spec/modules/smartyadsBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import Adapter from '../../../src/adapters/smartyads'; +import Adapter from '../../../modules/smartyadsBidAdapter'; import adapterManager from 'src/adaptermanager'; import bidManager from 'src/bidmanager'; import CONSTANTS from 'src/constants.json'; From d7eecab5154ca1289a7e8f94a51feb120b4b2995 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 15:58:00 -0600 Subject: [PATCH 073/111] update conversantBidAdapter to support video --- modules/conversantBidAdapter.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/conversantBidAdapter.js b/modules/conversantBidAdapter.js index 1623ec28709..12984b521db 100644 --- a/modules/conversantBidAdapter.js +++ b/modules/conversantBidAdapter.js @@ -271,6 +271,8 @@ var ConversantAdapter = function () { }; }; -adaptermanager.registerBidAdapter(new ConversantAdapter, 'conversant'); +adaptermanager.registerBidAdapter(new ConversantAdapter, 'conversant', { + supportedMediaTypes: ['video'] +}); module.exports = ConversantAdapter; From aad07717f53b591b4a13d1e4e5c1e5820e77b559 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 15:59:37 -0600 Subject: [PATCH 074/111] get rubiconBidAdapter latest --- modules/rubiconBidAdapter.js | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/rubiconBidAdapter.js b/modules/rubiconBidAdapter.js index a1a264231c3..6621b400b6c 100644 --- a/modules/rubiconBidAdapter.js +++ b/modules/rubiconBidAdapter.js @@ -52,6 +52,7 @@ var sizeMap = { 57: '970x250', 58: '1000x90', 59: '320x80', + 60: '320x150', 61: '1000x1000', 65: '640x480', 67: '320x480', From 6d2b977d321bc964b16a1819e45eaa82d93ad172 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:02:42 -0600 Subject: [PATCH 075/111] move rubicon adapter to module properly --- src/adapters/rubicon.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/adapters/rubicon.js diff --git a/src/adapters/rubicon.js b/src/adapters/rubicon.js deleted file mode 100644 index e69de29bb2d..00000000000 From c3c199a7b0fea36cddc11ab5f34a59261107df32 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:05:30 -0600 Subject: [PATCH 076/111] sonobi bid adapter converted to module --- adapters.json | 1 - src/adapters/sonobi.js => modules/sonobiBidAdapter.js | 11 +++++++---- .../sonobiBidAdapter_spec.js} | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/sonobi.js => modules/sonobiBidAdapter.js (93%) rename test/spec/{adapters/sonobi_spec.js => modules/sonobiBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 231faefe4dd..2d3f125b950 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,6 @@ [ "vertamedia", "smartadserver", - "sonobi", "sovrn", "springserve", "thoughtleadr", diff --git a/src/adapters/sonobi.js b/modules/sonobiBidAdapter.js similarity index 93% rename from src/adapters/sonobi.js rename to modules/sonobiBidAdapter.js index cfec52257cf..f8ee391050d 100644 --- a/src/adapters/sonobi.js +++ b/modules/sonobiBidAdapter.js @@ -1,7 +1,8 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); -var utils = require('../utils'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var utils = require('src/utils'); +var adaptermanager = require('src/adaptermanager'); var SonobiAdapter = function SonobiAdapter() { var keymakerAssoc = {}; // Remember placement codes for callback mapping @@ -112,4 +113,6 @@ var SonobiAdapter = function SonobiAdapter() { }; }; +adaptermanager.registerBidAdapter(new SonobiAdapter, 'sonobi'); + module.exports = SonobiAdapter; diff --git a/test/spec/adapters/sonobi_spec.js b/test/spec/modules/sonobiBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/sonobi_spec.js rename to test/spec/modules/sonobiBidAdapter_spec.js index f5f4ab49a52..346fc18e637 100644 --- a/test/spec/adapters/sonobi_spec.js +++ b/test/spec/modules/sonobiBidAdapter_spec.js @@ -1,6 +1,6 @@ const chai = require('chai'); const expect = require('chai').expect; -const Adapter = require('src/adapters/sonobi'); +const Adapter = require('modules/sonobiBidAdapter'); const bidManager = require('src/bidmanager'); const adLoader = require('src/adloader'); const utils = require('src/utils'); From 5a457f9af69d2fe1180a7e4cf3ceea74a5b81797 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:18:00 -0600 Subject: [PATCH 077/111] sovrn bid adapter converted to module --- adapters.json | 1 - src/adapters/sovrn.js => modules/sovrnBidAdapter.js | 13 ++++++++----- .../sovrnBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) rename src/adapters/sovrn.js => modules/sovrnBidAdapter.js (93%) rename test/spec/{adapters/sovrn_spec.js => modules/sovrnBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 2d3f125b950..14841362cbd 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,6 @@ [ "vertamedia", "smartadserver", - "sovrn", "springserve", "thoughtleadr", "stickyadstv", diff --git a/src/adapters/sovrn.js b/modules/sovrnBidAdapter.js similarity index 93% rename from src/adapters/sovrn.js rename to modules/sovrnBidAdapter.js index 968ce3985fa..e5d59ad637f 100644 --- a/src/adapters/sovrn.js +++ b/modules/sovrnBidAdapter.js @@ -1,8 +1,9 @@ -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); /** * Adapter for requesting bids from Sovrn @@ -157,4 +158,6 @@ var SovrnAdapter = function SovrnAdapter() { }; }; +adaptermanager.registerBidAdapter(new SovrnAdapter, 'sovrn'); + module.exports = SovrnAdapter; diff --git a/test/spec/adapters/sovrn_spec.js b/test/spec/modules/sovrnBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/sovrn_spec.js rename to test/spec/modules/sovrnBidAdapter_spec.js index 81a695171d2..e0be789c1bf 100644 --- a/test/spec/adapters/sovrn_spec.js +++ b/test/spec/modules/sovrnBidAdapter_spec.js @@ -1,6 +1,6 @@ describe('sovrn adapter tests', function () { const expect = require('chai').expect; - const adapter = require('src/adapters/sovrn'); + const adapter = require('modules/sovrnBidAdapter'); const bidmanager = require('src/bidmanager'); describe('sovrnResponse', function () { From d9a3db63e79e9a15fa55078a24ac61451d8522e7 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:21:20 -0600 Subject: [PATCH 078/111] springserve bid adpater converted to module --- adapters.json | 1 - .../springserve.js => modules/springserveBidAdapter.js | 9 ++++++--- 2 files changed, 6 insertions(+), 4 deletions(-) rename src/adapters/springserve.js => modules/springserveBidAdapter.js (93%) diff --git a/adapters.json b/adapters.json index 14841362cbd..b7ca9b8f71e 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,6 @@ [ "vertamedia", "smartadserver", - "springserve", "thoughtleadr", "stickyadstv", "triplelift", diff --git a/src/adapters/springserve.js b/modules/springserveBidAdapter.js similarity index 93% rename from src/adapters/springserve.js rename to modules/springserveBidAdapter.js index 84e5002827a..d0ec313e7e2 100644 --- a/src/adapters/springserve.js +++ b/modules/springserveBidAdapter.js @@ -1,6 +1,7 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); var SpringServeAdapter; SpringServeAdapter = function SpringServeAdapter() { @@ -110,4 +111,6 @@ SpringServeAdapter = function SpringServeAdapter() { }; }; +adaptermanager.registerBidAdapter(new SpringServeAdapter, 'springserveg'); + module.exports = SpringServeAdapter; From 98445de9178fa09eff18d5c1d879f209c4d71e7d Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:26:49 -0600 Subject: [PATCH 079/111] stickyadstv bid adapter converted to module (and removed console logs) --- adapters.json | 6 ------ .../stickyadstvBidAdapter.js | 17 +++++++++++------ .../stickyadstvBidAdapter_spec.js} | 3 +-- 3 files changed, 12 insertions(+), 14 deletions(-) rename src/adapters/stickyadstv.js => modules/stickyadstvBidAdapter.js (92%) rename test/spec/{adapters/stickyadstv_spec.js => modules/stickyadstvBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index b7ca9b8f71e..a766c1a9f59 100644 --- a/adapters.json +++ b/adapters.json @@ -2,7 +2,6 @@ "vertamedia", "smartadserver", "thoughtleadr", - "stickyadstv", "triplelift", "twenga", "yieldbot", @@ -17,10 +16,5 @@ "vertamedia": { "supportedMediaTypes": ["video"] } - }, - { - "stickyadstv": { - "alias": "freewheel-ssp" - } } ] diff --git a/src/adapters/stickyadstv.js b/modules/stickyadstvBidAdapter.js similarity index 92% rename from src/adapters/stickyadstv.js rename to modules/stickyadstvBidAdapter.js index d0095541a8f..27ebb4ef31a 100644 --- a/src/adapters/stickyadstv.js +++ b/modules/stickyadstvBidAdapter.js @@ -1,7 +1,9 @@ -var Adapter = require('./adapter.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); +var Adapter = require('src/adapter.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var utils = require('src/utils.js'); +var adaptermanager = require('src/adaptermanager'); var StickyAdsTVAdapter = function StickyAdsTVAdapter() { var STICKYADS_BIDDERCODE = 'stickyadstv'; @@ -21,7 +23,7 @@ var StickyAdsTVAdapter = function StickyAdsTVAdapter() { if (bid.placementCode && bid.params.zoneId) { sendBidRequest(bid); } else { - console.warn('StickyAdsTV: Missing mandatory field(s).'); + utils.logWarn('StickyAdsTV: Missing mandatory field(s).'); } } } @@ -200,7 +202,7 @@ var StickyAdsTVAdapter = function StickyAdsTVAdapter() { var priceData = vast.getPricing(); if (!priceData) { - console.warn("StickyAdsTV: Bid pricing Can't be retreived. You may need to enable pricing on you're zone. Please get in touch with your sticky contact."); + utils.logWarn("StickyAdsTV: Bid pricing Can't be retreived. You may need to enable pricing on you're zone. Please get in touch with your sticky contact."); } return priceData; @@ -271,4 +273,7 @@ StickyAdsTVAdapter.createNew = function() { return new StickyAdsTVAdapter(); }; +adaptermanager.registerBidAdapter(new StickyAdsTVAdapter, 'stickyadstv'); +adaptermanager.aliasBidAdapter('stickyadstv', 'freewheel-ssp'); + module.exports = StickyAdsTVAdapter; diff --git a/test/spec/adapters/stickyadstv_spec.js b/test/spec/modules/stickyadstvBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/stickyadstv_spec.js rename to test/spec/modules/stickyadstvBidAdapter_spec.js index 96f5d4a641d..276b8d4fb96 100644 --- a/test/spec/adapters/stickyadstv_spec.js +++ b/test/spec/modules/stickyadstvBidAdapter_spec.js @@ -1,7 +1,6 @@ import {expect} from 'chai'; import {assert} from 'chai'; -import Adapter from '../../../src/adapters/stickyadstv'; -import bidManager from '../../../src/bidmanager'; +import Adapter from '../../../modules/stickyadstvBidAdapter'; import adLoader from '../../../src/adloader'; describe('StickyAdsTV Adapter', function () { From 29398af850d9ff58d79b5017472c6b7ba1c97cc8 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:29:15 -0600 Subject: [PATCH 080/111] convert tapsense bid adapter to module --- adapters.json | 1 - .../tapsense.js => modules/tapsenseBidAdapter.js | 11 +++++++---- .../tapsenseBidAdapter_spec.js} | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) rename src/adapters/tapsense.js => modules/tapsenseBidAdapter.js (88%) rename test/spec/{adapters/tapsense_spec.js => modules/tapsenseBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index a766c1a9f59..1f69c5d829a 100644 --- a/adapters.json +++ b/adapters.json @@ -10,7 +10,6 @@ "xhb", "vertoz", "widespace", - "tapsense", "trion", { "vertamedia": { diff --git a/src/adapters/tapsense.js b/modules/tapsenseBidAdapter.js similarity index 88% rename from src/adapters/tapsense.js rename to modules/tapsenseBidAdapter.js index 9ac7cf2c0e2..cfd2fae1c2f 100644 --- a/src/adapters/tapsense.js +++ b/modules/tapsenseBidAdapter.js @@ -1,9 +1,10 @@ // v0.0.1 -const bidfactory = require('../bidfactory.js'); -const bidmanager = require('../bidmanager.js'); -const adloader = require('../adloader'); -const utils = require('../utils.js'); +const bidfactory = require('src/bidfactory.js'); +const bidmanager = require('src/bidmanager.js'); +const adloader = require('src/adloader'); +const utils = require('src/utils.js'); +const adaptermanager = require('src/adaptermanager'); const TapSenseAdapter = function TapSenseAdapter() { const version = '0.0.1'; @@ -83,4 +84,6 @@ const TapSenseAdapter = function TapSenseAdapter() { }; }; +adaptermanager.registerBidAdapter(new TapSenseAdapter, 'tapsense'); + module.exports = TapSenseAdapter; diff --git a/test/spec/adapters/tapsense_spec.js b/test/spec/modules/tapsenseBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/tapsense_spec.js rename to test/spec/modules/tapsenseBidAdapter_spec.js index 34c0f00d637..997f0ca6c6e 100644 --- a/test/spec/adapters/tapsense_spec.js +++ b/test/spec/modules/tapsenseBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import Adapter from 'src/adapters/tapsense'; +import Adapter from 'modules/tapsenseBidAdapter'; import bidmanager from 'src/bidmanager'; import adloader from 'src/adloader'; import * as utils from 'src/utils'; @@ -29,7 +29,7 @@ const DEFAULT_BIDDER_REQUEST = { } } ] -} +}; const SUCCESSFUL_RESPONSE = { 'count_ad_units': 1, From b90fe13e7f44850b51bf9aabf6fc6692a7e6752a Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:31:53 -0600 Subject: [PATCH 081/111] thoughtleadr bid adapter converted to module --- adapters.json | 1 - .../thoughtleadrBidAdapter.js | 11 +++++++---- .../thoughtleadrBidAdapter_spec.js} | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) rename src/adapters/thoughtleadr.js => modules/thoughtleadrBidAdapter.js (91%) rename test/spec/{adapters/thoughtleadr_spec.js => modules/thoughtleadrBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 1f69c5d829a..e07b21d6133 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,6 @@ [ "vertamedia", "smartadserver", - "thoughtleadr", "triplelift", "twenga", "yieldbot", diff --git a/src/adapters/thoughtleadr.js b/modules/thoughtleadrBidAdapter.js similarity index 91% rename from src/adapters/thoughtleadr.js rename to modules/thoughtleadrBidAdapter.js index 70ffe2e610e..17092fc1819 100644 --- a/src/adapters/thoughtleadr.js +++ b/modules/thoughtleadrBidAdapter.js @@ -1,8 +1,9 @@ 'use strict'; -var bidfactory = require('../bidfactory'); -var bidmanager = require('../bidmanager'); -var utils = require('../utils'); -var adloader_1 = require('../adloader'); +var bidfactory = require('src/bidfactory'); +var bidmanager = require('src/bidmanager'); +var utils = require('src/utils'); +var adloader_1 = require('src/adloader'); +var adaptermanager = require('src/adaptermanager'); var ROOT_URL = '//cdn.thoughtleadr.com/v4/'; var BID_AVAILABLE = 1; @@ -96,4 +97,6 @@ var ThoughtleadrAdapter = (function () { return ThoughtleadrAdapter; }()); +adaptermanager.registerBidAdapter(new ThoughtleadrAdapter, 'thoughtleadr'); + module.exports = ThoughtleadrAdapter; diff --git a/test/spec/adapters/thoughtleadr_spec.js b/test/spec/modules/thoughtleadrBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/thoughtleadr_spec.js rename to test/spec/modules/thoughtleadrBidAdapter_spec.js index 7fa6703ae10..43c13ebc21f 100644 --- a/test/spec/adapters/thoughtleadr_spec.js +++ b/test/spec/modules/thoughtleadrBidAdapter_spec.js @@ -1,6 +1,6 @@ 'use strict'; var chai_1 = require('chai'); -var ta = require('../../../src/adapters/thoughtleadr'); +var ta = require('../../../modules/thoughtleadrBidAdapter'); var adloader = require('../../../src/adloader'); var bidfactory = require('../../../src/bidfactory'); var Adapter = ta; From f605c7fb00847ae4e77731efccf8bef989cc6b7b Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:35:13 -0600 Subject: [PATCH 082/111] trion bid adapter converted to module --- adapters.json | 1 - .../trion.js => modules/trionBidAdapter.js | 22 +++++++++---------- .../trionBidAdapter_spec.js} | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) rename src/adapters/trion.js => modules/trionBidAdapter.js (89%) rename test/spec/{adapters/trion_spec.js => modules/trionBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index e07b21d6133..608b6fd7395 100644 --- a/adapters.json +++ b/adapters.json @@ -9,7 +9,6 @@ "xhb", "vertoz", "widespace", - "trion", { "vertamedia": { "supportedMediaTypes": ["video"] diff --git a/src/adapters/trion.js b/modules/trionBidAdapter.js similarity index 89% rename from src/adapters/trion.js rename to modules/trionBidAdapter.js index c0320f262c3..4b2b1e9f508 100644 --- a/src/adapters/trion.js +++ b/modules/trionBidAdapter.js @@ -1,17 +1,15 @@ -import { getBidRequest } from '../utils.js'; - -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var adloader = require('../adloader.js'); -var bidmanager = require('../bidmanager.js'); -var bidfactory = require('../bidfactory.js'); -var Adapter = require('./adapter.js'); +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var adloader = require('src/adloader.js'); +var bidmanager = require('src/bidmanager.js'); +var bidfactory = require('src/bidfactory.js'); +var Adapter = require('src/adapter.js'); +var adaptermanager = require('src/adaptermanager'); const BID_REQUEST_BASE_URL = 'https://in-appadvertising.com/api/bidRequest?'; const USER_SYNC_URL = 'https://in-appadvertising.com/api/userSync.js'; -var TrionAdapter; -TrionAdapter = function TrionAdapter() { +function TrionAdapter() { var baseAdapter = Adapter.createNew('trion'); var userTag = null; @@ -98,7 +96,7 @@ TrionAdapter = function TrionAdapter() { var bidId = trionResponseObj.bidId; var result = trionResponseObj && trionResponseObj.result; - bidObj = getBidRequest(bidId); + bidObj = utils.getBidRequest(bidId); if (bidObj) { bidCode = bidObj.bidder; placementCode = bidObj.placementCode; @@ -132,4 +130,6 @@ TrionAdapter.createNew = function () { return new TrionAdapter(); }; +adaptermanager.registerBidAdapter(new TrionAdapter, 'trion'); + module.exports = TrionAdapter; diff --git a/test/spec/adapters/trion_spec.js b/test/spec/modules/trionBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/trion_spec.js rename to test/spec/modules/trionBidAdapter_spec.js index 192ed9c2b06..50988c564ec 100644 --- a/test/spec/adapters/trion_spec.js +++ b/test/spec/modules/trionBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import trionAdapter from 'src/adapters/trion'; +import trionAdapter from 'modules/trionBidAdapter'; import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; const CONSTANTS = require('src/constants.json'); From d8a6be110441f754adb4a2bf5d9cbfe600c9e14f Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:37:28 -0600 Subject: [PATCH 083/111] triplelift bid adapter converted to module --- adapters.json | 1 - .../triplelift.js => modules/tripleliftBidAdapter.js | 12 ++++++++---- .../tripleliftBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) rename src/adapters/triplelift.js => modules/tripleliftBidAdapter.js (93%) rename test/spec/{adapters/triplelift_spec.js => modules/tripleliftBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 608b6fd7395..032729ff1e5 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,6 @@ [ "vertamedia", "smartadserver", - "triplelift", "twenga", "yieldbot", "wideorbit", diff --git a/src/adapters/triplelift.js b/modules/tripleliftBidAdapter.js similarity index 93% rename from src/adapters/triplelift.js rename to modules/tripleliftBidAdapter.js index bc17682f8ea..b029d9a2c14 100644 --- a/src/adapters/triplelift.js +++ b/modules/tripleliftBidAdapter.js @@ -1,7 +1,8 @@ -var utils = require('../utils.js'); -var adloader = require('../adloader.js'); -var bidmanager = require('../bidmanager.js'); -var bidfactory = require('../bidfactory.js'); +var utils = require('src/utils.js'); +var adloader = require('src/adloader.js'); +var bidmanager = require('src/bidmanager.js'); +var bidfactory = require('src/bidfactory.js'); +var adaptermanager = require('src/adaptermanager'); /* TripleLift bidder factory function * Use to create a TripleLiftAdapter object @@ -126,4 +127,7 @@ var TripleLiftAdapter = function TripleLiftAdapter() { }; }; + +adaptermanager.registerBidAdapter(new TripleLiftAdapter, 'triplelift'); + module.exports = TripleLiftAdapter; diff --git a/test/spec/adapters/triplelift_spec.js b/test/spec/modules/tripleliftBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/triplelift_spec.js rename to test/spec/modules/tripleliftBidAdapter_spec.js index dc19be19175..95658883fd0 100644 --- a/test/spec/adapters/triplelift_spec.js +++ b/test/spec/modules/tripleliftBidAdapter_spec.js @@ -1,5 +1,5 @@ import {expect} from 'chai'; -import Adapter from '../../../src/adapters/triplelift'; +import Adapter from '../../../modules/tripleliftBidAdapter'; import bidManager from '../../../src/bidmanager'; import adLoader from '../../../src/adloader'; import {parse as parseURL} from '../../../src/url'; From cea7e59ae0efdbefc45f2424ad9138cd0585e324 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:40:34 -0600 Subject: [PATCH 084/111] twenga bid adapter converted to module --- adapters.json | 1 - .../twenga.js => modules/twengaBidAdapter.js | 24 +++++++++---------- .../twengaBidAdapter_spec.js} | 2 +- 3 files changed, 13 insertions(+), 14 deletions(-) rename src/adapters/twenga.js => modules/twengaBidAdapter.js (89%) rename test/spec/{adapters/twenga_spec.js => modules/twengaBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 032729ff1e5..98edc0ba6ab 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,6 @@ [ "vertamedia", "smartadserver", - "twenga", "yieldbot", "wideorbit", "underdogmedia", diff --git a/src/adapters/twenga.js b/modules/twengaBidAdapter.js similarity index 89% rename from src/adapters/twenga.js rename to modules/twengaBidAdapter.js index 5951e16bc2d..34a4bef444b 100644 --- a/src/adapters/twenga.js +++ b/modules/twengaBidAdapter.js @@ -1,14 +1,12 @@ -import { getBidRequest } from '../utils.js'; - -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var adloader = require('../adloader.js'); -var bidmanager = require('../bidmanager.js'); -var bidfactory = require('../bidfactory.js'); -var Adapter = require('./adapter.js'); - -var TwengaAdapter; -TwengaAdapter = function TwengaAdapter() { +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var adloader = require('src/adloader.js'); +var bidmanager = require('src/bidmanager.js'); +var bidfactory = require('src/bidfactory.js'); +var Adapter = require('src/adapter.js'); +var adaptermanager = require('src/adaptermanager'); + +function TwengaAdapter() { var baseAdapter = Adapter.createNew('twenga'); baseAdapter.callBids = function (params) { @@ -66,7 +64,7 @@ TwengaAdapter = function TwengaAdapter() { var responseCPM; var id = bidResponseObj.callback_uid; var placementCode = ''; - var bidObj = getBidRequest(id); + var bidObj = utils.getBidRequest(id); if (bidObj) { bidCode = bidObj.bidder; @@ -138,4 +136,6 @@ TwengaAdapter.createNew = function () { return new TwengaAdapter(); }; +adaptermanager.registerBidAdapter(new TwengaAdapter, 'twenga'); + module.exports = TwengaAdapter; diff --git a/test/spec/adapters/twenga_spec.js b/test/spec/modules/twengaBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/twenga_spec.js rename to test/spec/modules/twengaBidAdapter_spec.js index 9bbeb4c1d7b..d5dd92fd0a6 100644 --- a/test/spec/adapters/twenga_spec.js +++ b/test/spec/modules/twengaBidAdapter_spec.js @@ -1,7 +1,7 @@ describe('twenga adapter tests', function () { var urlParse = require('url-parse'); var querystringify = require('querystringify'); - var adapter = require('src/adapters/twenga'); + var adapter = require('modules/twengaBidAdapter'); var adLoader = require('src/adloader'); var expect = require('chai').expect; var bidmanager = require('src/bidmanager'); From 09eedf934c8690297d7be28f16f393dcf7e84fd8 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:43:11 -0600 Subject: [PATCH 085/111] underdogmedia bid adapter converted to module --- adapters.json | 1 - .../underdogmediaBidAdapter.js | 15 +++++++++------ .../underdogmediaBidAdapter_spec.js} | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) rename src/adapters/underdogmedia.js => modules/underdogmediaBidAdapter.js (89%) rename test/spec/{adapters/underdogmedia_spec.js => modules/underdogmediaBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 98edc0ba6ab..442fad136af 100644 --- a/adapters.json +++ b/adapters.json @@ -3,7 +3,6 @@ "smartadserver", "yieldbot", "wideorbit", - "underdogmedia", "xhb", "vertoz", "widespace", diff --git a/src/adapters/underdogmedia.js b/modules/underdogmediaBidAdapter.js similarity index 89% rename from src/adapters/underdogmedia.js rename to modules/underdogmediaBidAdapter.js index b027fd46902..ac708d97278 100644 --- a/src/adapters/underdogmedia.js +++ b/modules/underdogmediaBidAdapter.js @@ -1,9 +1,10 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); -var utils = require('../utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var utils = require('src/utils.js'); +var adaptermanager = require('src/adaptermanager'); -var UnderdogMediaAdapter = function UnderdogMediaAdapter() { +function UnderdogMediaAdapter() { const UDM_ADAPTER_VERSION = '1.0.0'; var getJsStaticUrl = window.location.protocol + '//udmserve.net/udm/img.fetch?tid=1;dt=9;callback=$$PREBID_GLOBAL$$.handleUnderdogMediaCB;'; var bidParams = {}; @@ -104,6 +105,8 @@ var UnderdogMediaAdapter = function UnderdogMediaAdapter() { return { callBids: _callBids }; -}; +} + +adaptermanager.registerBidAdapter(new UnderdogMediaAdapter, 'underdogmedia'); module.exports = UnderdogMediaAdapter; diff --git a/test/spec/adapters/underdogmedia_spec.js b/test/spec/modules/underdogmediaBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/underdogmedia_spec.js rename to test/spec/modules/underdogmediaBidAdapter_spec.js index 25842034bee..c93246eab4c 100644 --- a/test/spec/adapters/underdogmedia_spec.js +++ b/test/spec/modules/underdogmediaBidAdapter_spec.js @@ -1,4 +1,4 @@ -import Adapter from '../../../src/adapters/underdogmedia'; +import Adapter from '../../../modules/underdogmediaBidAdapter'; import bidManager from '../../../src/bidmanager'; import adloader from '../../../src/adloader'; From a479984e69d7f3cbbe8bb21c3bbbb0e8813746e3 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:45:55 -0600 Subject: [PATCH 086/111] vertamedia bid adapter converted to module --- adapters.json | 8 +------- .../vertamedia.js => modules/vertamediaBidAdapter.js | 7 ++++++- .../vertamediaBidAdapter_spec.js} | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) rename src/adapters/vertamedia.js => modules/vertamediaBidAdapter.js (93%) rename test/spec/{adapters/vertamedia_spec.js => modules/vertamediaBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 442fad136af..f4a619ff0a1 100644 --- a/adapters.json +++ b/adapters.json @@ -1,14 +1,8 @@ [ - "vertamedia", "smartadserver", "yieldbot", "wideorbit", "xhb", "vertoz", - "widespace", - { - "vertamedia": { - "supportedMediaTypes": ["video"] - } - } + "widespace" ] diff --git a/src/adapters/vertamedia.js b/modules/vertamediaBidAdapter.js similarity index 93% rename from src/adapters/vertamedia.js rename to modules/vertamediaBidAdapter.js index ecce8c1d84f..9afdd2a7fa2 100644 --- a/src/adapters/vertamedia.js +++ b/modules/vertamediaBidAdapter.js @@ -1,9 +1,10 @@ -import Adapter from 'src/adapters/adapter'; +import Adapter from 'src/adapter'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; import * as utils from 'src/utils'; import { ajax } from 'src/ajax'; import { STATUS } from 'src/constants'; +import adaptermanager from 'src/adaptermanager'; const ENDPOINT = '//rtb.vertamedia.com/hb/'; @@ -116,4 +117,8 @@ VertamediaAdapter.createNew = function () { return new VertamediaAdapter(); }; +adaptermanager.registerBidAdapter(new VertamediaAdapter, 'vertamedia', { + supportedMediaTypes: ['video'] +}); + module.exports = VertamediaAdapter; diff --git a/test/spec/adapters/vertamedia_spec.js b/test/spec/modules/vertamediaBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/vertamedia_spec.js rename to test/spec/modules/vertamediaBidAdapter_spec.js index c96103ce61f..ebcd439a124 100644 --- a/test/spec/adapters/vertamedia_spec.js +++ b/test/spec/modules/vertamediaBidAdapter_spec.js @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import Adapter from 'src/adapters/vertamedia'; +import Adapter from 'modules/vertamediaBidAdapter'; import bidmanager from 'src/bidmanager'; const ENDPOINT = 'http://rtb.vertamedia.com/hb/?aid=22489&w=640&h=480&domain=localhost'; From a7c358675442e572a9422eadb701915ed39e7daf Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:48:24 -0600 Subject: [PATCH 087/111] vertoz bid adapter converted to module --- adapters.json | 1 - .../vertoz.js => modules/vertozBidAdapter.js | 17 ++++++++++------- .../vertozBidAdapter_spec.js} | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) rename src/adapters/vertoz.js => modules/vertozBidAdapter.js (84%) rename test/spec/{adapters/vertoz_spec.js => modules/vertozBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index f4a619ff0a1..2ed012ad125 100644 --- a/adapters.json +++ b/adapters.json @@ -3,6 +3,5 @@ "yieldbot", "wideorbit", "xhb", - "vertoz", "widespace" ] diff --git a/src/adapters/vertoz.js b/modules/vertozBidAdapter.js similarity index 84% rename from src/adapters/vertoz.js rename to modules/vertozBidAdapter.js index 9f9767998d8..77731cbc2fa 100755 --- a/src/adapters/vertoz.js +++ b/modules/vertozBidAdapter.js @@ -1,10 +1,11 @@ -var CONSTANTS = require('../constants.json'); -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adloader = require('../adloader.js'); +var CONSTANTS = require('src/constants.json'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adloader = require('src/adloader.js'); +var adaptermanager = require('src/adaptermanager'); -var VertozAdapter = function VertozAdapter() { +function VertozAdapter() { const BASE_URI = '//banner.vrtzads.com/vzhbidder/bid?'; const BIDDER_NAME = 'vertoz'; const QUERY_PARAM_KEY = 'q'; @@ -60,6 +61,8 @@ var VertozAdapter = function VertozAdapter() { bidmanager.addBidResponse(adSpaceId, bidObject); }; return { callBids: _callBids }; -}; +} + +adaptermanager.registerBidAdapter(new VertozAdapter, 'vertoz'); module.exports = VertozAdapter; diff --git a/test/spec/adapters/vertoz_spec.js b/test/spec/modules/vertozBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/vertoz_spec.js rename to test/spec/modules/vertozBidAdapter_spec.js index f896adf4c2e..e882c901c75 100755 --- a/test/spec/adapters/vertoz_spec.js +++ b/test/spec/modules/vertozBidAdapter_spec.js @@ -1,6 +1,6 @@ import {expect} from 'chai'; import {assert} from 'chai'; -import Adapter from '../../../src/adapters/vertoz'; +import Adapter from '../../../modules/vertozBidAdapter'; import bidManager from '../../../src/bidmanager'; import adLoader from '../../../src/adloader'; From 3a79b15ab5c293535d61e44c859fbd8ad2e86e2e Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:51:03 -0600 Subject: [PATCH 088/111] wideorbit bid adapter converted to module --- adapters.json | 1 - .../wideorbitBidAdapter.js | 15 +++++++++------ .../wideorbitBidAdapter_spec.js} | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) rename src/adapters/wideorbit.js => modules/wideorbitBidAdapter.js (95%) rename test/spec/{adapters/wideorbit_spec.js => modules/wideorbitBidAdapter_spec.js} (99%) diff --git a/adapters.json b/adapters.json index 2ed012ad125..8a8594922f8 100644 --- a/adapters.json +++ b/adapters.json @@ -1,7 +1,6 @@ [ "smartadserver", "yieldbot", - "wideorbit", "xhb", "widespace" ] diff --git a/src/adapters/wideorbit.js b/modules/wideorbitBidAdapter.js similarity index 95% rename from src/adapters/wideorbit.js rename to modules/wideorbitBidAdapter.js index 857def5c790..67f4b147622 100644 --- a/src/adapters/wideorbit.js +++ b/modules/wideorbitBidAdapter.js @@ -1,9 +1,10 @@ -var bidfactory = require('../bidfactory.js'), - bidmanager = require('../bidmanager.js'), - utils = require('../utils.js'), - adloader = require('../adloader'); +var bidfactory = require('src/bidfactory.js'), + bidmanager = require('src/bidmanager.js'), + utils = require('src/utils.js'), + adloader = require('src/adloader'), + adaptermanager = require('src/adaptermanager'); -var WideOrbitAdapter = function WideOrbitAdapter() { +function WideOrbitAdapter() { var pageImpression = 'JSAdservingMP.ashx?pc={pc}&pbId={pbId}&clk=&exm=&jsv=1.0&tsv=1.0&cts={cts}&arp=0&fl=0&vitp=&vit=&jscb=window.$$PREBID_GLOBAL$$.handleWideOrbitCallback&url={referrer}&fp=&oid=&exr=&mraid=&apid=&apbndl=&mpp=0&uid=&cb={cb}&hb=1', pageRepeatCommonParam = '&gid{o}={gid}&pp{o}=&clk{o}=&rpos{o}={rpos}&ecpm{o}={ecpm}&ntv{o}=&ntl{o}=&adsid{o}=', pageRepeatParamId = '&pId{o}={pId}&rank{o}={rank}', @@ -213,6 +214,8 @@ var WideOrbitAdapter = function WideOrbitAdapter() { return { callBids: _callBids }; -}; +} + +adaptermanager.registerBidAdapter(new WideOrbitAdapter, 'wideorbit'); module.exports = WideOrbitAdapter; diff --git a/test/spec/adapters/wideorbit_spec.js b/test/spec/modules/wideorbitBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/wideorbit_spec.js rename to test/spec/modules/wideorbitBidAdapter_spec.js index c2b8d416e1e..b524632597b 100644 --- a/test/spec/adapters/wideorbit_spec.js +++ b/test/spec/modules/wideorbitBidAdapter_spec.js @@ -5,7 +5,7 @@ describe('wideorbit adapter tests', function () { // FYI: querystringify will perform encoding/decoding var querystringify = require('querystringify'); - var adapter = require('src/adapters/wideorbit'); + var adapter = require('modules/wideorbitBidAdapter'); var adLoader = require('src/adloader'); var bidmanager = require('src/bidmanager'); From 4f9f3c4b801df5647631ee94065ef43032417042 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:53:38 -0600 Subject: [PATCH 089/111] widespace bid adapter converted to module --- adapters.json | 3 +-- .../widespaceBidAdapter.js | 15 ++++++++------- .../widespaceBidAdapter_spec.js} | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) rename src/adapters/widespace.js => modules/widespaceBidAdapter.js (89%) rename test/spec/{adapters/widespace_spec.js => modules/widespaceBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 8a8594922f8..11d9cb4d3d5 100644 --- a/adapters.json +++ b/adapters.json @@ -1,6 +1,5 @@ [ "smartadserver", "yieldbot", - "xhb", - "widespace" + "xhb" ] diff --git a/src/adapters/widespace.js b/modules/widespaceBidAdapter.js similarity index 89% rename from src/adapters/widespace.js rename to modules/widespaceBidAdapter.js index cd8669f99be..a5a3925cab5 100644 --- a/src/adapters/widespace.js +++ b/modules/widespaceBidAdapter.js @@ -1,10 +1,9 @@ -import { getBidRequest } from '../utils.js'; - -const utils = require('../utils.js'); -const adloader = require('../adloader.js'); -const bidmanager = require('../bidmanager.js'); -const bidfactory = require('../bidfactory.js'); +const utils = require('src/utils.js'); +const adloader = require('src/adloader.js'); +const bidmanager = require('src/bidmanager.js'); +const bidfactory = require('src/bidfactory.js'); +const adaptermanager = require('src/adaptermanager'); const WS_ADAPTER_VERSION = '1.0.2'; function WidespaceAdapter() { @@ -72,7 +71,7 @@ function WidespaceAdapter() { bid.sizes = {height: bid.height, width: bid.width}; - var inBid = getBidRequest(bid.callbackUid); + var inBid = utils.getBidRequest(bid.callbackUid); if (inBid) { bidCode = inBid.bidder; @@ -113,4 +112,6 @@ function WidespaceAdapter() { }; } +adaptermanager.registerBidAdapter(new WidespaceAdapter, 'widespace'); + module.exports = WidespaceAdapter; diff --git a/test/spec/adapters/widespace_spec.js b/test/spec/modules/widespaceBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/widespace_spec.js rename to test/spec/modules/widespaceBidAdapter_spec.js index 261ec23497e..651d22b4606 100644 --- a/test/spec/adapters/widespace_spec.js +++ b/test/spec/modules/widespaceBidAdapter_spec.js @@ -1,7 +1,7 @@ import { expect } from 'chai'; import adLoader from '../../../src/adloader'; import bidManager from '../../../src/bidmanager'; -import Adapter from '../../../src/adapters/widespace'; +import Adapter from '../../../modules/widespaceBidAdapter'; const ENDPOINT = '//engine.widespace.com/map/engine/hb/dynamic'; From 9710e0b3255770a8fdb6f8bcf4b54df8dee7ad43 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 12 Jun 2017 16:56:05 -0600 Subject: [PATCH 090/111] xhb bid adapter converted to module --- adapters.json | 3 +-- .../xhb.js => modules/xhbBidAdapter.js | 23 ++++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) rename src/adapters/xhb.js => modules/xhbBidAdapter.js (92%) diff --git a/adapters.json b/adapters.json index 11d9cb4d3d5..a345b3075a4 100644 --- a/adapters.json +++ b/adapters.json @@ -1,5 +1,4 @@ [ "smartadserver", - "yieldbot", - "xhb" + "yieldbot" ] diff --git a/src/adapters/xhb.js b/modules/xhbBidAdapter.js similarity index 92% rename from src/adapters/xhb.js rename to modules/xhbBidAdapter.js index 811f7b971e2..79c53b7d53c 100644 --- a/src/adapters/xhb.js +++ b/modules/xhbBidAdapter.js @@ -1,12 +1,11 @@ -import {getBidRequest} from '../utils.js'; - -const CONSTANTS = require('../constants.json'); -const utils = require('../utils.js'); -const adloader = require('../adloader.js'); -const bidmanager = require('../bidmanager.js'); -const bidfactory = require('../bidfactory.js'); - -const XhbAdapter = function XhbAdapter() { +const CONSTANTS = require('src/constants.json'); +const utils = require('src/utils.js'); +const adloader = require('src/adloader.js'); +const bidmanager = require('src/bidmanager.js'); +const bidfactory = require('src/bidfactory.js'); +const adaptermanager = require('src/adaptermanager'); + +function XhbAdapter() { const _defaultBidderSettings = { alwaysUseBid: true, adserverTargeting: [ @@ -109,7 +108,7 @@ const XhbAdapter = function XhbAdapter() { let responseCPM; let id = jptResponseObj.callback_uid; let placementCode = ''; - let bidObj = getBidRequest(id); + let bidObj = utils.getBidRequest(id); if (bidObj) { bidCode = bidObj.bidder; placementCode = bidObj.placementCode; @@ -158,6 +157,8 @@ const XhbAdapter = function XhbAdapter() { return { callBids: _callBids }; -}; +} + +adaptermanager.registerBidAdapter(new XhbAdapter, 'xhb'); module.exports = XhbAdapter; From 800f6ae1c69136b93a0a276acac06d74d5a5b6e1 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 13 Jun 2017 09:42:35 -0600 Subject: [PATCH 091/111] yieldbot converted from bid adapter to module --- adapters.json | 3 +-- .../yieldbot.js => modules/yieldbotBidAdapter.js | 15 +++++++++------ .../yieldbotBidAdapter_spec.js} | 4 ++-- 3 files changed, 12 insertions(+), 10 deletions(-) rename src/adapters/yieldbot.js => modules/yieldbotBidAdapter.js (93%) rename test/spec/{adapters/yieldbot_spec.js => modules/yieldbotBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index a345b3075a4..008f3eb1801 100644 --- a/adapters.json +++ b/adapters.json @@ -1,4 +1,3 @@ [ - "smartadserver", - "yieldbot" + "smartadserver" ] diff --git a/src/adapters/yieldbot.js b/modules/yieldbotBidAdapter.js similarity index 93% rename from src/adapters/yieldbot.js rename to modules/yieldbotBidAdapter.js index 1dc77a30f73..1d52d6b181a 100644 --- a/src/adapters/yieldbot.js +++ b/modules/yieldbotBidAdapter.js @@ -2,10 +2,11 @@ * @overview Yieldbot sponsored Prebid.js adapter. * @author elljoh */ -var adloader = require('../adloader'); -var bidfactory = require('../bidfactory'); -var bidmanager = require('../bidmanager'); -var utils = require('../utils'); +var adloader = require('src/adloader'); +var bidfactory = require('src/bidfactory'); +var bidmanager = require('src/bidmanager'); +var utils = require('src/utils'); +var adaptermanager = require('src/adaptermanager'); /** * Adapter for requesting bids from Yieldbot. @@ -13,7 +14,7 @@ var utils = require('../utils'); * @returns {Object} Object containing implementation for invocation in {@link module:adaptermanger.callBids} * @class */ -var YieldbotAdapter = function YieldbotAdapter() { +function YieldbotAdapter() { window.ybotq = window.ybotq || []; var ybotlib = { @@ -136,6 +137,8 @@ var YieldbotAdapter = function YieldbotAdapter() { return { callBids: ybotlib.callBids }; -}; +} + +adaptermanager.registerBidAdapter(new YieldbotAdapter, 'yieldbot'); module.exports = YieldbotAdapter; diff --git a/test/spec/adapters/yieldbot_spec.js b/test/spec/modules/yieldbotBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/yieldbot_spec.js rename to test/spec/modules/yieldbotBidAdapter_spec.js index d7c15fd026a..400aa409a4a 100644 --- a/test/spec/adapters/yieldbot_spec.js +++ b/test/spec/modules/yieldbotBidAdapter_spec.js @@ -1,5 +1,5 @@ import {expect} from 'chai'; -import YieldbotAdapter from 'src/adapters/yieldbot'; +import YieldbotAdapter from 'modules/yieldbotBidAdapter'; import bidManager from 'src/bidmanager'; import adLoader from 'src/adloader'; @@ -71,7 +71,7 @@ let sandbox; let bidManagerStub; let yieldbotLibStub; -before(function() { +beforeEach(function() { window.$$PREBID_GLOBAL$$._bidsRequested.push(bidderRequest); }); From 8a41018449bf4e031389d0eab09fdbe54c09e24d Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 13 Jun 2017 11:40:12 -0600 Subject: [PATCH 092/111] smartadserver bid adapter converted to module --- adapters.json | 4 +--- .../smartadserverBidAdapter.js | 11 +++++++---- .../smartadserverBidAdapter_spec.js} | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) rename src/adapters/smartadserver.js => modules/smartadserverBidAdapter.js (87%) rename test/spec/{adapters/smartadserver_spec.js => modules/smartadserverBidAdapter_spec.js} (98%) diff --git a/adapters.json b/adapters.json index 008f3eb1801..fe51488c706 100644 --- a/adapters.json +++ b/adapters.json @@ -1,3 +1 @@ -[ - "smartadserver" -] +[] diff --git a/src/adapters/smartadserver.js b/modules/smartadserverBidAdapter.js similarity index 87% rename from src/adapters/smartadserver.js rename to modules/smartadserverBidAdapter.js index 21676beebc1..9d39cfc5c8d 100644 --- a/src/adapters/smartadserver.js +++ b/modules/smartadserverBidAdapter.js @@ -1,8 +1,9 @@ -var utils = require('../utils.js'); -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); +var utils = require('src/utils.js'); +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); var adloader = require('src/adloader.js'); -var url = require('url'); +var url = require('src/url.js'); +var adaptermanager = require('src/adaptermanager'); var SmartAdServer = function SmartAdServer() { var generateCallback = function(bid) { @@ -54,4 +55,6 @@ var SmartAdServer = function SmartAdServer() { }; }; +adaptermanager.registerBidAdapter(new SmartAdServer, 'smartadserver'); + module.exports = SmartAdServer; diff --git a/test/spec/adapters/smartadserver_spec.js b/test/spec/modules/smartadserverBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/smartadserver_spec.js rename to test/spec/modules/smartadserverBidAdapter_spec.js index 9f0b736d2d5..85d345da368 100644 --- a/test/spec/adapters/smartadserver_spec.js +++ b/test/spec/modules/smartadserverBidAdapter_spec.js @@ -1,7 +1,7 @@ describe('smartadserver adapter tests', function () { var urlParse = require('url-parse'); var querystringify = require('querystringify'); - var adapter = require('src/adapters/smartadserver'); + var adapter = require('modules/smartadserverBidAdapter'); var adLoader = require('src/adloader'); var expect = require('chai').expect; var bidmanager = require('src/bidmanager'); From b8190304bbfe8e805f7719822cc3e092e70387ac Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 13 Jun 2017 12:38:00 -0600 Subject: [PATCH 093/111] remove old adapter class in adapter folder --- src/adapters/adapter.js | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 src/adapters/adapter.js diff --git a/src/adapters/adapter.js b/src/adapters/adapter.js deleted file mode 100644 index 5e5ea47cb18..00000000000 --- a/src/adapters/adapter.js +++ /dev/null @@ -1,24 +0,0 @@ -function Adapter(code) { - var bidderCode = code; - - function setBidderCode(code) { - bidderCode = code; - } - - function getBidderCode() { - return bidderCode; - } - - function callBids() { - } - - return { - callBids: callBids, - setBidderCode: setBidderCode, - getBidderCode: getBidderCode - }; -} - -exports.createNew = function (bidderCode) { - return new Adapter(bidderCode); -}; From 32dd129fbd3304eec3b786bb4084c2e28d29bf09 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 13 Jun 2017 14:01:31 -0600 Subject: [PATCH 094/111] converted analytics adapters to modules --- modules/appnexusAnalyticsAdapter.js | 19 +++++++++++++++++++ .../googleAnalyticsAdapter.js | 12 +++++++++--- .../pubwiseAnalyticsAdapter.js | 11 +++++++++-- modules/pulsepointAnalyticsAdapter.js | 19 +++++++++++++++++++ .../roxotAnalyticsAdapter.js | 10 ++++++++-- .../sharethroughAnalyticsAdapter.js | 14 +++++++++++--- .../analytics => }/AnalyticsAdapter.js | 2 +- src/adapters/analytics/appnexus.js | 11 ----------- src/adapters/analytics/example.js | 2 +- src/adapters/analytics/example2.js | 2 +- src/adapters/analytics/pulsepoint.js | 11 ----------- .../analytics => }/AnalyticsAdapter_spec.js | 7 +++---- .../appnexusAnalyticsAdapter_spec.js} | 2 +- .../googleAnalyticsAdapter_spec.js} | 2 +- .../pubwiseAnalyticsAdapter_spec.js} | 8 ++++---- .../roxotAnalyticsAdapter_spec.js} | 8 ++++---- .../sharethroughAnalyticsAdapter_spec.js} | 2 +- 17 files changed, 92 insertions(+), 50 deletions(-) create mode 100644 modules/appnexusAnalyticsAdapter.js rename src/adapters/analytics/ga.js => modules/googleAnalyticsAdapter.js (96%) rename src/adapters/analytics/pubwiseanalytics.js => modules/pubwiseAnalyticsAdapter.js (85%) create mode 100644 modules/pulsepointAnalyticsAdapter.js rename src/adapters/analytics/roxot.js => modules/roxotAnalyticsAdapter.js (91%) rename src/adapters/analytics/sharethrough_analytics.js => modules/sharethroughAnalyticsAdapter.js (86%) rename src/{adapters/analytics => }/AnalyticsAdapter.js (99%) delete mode 100644 src/adapters/analytics/appnexus.js delete mode 100644 src/adapters/analytics/pulsepoint.js rename test/spec/{unit/adapters/analytics => }/AnalyticsAdapter_spec.js (95%) rename test/spec/{unit/adapters/analytics/appnexus_spec.js => modules/appnexusAnalyticsAdapter_spec.js} (93%) rename test/spec/{ga_spec.js => modules/googleAnalyticsAdapter_spec.js} (87%) rename test/spec/{adapters/analytics/pubwiseanalytics_spec.js => modules/pubwiseAnalyticsAdapter_spec.js} (79%) rename test/spec/{adapters/analytics/roxot_analytic_spec.js => modules/roxotAnalyticsAdapter_spec.js} (77%) rename test/spec/{unit/adapters/analytics/sharethrough_analytics_spec.js => modules/sharethroughAnalyticsAdapter_spec.js} (97%) diff --git a/modules/appnexusAnalyticsAdapter.js b/modules/appnexusAnalyticsAdapter.js new file mode 100644 index 00000000000..f9756de23e3 --- /dev/null +++ b/modules/appnexusAnalyticsAdapter.js @@ -0,0 +1,19 @@ +/** + * appnexus.js - AppNexus Prebid Analytics Adapter + */ + +import adapter from 'src/AnalyticsAdapter'; +import adaptermanager from 'src/adaptermanager'; + +var appnexusAdapter = adapter({ + global: 'AppNexusPrebidAnalytics', + handler: 'on', + analyticsType: 'bundle' +}); + +adaptermanager.registerAnalyticsAdapter({ + adapter: appnexusAdapter, + code: 'appnexus' +}); + +export default appnexusAdapter; diff --git a/src/adapters/analytics/ga.js b/modules/googleAnalyticsAdapter.js similarity index 96% rename from src/adapters/analytics/ga.js rename to modules/googleAnalyticsAdapter.js index 13b852427fa..816fa9e5952 100644 --- a/src/adapters/analytics/ga.js +++ b/modules/googleAnalyticsAdapter.js @@ -2,9 +2,10 @@ * ga.js - analytics adapter for google analytics */ -var events = require('./../../events'); -var utils = require('./../../utils'); -var CONSTANTS = require('./../../constants.json'); +var events = require('src/events'); +var utils = require('src/utils'); +var CONSTANTS = require('src/constants.json'); +var adaptermanager = require('src/adaptermanager'); var BID_REQUESTED = CONSTANTS.EVENTS.BID_REQUESTED; var BID_TIMEOUT = CONSTANTS.EVENTS.BID_TIMEOUT; @@ -21,6 +22,11 @@ var _enableDistribution = false; var _trackerSend = null; var _sampled = true; +adaptermanager.registerAnalyticsAdapter({ + adapter: exports, + code: 'ga' +}); + /** * This will enable sending data to google analytics. Only call once, or duplicate data will be sent! * @param {object} provider use to set GA global (if renamed); diff --git a/src/adapters/analytics/pubwiseanalytics.js b/modules/pubwiseAnalyticsAdapter.js similarity index 85% rename from src/adapters/analytics/pubwiseanalytics.js rename to modules/pubwiseAnalyticsAdapter.js index 5a2cb348f3b..f3779ab28ef 100644 --- a/src/adapters/analytics/pubwiseanalytics.js +++ b/modules/pubwiseAnalyticsAdapter.js @@ -1,6 +1,7 @@ import {ajax} from 'src/ajax'; -import adapter from 'AnalyticsAdapter'; -const utils = require('../../utils'); +import adapter from 'src/AnalyticsAdapter'; +import adaptermanager from 'src/adaptermanager'; +const utils = require('src/utils'); /**** * PubWise.io Analytics @@ -42,5 +43,11 @@ let pubwiseAnalytics = Object.assign(adapter( ); } }); + +adaptermanager.registerAnalyticsAdapter({ + adapter: pubwiseAnalytics, + code: 'pubwise' +}); + export default pubwiseAnalytics; diff --git a/modules/pulsepointAnalyticsAdapter.js b/modules/pulsepointAnalyticsAdapter.js new file mode 100644 index 00000000000..3a321fb0692 --- /dev/null +++ b/modules/pulsepointAnalyticsAdapter.js @@ -0,0 +1,19 @@ +/** + * pulsepoint.js - Analytics Adapter for PulsePoint + */ + +import adapter from 'src/AnalyticsAdapter'; +import adaptermanager from 'src/adaptermanager'; + +var pulsepointAdapter = adapter({ + global: 'PulsePointPrebidAnalytics', + handler: 'on', + analyticsType: 'bundle' +}); + +adaptermanager.registerAnalyticsAdapter({ + adapter: pulsepointAdapter, + code: 'pulsepoint' +}); + +export default pulsepointAdapter; diff --git a/src/adapters/analytics/roxot.js b/modules/roxotAnalyticsAdapter.js similarity index 91% rename from src/adapters/analytics/roxot.js rename to modules/roxotAnalyticsAdapter.js index e74aee712cd..905da96df6a 100644 --- a/src/adapters/analytics/roxot.js +++ b/modules/roxotAnalyticsAdapter.js @@ -1,8 +1,9 @@ import {ajax} from 'src/ajax'; -import adapter from 'AnalyticsAdapter'; +import adapter from 'src/AnalyticsAdapter'; import CONSTANTS from 'src/constants.json'; +import adaptermanager from 'src/adaptermanager'; -const utils = require('../../utils'); +const utils = require('src/utils'); const url = '//pa.rxthdr.com/analytic'; const analyticsType = 'endpoint'; @@ -95,4 +96,9 @@ roxotAdapter.enableAnalytics = function (config) { roxotAdapter.originEnableAnalytics(config); }; +adaptermanager.registerAnalyticsAdapter({ + adapter: roxotAdapter, + code: 'roxot' +}); + export default roxotAdapter; diff --git a/src/adapters/analytics/sharethrough_analytics.js b/modules/sharethroughAnalyticsAdapter.js similarity index 86% rename from src/adapters/analytics/sharethrough_analytics.js rename to modules/sharethroughAnalyticsAdapter.js index a7c17cc525f..57724864b16 100644 --- a/src/adapters/analytics/sharethrough_analytics.js +++ b/modules/sharethroughAnalyticsAdapter.js @@ -1,12 +1,13 @@ -import adapter from 'AnalyticsAdapter'; -const utils = require('../../utils'); +import adapter from 'src/AnalyticsAdapter'; +import adaptermanager from 'src/adaptermanager'; +const utils = require('src/utils'); const emptyUrl = ''; const analyticsType = 'endpoint'; const STR_BIDDER_CODE = 'sharethrough'; const STR_VERSION = '0.1.0'; -export default Object.assign(adapter( +var sharethroughAdapter = Object.assign(adapter( { emptyUrl, analyticsType @@ -61,3 +62,10 @@ export default Object.assign(adapter( img.src = theUrl; } }); + +adaptermanager.registerAnalyticsAdapter({ + adapter: sharethroughAdapter, + code: 'sharethrough' +}); + +export default sharethroughAdapter; diff --git a/src/adapters/analytics/AnalyticsAdapter.js b/src/AnalyticsAdapter.js similarity index 99% rename from src/adapters/analytics/AnalyticsAdapter.js rename to src/AnalyticsAdapter.js index 34357ecb1d1..58c5048f929 100644 --- a/src/adapters/analytics/AnalyticsAdapter.js +++ b/src/AnalyticsAdapter.js @@ -3,7 +3,7 @@ import { loadScript } from 'src/adloader'; import { ajax } from 'src/ajax'; const events = require('src/events'); -const utils = require('../../utils'); +const utils = require('src/utils'); const AUCTION_INIT = CONSTANTS.EVENTS.AUCTION_INIT; const AUCTION_END = CONSTANTS.EVENTS.AUCTION_END; diff --git a/src/adapters/analytics/appnexus.js b/src/adapters/analytics/appnexus.js deleted file mode 100644 index 2c862ba16c1..00000000000 --- a/src/adapters/analytics/appnexus.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * appnexus.js - AppNexus Prebid Analytics Adapter - */ - -import adapter from 'AnalyticsAdapter'; - -export default adapter({ - global: 'AppNexusPrebidAnalytics', - handler: 'on', - analyticsType: 'bundle' -}); diff --git a/src/adapters/analytics/example.js b/src/adapters/analytics/example.js index f79a350630a..37ef0ff8fe3 100644 --- a/src/adapters/analytics/example.js +++ b/src/adapters/analytics/example.js @@ -2,7 +2,7 @@ * example.js - analytics adapter for Example Analytics Library example */ -import adapter from 'AnalyticsAdapter'; +import adapter from '../../AnalyticsAdapter'; export default adapter( { diff --git a/src/adapters/analytics/example2.js b/src/adapters/analytics/example2.js index b55a02d4cb6..8a9b8beb3ec 100644 --- a/src/adapters/analytics/example2.js +++ b/src/adapters/analytics/example2.js @@ -4,7 +4,7 @@ import { ajax } from 'src/ajax'; * example2.js - analytics adapter for Example2 Analytics Endpoint example */ -import adapter from 'AnalyticsAdapter'; +import adapter from '../../AnalyticsAdapter'; const url = 'https://httpbin.org/post'; const analyticsType = 'endpoint'; diff --git a/src/adapters/analytics/pulsepoint.js b/src/adapters/analytics/pulsepoint.js deleted file mode 100644 index f334c0f042f..00000000000 --- a/src/adapters/analytics/pulsepoint.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * pulsepoint.js - Analytics Adapter for PulsePoint - */ - -import adapter from 'AnalyticsAdapter'; - -export default adapter({ - global: 'PulsePointPrebidAnalytics', - handler: 'on', - analyticsType: 'bundle' -}); diff --git a/test/spec/unit/adapters/analytics/AnalyticsAdapter_spec.js b/test/spec/AnalyticsAdapter_spec.js similarity index 95% rename from test/spec/unit/adapters/analytics/AnalyticsAdapter_spec.js rename to test/spec/AnalyticsAdapter_spec.js index 2301ce177c2..822ce76b081 100644 --- a/test/spec/unit/adapters/analytics/AnalyticsAdapter_spec.js +++ b/test/spec/AnalyticsAdapter_spec.js @@ -1,13 +1,12 @@ import { assert } from 'chai'; -import adaptermanager from '../../../../../src/adaptermanager'; -import events from '../../../../../src/events'; -import CONSTANTS from '../../../../../src/constants.json'; +import events from 'src/events'; +import CONSTANTS from 'src/constants.json'; const BID_REQUESTED = CONSTANTS.EVENTS.BID_REQUESTED; const BID_RESPONSE = CONSTANTS.EVENTS.BID_RESPONSE; const BID_WON = CONSTANTS.EVENTS.BID_WON; const BID_TIMEOUT = CONSTANTS.EVENTS.BID_TIMEOUT; -const AnalyticsAdapter = require('../../../../../src/adapters/analytics/AnalyticsAdapter').default; +const AnalyticsAdapter = require('src/AnalyticsAdapter').default; const config = { url: 'http://localhost:9999/src/adapters/analytics/libraries/example.js', analyticsType: 'library', diff --git a/test/spec/unit/adapters/analytics/appnexus_spec.js b/test/spec/modules/appnexusAnalyticsAdapter_spec.js similarity index 93% rename from test/spec/unit/adapters/analytics/appnexus_spec.js rename to test/spec/modules/appnexusAnalyticsAdapter_spec.js index 4d241c2897c..7f68359de07 100644 --- a/test/spec/unit/adapters/analytics/appnexus_spec.js +++ b/test/spec/modules/appnexusAnalyticsAdapter_spec.js @@ -1,4 +1,4 @@ -import appnexusAnalytics from 'src/adapters/analytics/appnexus'; +import appnexusAnalytics from 'modules/appnexusAnalyticsAdapter'; import { assert } from 'chai'; import { getBidRequestedPayload } from 'test/fixtures/fixtures'; diff --git a/test/spec/ga_spec.js b/test/spec/modules/googleAnalyticsAdapter_spec.js similarity index 87% rename from test/spec/ga_spec.js rename to test/spec/modules/googleAnalyticsAdapter_spec.js index ffbaf3a94a1..4260a831cad 100644 --- a/test/spec/ga_spec.js +++ b/test/spec/modules/googleAnalyticsAdapter_spec.js @@ -1,5 +1,5 @@ var assert = require('assert'); -var ga = require('../../src/adapters/analytics/ga'); +var ga = require('modules/googleAnalyticsAdapter'); describe('Ga', function () { describe('enableAnalytics', function () { diff --git a/test/spec/adapters/analytics/pubwiseanalytics_spec.js b/test/spec/modules/pubwiseAnalyticsAdapter_spec.js similarity index 79% rename from test/spec/adapters/analytics/pubwiseanalytics_spec.js rename to test/spec/modules/pubwiseAnalyticsAdapter_spec.js index 62c6e463ca9..4c3919172d8 100644 --- a/test/spec/adapters/analytics/pubwiseanalytics_spec.js +++ b/test/spec/modules/pubwiseAnalyticsAdapter_spec.js @@ -1,7 +1,7 @@ -import pubwiseAnalytics from 'src/adapters/analytics/pubwiseanalytics'; -let events = require('../../../../src/events'); -let adaptermanager = require('../../../../src/adaptermanager'); -let constants = require('../../../../src/constants.json'); +import pubwiseAnalytics from 'modules/pubwiseAnalyticsAdapter'; +let events = require('src/events'); +let adaptermanager = require('src/adaptermanager'); +let constants = require('src/constants.json'); describe('PubWise Prebid Analytics', function () { describe('enableAnalytics', function () { diff --git a/test/spec/adapters/analytics/roxot_analytic_spec.js b/test/spec/modules/roxotAnalyticsAdapter_spec.js similarity index 77% rename from test/spec/adapters/analytics/roxot_analytic_spec.js rename to test/spec/modules/roxotAnalyticsAdapter_spec.js index 78da9489ca8..fbd298c7e3b 100644 --- a/test/spec/adapters/analytics/roxot_analytic_spec.js +++ b/test/spec/modules/roxotAnalyticsAdapter_spec.js @@ -1,7 +1,7 @@ -import roxotAnalytic from 'src/adapters/analytics/roxot'; -let events = require('../../../../src/events'); -let adaptermanager = require('../../../../src/adaptermanager'); -let constants = require('../../../../src/constants.json'); +import roxotAnalytic from 'modules/roxotAnalyticsAdapter'; +let events = require('src/events'); +let adaptermanager = require('src/adaptermanager'); +let constants = require('src/constants.json'); describe('Roxot Prebid Analytic', function () { describe('enableAnalytics', function () { diff --git a/test/spec/unit/adapters/analytics/sharethrough_analytics_spec.js b/test/spec/modules/sharethroughAnalyticsAdapter_spec.js similarity index 97% rename from test/spec/unit/adapters/analytics/sharethrough_analytics_spec.js rename to test/spec/modules/sharethroughAnalyticsAdapter_spec.js index 0a1ad57ce43..8968e0461fb 100644 --- a/test/spec/unit/adapters/analytics/sharethrough_analytics_spec.js +++ b/test/spec/modules/sharethroughAnalyticsAdapter_spec.js @@ -1,4 +1,4 @@ -import sharethroughAnalytics from 'src/adapters/analytics/sharethrough_analytics'; +import sharethroughAnalytics from 'modules/sharethroughAnalyticsAdapter'; import { expect } from 'chai'; describe('sharethrough analytics adapter', () => { From 90a40bd685283e9968559268f7be76e480bf2b7d Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 13 Jun 2017 14:53:59 -0600 Subject: [PATCH 095/111] removed loaders from build --- loaders/adapterLoader.js | 160 ------------------------------------- loaders/analyticsLoader.js | 41 ---------- loaders/getAdapters.js | 33 -------- src/adaptermanager.js | 10 +-- webpack.conf.js | 10 --- 5 files changed, 1 insertion(+), 253 deletions(-) delete mode 100644 loaders/adapterLoader.js delete mode 100644 loaders/analyticsLoader.js delete mode 100644 loaders/getAdapters.js diff --git a/loaders/adapterLoader.js b/loaders/adapterLoader.js deleted file mode 100644 index 65c189584c2..00000000000 --- a/loaders/adapterLoader.js +++ /dev/null @@ -1,160 +0,0 @@ -/** adapterLoader - * Webpack loader to insert dynamic javascript into `./src/adaptermanager.js` - * This is used in `./webpack.conf.js` - * */ - -'use strict'; -const fs = require('fs'); -const blockLoader = require('block-loader'); -const getAdapters = require('./getAdapters'); - -const adapters = getAdapters('adapters.json', 'adapters'); -const files = fs.readdirSync('src/adapters').map((file) => file.replace(/\.[^/.]+$/, '')); -const adapterNames = adapters.filter(getStandardAdapters).filter(getUniques); -//adapters loaded from `srcPath` -const customAdapters = adapters.map(getCustomAdapters).filter(adapter => { - //filter undefined - return !!adapter; -}); -const aliases = adapters.filter(getAliases); -const videoAdapters = adapters.filter(getVideoAdapters).map(getNames); - -var options = { - start: '/** INSERT ADAPTERS - DO NOT EDIT OR REMOVE */', - end: '/** END INSERT ADAPTERS */', - process: insertAdapters -}; - -/** - * Returns a block of javascript statements to load adapter modules, register the adapters and - * set adapter aliases - * @returns {*} - */ -function insertAdapters() { - - if (!adapters) { - console.log('Prebid Warning: adapters config not found in adapters.json, no adapters will' + - ' be loaded'); - return ''; - } - - let inserts = adapterNames.map(name => { - if (files.includes(name)) { - return name; - } else { - console.log(`Prebid Warning: no adapter found for ${name}, continuing.`); - } - }); - - inserts = inserts.map(name => { - return `var ${adapterName(name)} = require('./adapters/${name}.js'); - exports.registerBidAdapter(new ${adapterName(name)}(), '${name}');\n`; - }) - .concat(customAdapters.map(adapter => { - return `let ${adapter.name} = require('${adapter.srcPath}'); - exports.registerBidAdapter(new ${adapter.name}, '${adapter.name}');\n`; - })) - .concat(aliases.map(adapter => { - const name = getNameStr(adapter); - return `exports.aliasBidAdapter('${name}','${adapter[name].alias}');\n`; - })) - .concat(`exports.videoAdapters = ${JSON.stringify(videoAdapters)};`) - .join(''); - - if (!inserts.length) { - console.log('No matching adapters found for config, no adapters will be loaded.'); - return ''; - } - return inserts; -} - -/** - * Derive the variable name to use for the adapter - * @param adapter - * @returns {string} - */ -function adapterName(adapter) { - if (adapter) { - const result = adapter.split(''); - return result[0].toUpperCase() + result.join('').substr(1) + 'Adapter'; - } - return ''; -} - -/** - * Filter an array to return unique values - * @param value current array element value - * @param index current array element index - * @param self current array - * @returns {boolean} if true the current array element is returned - * - * http://stackoverflow.com/questions/1960473/unique-values-in-an-array - */ -function getUniques(value, index, self) { - return self.indexOf(value) === index; -} - -/** - * Filter to derive the adapter name from array elements as strings or objects - * @param adapter - * @returns {*} - */ -function getNames(adapter) { - // if `length` then `adapter` is a string, otherwise an object - return adapter.length ? adapter : getNameStr(adapter); -} - -/** - * Return adapter objects that have an alias field - * @param adapter - * @returns {*} - */ -function getAliases(adapter) { - const name = getNameStr(adapter); - return adapter && name && adapter[name].alias; -} - -/** - * Returns adapter objects that support video - */ -function getVideoAdapters(adapter) { - const name = getNameStr(adapter); - return adapter && name && adapter[name].supportedMediaTypes && - adapter[name].supportedMediaTypes.includes('video'); -} - -function getNameStr(adapter) { - return Object.keys(adapter)[0]; -} - -function getStandardAdapters(adapter) { - if (typeof adapter === 'string') { - return adapter; - } -} - -function getCustomAdapters(adapter) { - const srcPath = getSrcPath(adapter); - if (srcPath === '') { - return; - } - if (!fileExists(srcPath)) { - console.warn(`Not able to locate adapter at: ${srcPath} continuing`); - return; - } - return { - name: getNames(adapter), - srcPath: srcPath - }; -} - -function getSrcPath(adapter) { - const name = getNameStr(adapter); - return name && adapter[name].srcPath ? adapter[name].srcPath : ''; -} - -function fileExists(path) { - return fs.existsSync(path); -} - -module.exports = blockLoader(options); diff --git a/loaders/analyticsLoader.js b/loaders/analyticsLoader.js deleted file mode 100644 index 7e76a2819d6..00000000000 --- a/loaders/analyticsLoader.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const blockLoader = require('block-loader'); -const getAdapters = require('./getAdapters'); -let analyticsAdapters = getAdapters('analytics.json', 'analyticsAdapters'); - -var options = { - start: '/** INSERT ANALYTICS - DO NOT EDIT OR REMOVE */', - end: '/** END INSERT ANALYTICS */', - process: function insertAnalytics() { - // read directory for analytics adapter file names, map the file names to String.replace, - // use a regex to remove file extensions, then return the array of adapter names - const files = fs.readdirSync('src/adapters/analytics') - .map(file => file.replace(/\.[^/.]+$/, '')); - - let adapters = analyticsAdapters.map(adapter => adapter.length ? adapter : Object.keys(adapter)[0]); - - let inserts = adapters.filter(adapter => { - if (files.includes(adapter)) { - return adapter; - } else { - console.log(`Prebid Warning: no adapter found for ${adapter}, continuing.`); - } - }); - - // if no matching adapters and no adapter files found, exit - if (!inserts || !inserts.length) { - return null; - } - - // return the javascript strings to insert into adaptermanager.js - return inserts.map((adapter) => { - return `var ${adapter} = require('./adapters/analytics/${adapter}.js').default - || require('./adapters/analytics/${adapter}.js'); - exports.registerAnalyticsAdapter({ adapter: ${adapter}, code: '${adapter}' });\n`; - }).join(''); - } -}; - -module.exports = blockLoader(options); diff --git a/loaders/getAdapters.js b/loaders/getAdapters.js deleted file mode 100644 index b69a534fc7f..00000000000 --- a/loaders/getAdapters.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const argv = require('yargs').argv; - -function load(file) { - try { - const buffer = fs.readFileSync(file); - return JSON.parse(buffer.toString()); - } catch (e) { - return []; - } -} - -module.exports = function getAdapters(defaultAdapters, argName) { - let customAdapters = argv[argName]; - - if (!customAdapters) { - return load(defaultAdapters); - } - - customAdapters = path.resolve(process.cwd(), customAdapters); - - try { - fs.statSync(customAdapters); - return load(customAdapters); - } catch (e) { - console.log(`Prebid Warning: custom adapters config cannot be loaded from ${customAdapters}, ` + - `using default ${defaultAdapters}`); - return load(defaultAdapters); - } -}; diff --git a/src/adaptermanager.js b/src/adaptermanager.js index 8ff971b43be..97ed301ee1d 100644 --- a/src/adaptermanager.js +++ b/src/adaptermanager.js @@ -153,7 +153,7 @@ function transformHeightWidth(adUnit) { return sizesObj; } -// exports.videoAdapters = []; // added by adapterLoader for now +exports.videoAdapters = []; // added by adapterLoader for now exports.registerBidAdapter = function (bidAdaptor, bidderCode, {supportedMediaTypes = []} = {}) { if (bidAdaptor && bidderCode) { @@ -234,11 +234,3 @@ exports.setBidderSequence = function (order) { exports.setS2SConfig = function (config) { _s2sConfig = config; }; - -/** INSERT ADAPTERS - DO NOT EDIT OR REMOVE */ - -/** END INSERT ADAPTERS */ - -/** INSERT ANALYTICS - DO NOT EDIT OR REMOVE */ - -/** END INSERT ANALYTICS */ diff --git a/webpack.conf.js b/webpack.conf.js index 7927bbcb085..d7b6eab0c5f 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -43,16 +43,6 @@ module.exports = { test: /\.json$/, loader: 'json' }, - { - test: /adaptermanager.js/, - include: /(src)/, - loader: 'analyticsLoader' - }, - { - test: /adaptermanager.js/, - include: /(src)/, - loader: 'adapterLoader' - }, { test: /constants.json$/, include: /(src)/, From f281a0743384a69a817f968fd102184e59af1e7b Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Tue, 13 Jun 2017 16:50:05 -0600 Subject: [PATCH 096/111] added plugin to remove file manifest and jsonp code from webpack runtime --- plugins/RequireEnsureWithoutJsonp.js | 19 +++++++++++++++++++ webpack.conf.js | 6 +++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 plugins/RequireEnsureWithoutJsonp.js diff --git a/plugins/RequireEnsureWithoutJsonp.js b/plugins/RequireEnsureWithoutJsonp.js new file mode 100644 index 00000000000..ece3bdecf31 --- /dev/null +++ b/plugins/RequireEnsureWithoutJsonp.js @@ -0,0 +1,19 @@ + +class RequireEnsureWithoutJsonP { + apply(compiler) { + compiler.plugin('compilation', function(compilation) { + compilation.mainTemplate.plugin('require-ensure', function(_, chunk, hash) { + return ( +` +if(installedChunks[chunkId] === 0) + return callback.call(null, __webpack_require__); +else + console.error('webpack chunk not found and jsonp disabled'); +` + ).trim(); + }); + }); + } +} + +module.exports = RequireEnsureWithoutJsonP; diff --git a/webpack.conf.js b/webpack.conf.js index d7b6eab0c5f..1238942dc3a 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -3,6 +3,7 @@ var StringReplacePlugin = require('string-replace-webpack-plugin'); var path = require('path'); var webpack = require('webpack'); var helpers = require('./gulpHelpers'); +var RequireEnsureWithoutJsonp = require('./plugins/RequireEnsureWithoutJsonP.js'); module.exports = { devtool: 'source-map', @@ -19,7 +20,7 @@ module.exports = { ] }, output: { - jsonpFunction: 'pbjsSeg' + jsonpFunction: 'pbjsChunk' }, module: { loaders: [ @@ -75,6 +76,9 @@ module.exports = { }, plugins: [ new StringReplacePlugin(), + new RequireEnsureWithoutJsonp(), + + // this plugin must be last so it can be easily removed for karma unit tests new webpack.optimize.CommonsChunkPlugin({ name: 'prebid', filename: 'prebid.js', From 821f27c95487c0e729283e3618132a13ebac7968 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Wed, 14 Jun 2017 09:57:45 -0600 Subject: [PATCH 097/111] cox bid adapter converted to module --- .../cox.js => modules/coxBidAdapter.js | 513 +++++++++--------- .../coxBidAdapter_spec.js} | 241 ++++---- 2 files changed, 378 insertions(+), 376 deletions(-) rename src/adapters/cox.js => modules/coxBidAdapter.js (94%) rename test/spec/{adapters/cox_spec.js => modules/coxBidAdapter_spec.js} (95%) diff --git a/src/adapters/cox.js b/modules/coxBidAdapter.js similarity index 94% rename from src/adapters/cox.js rename to modules/coxBidAdapter.js index e0e2a053251..0d0f5047c06 100644 --- a/src/adapters/cox.js +++ b/modules/coxBidAdapter.js @@ -1,255 +1,258 @@ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -var adLoader = require('../adloader.js'); - -var CoxAdapter = function CoxAdapter() { - var adZoneAttributeKeys = ['id', 'size', 'thirdPartyClickUrl'], - otherKeys = ['siteId', 'wrapper', 'referrerUrl'], - placementMap = {}, - W = window; - - var COX_BIDDER_CODE = 'cox'; - - function _callBids(params) { - var env = ''; - - // Create global cdsTag and CMT object (for the latter, only if needed ) - W.cdsTag = {}; - if (!W.CMT) W.CMT = _getCoxLite(); - - // Populate the tag with the info from prebid - var bids = params.bids || [], - tag = W.cdsTag, - i, - j; - for (i = 0; i < bids.length; i++) { - var bid = bids[i], - cfg = bid.params || {}; - - if (cfg.id) { - tag.zones = tag.zones || {}; - var zone = {}; - - for (j = 0; j < adZoneAttributeKeys.length; j++) { - if (cfg[adZoneAttributeKeys[j]]) zone[adZoneAttributeKeys[j]] = cfg[adZoneAttributeKeys[j]]; - } - for (j = 0; j < otherKeys.length; j++) { - if (cfg[otherKeys[j]]) tag[otherKeys[j]] = cfg[otherKeys[j]]; - } - var adZoneKey = 'as' + cfg.id; - tag.zones[adZoneKey] = zone; - - // Check for an environment setting - if (cfg.env) env = cfg.env; - - // Update the placement map - var xy = (cfg.size || '0x0').split('x'); - placementMap[adZoneKey] = { - p: bid.placementCode, - w: xy[0], - h: xy[1] - }; - } - } - if (tag.zones && Object.keys(tag.zones).length > 0) { - tag.__callback__ = function (r) { - tag.response = r; - _notify(); - }; - adLoader.loadScript(W.CMT.Service.buildSrc(tag, env)); - } - } - - function _notify() { - // Will execute in the context of a bid - // function finalizeAd(price) { - // this.ad = W.CMT.Service.setAuctionPrice(this.ad, price); - // return this; - // } - - for (var adZoneKey in placementMap) { - var bid = W.CMT.Service.getBidTrue(adZoneKey), - bidObj, - data = placementMap[adZoneKey]; - - if (bid > 0) { - bidObj = bidfactory.createBid(1); - bidObj.cpm = bid; - bidObj.ad = W.CMT.Service.getAd(adZoneKey); - bidObj.width = data.w; - bidObj.height = data.h; - // bidObj.floor = W.CMT.Service.getSecondPrice(adZoneKey); - // bidObj.finalizeAd = finalizeAd; - } else { - bidObj = bidfactory.createBid(2); - } - bidObj.bidderCode = COX_BIDDER_CODE; - bidmanager.addBidResponse(data.p, bidObj); - } - } - - function _getCoxLite() { - var CMT = {}; - - CMT.Util = (function () { - return { - - getRand: function getRand() { - return Math.round(Math.random() * 100000000); - }, - - encodeUriObject: function encodeUriObject(obj) { - return encodeURIComponent(JSON.stringify(obj)); - }, - - extractUrlInfo: function extractUrlInfo() { - function f2(callback) { - try { - if (!W.location.ancestorOrigins) return; - for (var i = 0, len = W.location.ancestorOrigins.length; len > i; i++) { - callback.call(null, W.location.ancestorOrigins[i], i); - } - } catch (ignore) { } - return []; - } - - function f1(callback) { - var oneWindow, - infoArray = []; - do { - try { - oneWindow = oneWindow ? oneWindow.parent : W; - callback.call(null, oneWindow, infoArray); - } catch (t) { - infoArray.push({ - referrer: null, - location: null, - isTop: !1 - }); - return infoArray; - } - } while (oneWindow !== W.top); - return infoArray; - } - var allInfo = f1(function (oneWindow, infoArray) { - try { - infoArray.push({ referrer: oneWindow.document.referrer || null, location: oneWindow.location.href || null, isTop: oneWindow === W.top }); - } catch (e) { - infoArray.push({ referrer: null, location: null, isTop: oneWindow === W.top }); - } - }); - f2(function (n, r) { - allInfo[r].ancestor = n; - }); - for (var t = '', e = !1, i = allInfo.length - 1, l = allInfo.length - 1; l >= 0; l--) { - t = allInfo[l].location; - if (!t && l > 0) { - t = allInfo[l - 1].referrer; - if (!t) t = allInfo[l - 1].ancestor; - if (t) { - e = W.location.ancestorOrigins ? !0 : l === allInfo.length - 1 && allInfo[allInfo.length - 1].isTop; - break; - } - } - } return { url: t, isTop: e, depth: i }; - }, - - srTestCapabilities: function srTestCapabilities() { - var plugins = navigator.plugins, - flashVer = -1, - sf = 'Shockwave Flash'; - - if (plugins && plugins.length > 0) { - if (plugins[sf + ' 2.0'] || plugins[sf]) { - var swVer2 = plugins[sf + ' 2.0'] ? ' 2.0' : ''; - var flashDescription = plugins[sf + swVer2].description; - flashVer = flashDescription.split(' ')[2].split('.')[0]; - } - } - if (flashVer > 4) return 15; else return 7; - } - - }; - }()); - - // Ad calling functionality - CMT.Service = (function () { - // Closure variables shared by the service functions - var U = CMT.Util; - - return { - - buildSrc: function buildSrc(tag, env) { - var src = (document.location.protocol === 'https:' ? 'https://' : 'http://') + (!env || env === 'PRD' ? '' : env === 'PPE' ? 'ppe-' : env === 'STG' ? 'staging-' : '') + 'ad.afy11.net/ad' + '?mode=11' + '&ct=' + U.srTestCapabilities() + '&nif=0' + '&sf=0' + '&sfd=0' + '&ynw=0' + '&rand=' + U.getRand() + '&hb=1' + '&rk1=' + U.getRand() + '&rk2=' + new Date().valueOf() / 1000; - - // Make sure we don't have a response object... - delete tag.response; - - // Extracted url info... - var urlInfo = U.extractUrlInfo(); - tag.pageUrl = urlInfo.url; - tag.puTop = urlInfo.isTop; - - // Attach the serialized tag to our string - src += '&ab=' + U.encodeUriObject(tag); - - return src; - }, - - getAd: function (zoneKey) { - if (!zoneKey) return; - - return this._getData(zoneKey, 'ad') + (this._getResponse().tpCookieSync || ''); // ...also append cookie sync if present - }, - - // getSecondPrice: function getSecondPrice(zoneKey) { - // if (zoneKey.substring(0, 2) !== 'as') zoneKey = 'as' + zoneKey; - // var bid = this.getBidTrue(zoneKey), - // floor = this._getData(zoneKey, 'floor'); - - // // If no floor, just set it to 80% of the bid - // if (!floor) floor = bid * 0.80; - - // // Adjust the floor if it's too high...it needs to always be lower - // if (floor >= bid) { - // floor = floor * 0.80; // Take off 20% to account for possible non-adjusted 2nd highest bid - - // // If it's still too high, just take 80% to 90% of the bid - // if (floor >= bid) floor = bid * ((Math.random() * 10) + 80) / 100; - // } - // return Math.round(floor * 100) / 100; - // }, - - // setAuctionPrice: function setAuctionPrice(ad, bid) { - // return ad ? ad.replace('${AUCTION_PRICE}', bid) : ad; - // }, - - getBidTrue: function getBidTrue(zoneKey) { - return Math.round(this._getData(zoneKey, 'price') * 100) / 100; - }, - - _getData: function (zoneKey, field) { - var response = this._getResponse(), - zoneResponseData = response.zones ? response.zones[zoneKey] : {}; - - return (zoneResponseData || {})[field] || null; - }, - - _getResponse: function () { - var tag = W.cdsTag; - return (tag && tag.response) ? tag.response : {}; - }, - }; - }()); - - return CMT; - } - - // Export the callBids function, so that prebid.js can execute this function - // when the page asks to send out bid requests. - return { - callBids: _callBids, - }; -}; - -module.exports = CoxAdapter; +var bidfactory = require('src/bidfactory.js'); +var bidmanager = require('src/bidmanager.js'); +var adLoader = require('src/adloader.js'); +var adaptermanager = require('src/adaptermanager'); + +function CoxAdapter() { + var adZoneAttributeKeys = ['id', 'size', 'thirdPartyClickUrl'], + otherKeys = ['siteId', 'wrapper', 'referrerUrl'], + placementMap = {}, + W = window; + + var COX_BIDDER_CODE = 'cox'; + + function _callBids(params) { + var env = ''; + + // Create global cdsTag and CMT object (for the latter, only if needed ) + W.cdsTag = {}; + if (!W.CMT) W.CMT = _getCoxLite(); + + // Populate the tag with the info from prebid + var bids = params.bids || [], + tag = W.cdsTag, + i, + j; + for (i = 0; i < bids.length; i++) { + var bid = bids[i], + cfg = bid.params || {}; + + if (cfg.id) { + tag.zones = tag.zones || {}; + var zone = {}; + + for (j = 0; j < adZoneAttributeKeys.length; j++) { + if (cfg[adZoneAttributeKeys[j]]) zone[adZoneAttributeKeys[j]] = cfg[adZoneAttributeKeys[j]]; + } + for (j = 0; j < otherKeys.length; j++) { + if (cfg[otherKeys[j]]) tag[otherKeys[j]] = cfg[otherKeys[j]]; + } + var adZoneKey = 'as' + cfg.id; + tag.zones[adZoneKey] = zone; + + // Check for an environment setting + if (cfg.env) env = cfg.env; + + // Update the placement map + var xy = (cfg.size || '0x0').split('x'); + placementMap[adZoneKey] = { + p: bid.placementCode, + w: xy[0], + h: xy[1] + }; + } + } + if (tag.zones && Object.keys(tag.zones).length > 0) { + tag.__callback__ = function (r) { + tag.response = r; + _notify(); + }; + adLoader.loadScript(W.CMT.Service.buildSrc(tag, env)); + } + } + + function _notify() { + // Will execute in the context of a bid + // function finalizeAd(price) { + // this.ad = W.CMT.Service.setAuctionPrice(this.ad, price); + // return this; + // } + + for (var adZoneKey in placementMap) { + var bid = W.CMT.Service.getBidTrue(adZoneKey), + bidObj, + data = placementMap[adZoneKey]; + + if (bid > 0) { + bidObj = bidfactory.createBid(1); + bidObj.cpm = bid; + bidObj.ad = W.CMT.Service.getAd(adZoneKey); + bidObj.width = data.w; + bidObj.height = data.h; + // bidObj.floor = W.CMT.Service.getSecondPrice(adZoneKey); + // bidObj.finalizeAd = finalizeAd; + } else { + bidObj = bidfactory.createBid(2); + } + bidObj.bidderCode = COX_BIDDER_CODE; + bidmanager.addBidResponse(data.p, bidObj); + } + } + + function _getCoxLite() { + var CMT = {}; + + CMT.Util = (function () { + return { + + getRand: function getRand() { + return Math.round(Math.random() * 100000000); + }, + + encodeUriObject: function encodeUriObject(obj) { + return encodeURIComponent(JSON.stringify(obj)); + }, + + extractUrlInfo: function extractUrlInfo() { + function f2(callback) { + try { + if (!W.location.ancestorOrigins) return; + for (var i = 0, len = W.location.ancestorOrigins.length; len > i; i++) { + callback.call(null, W.location.ancestorOrigins[i], i); + } + } catch (ignore) { } + return []; + } + + function f1(callback) { + var oneWindow, + infoArray = []; + do { + try { + oneWindow = oneWindow ? oneWindow.parent : W; + callback.call(null, oneWindow, infoArray); + } catch (t) { + infoArray.push({ + referrer: null, + location: null, + isTop: !1 + }); + return infoArray; + } + } while (oneWindow !== W.top); + return infoArray; + } + var allInfo = f1(function (oneWindow, infoArray) { + try { + infoArray.push({ referrer: oneWindow.document.referrer || null, location: oneWindow.location.href || null, isTop: oneWindow === W.top }); + } catch (e) { + infoArray.push({ referrer: null, location: null, isTop: oneWindow === W.top }); + } + }); + f2(function (n, r) { + allInfo[r].ancestor = n; + }); + for (var t = '', e = !1, i = allInfo.length - 1, l = allInfo.length - 1; l >= 0; l--) { + t = allInfo[l].location; + if (!t && l > 0) { + t = allInfo[l - 1].referrer; + if (!t) t = allInfo[l - 1].ancestor; + if (t) { + e = W.location.ancestorOrigins ? !0 : l === allInfo.length - 1 && allInfo[allInfo.length - 1].isTop; + break; + } + } + } return { url: t, isTop: e, depth: i }; + }, + + srTestCapabilities: function srTestCapabilities() { + var plugins = navigator.plugins, + flashVer = -1, + sf = 'Shockwave Flash'; + + if (plugins && plugins.length > 0) { + if (plugins[sf + ' 2.0'] || plugins[sf]) { + var swVer2 = plugins[sf + ' 2.0'] ? ' 2.0' : ''; + var flashDescription = plugins[sf + swVer2].description; + flashVer = flashDescription.split(' ')[2].split('.')[0]; + } + } + if (flashVer > 4) return 15; else return 7; + } + + }; + }()); + + // Ad calling functionality + CMT.Service = (function () { + // Closure variables shared by the service functions + var U = CMT.Util; + + return { + + buildSrc: function buildSrc(tag, env) { + var src = (document.location.protocol === 'https:' ? 'https://' : 'http://') + (!env || env === 'PRD' ? '' : env === 'PPE' ? 'ppe-' : env === 'STG' ? 'staging-' : '') + 'ad.afy11.net/ad' + '?mode=11' + '&ct=' + U.srTestCapabilities() + '&nif=0' + '&sf=0' + '&sfd=0' + '&ynw=0' + '&rand=' + U.getRand() + '&hb=1' + '&rk1=' + U.getRand() + '&rk2=' + new Date().valueOf() / 1000; + + // Make sure we don't have a response object... + delete tag.response; + + // Extracted url info... + var urlInfo = U.extractUrlInfo(); + tag.pageUrl = urlInfo.url; + tag.puTop = urlInfo.isTop; + + // Attach the serialized tag to our string + src += '&ab=' + U.encodeUriObject(tag); + + return src; + }, + + getAd: function (zoneKey) { + if (!zoneKey) return; + + return this._getData(zoneKey, 'ad') + (this._getResponse().tpCookieSync || ''); // ...also append cookie sync if present + }, + + // getSecondPrice: function getSecondPrice(zoneKey) { + // if (zoneKey.substring(0, 2) !== 'as') zoneKey = 'as' + zoneKey; + // var bid = this.getBidTrue(zoneKey), + // floor = this._getData(zoneKey, 'floor'); + + // // If no floor, just set it to 80% of the bid + // if (!floor) floor = bid * 0.80; + + // // Adjust the floor if it's too high...it needs to always be lower + // if (floor >= bid) { + // floor = floor * 0.80; // Take off 20% to account for possible non-adjusted 2nd highest bid + + // // If it's still too high, just take 80% to 90% of the bid + // if (floor >= bid) floor = bid * ((Math.random() * 10) + 80) / 100; + // } + // return Math.round(floor * 100) / 100; + // }, + + // setAuctionPrice: function setAuctionPrice(ad, bid) { + // return ad ? ad.replace('${AUCTION_PRICE}', bid) : ad; + // }, + + getBidTrue: function getBidTrue(zoneKey) { + return Math.round(this._getData(zoneKey, 'price') * 100) / 100; + }, + + _getData: function (zoneKey, field) { + var response = this._getResponse(), + zoneResponseData = response.zones ? response.zones[zoneKey] : {}; + + return (zoneResponseData || {})[field] || null; + }, + + _getResponse: function () { + var tag = W.cdsTag; + return (tag && tag.response) ? tag.response : {}; + }, + }; + }()); + + return CMT; + } + + // Export the callBids function, so that prebid.js can execute this function + // when the page asks to send out bid requests. + return { + callBids: _callBids, + }; +} + +adaptermanager.registerBidAdapter(new CoxAdapter, 'cox'); + +module.exports = CoxAdapter; diff --git a/test/spec/adapters/cox_spec.js b/test/spec/modules/coxBidAdapter_spec.js similarity index 95% rename from test/spec/adapters/cox_spec.js rename to test/spec/modules/coxBidAdapter_spec.js index 3f1342230db..ee1eb991f23 100644 --- a/test/spec/adapters/cox_spec.js +++ b/test/spec/modules/coxBidAdapter_spec.js @@ -1,121 +1,120 @@ -import Adapter from 'src/adapters/cox'; -import bidManager from 'src/bidmanager'; -import adLoader from 'src/adloader'; -import utils from 'src/utils'; -import {expect} from 'chai'; - -describe('CoxAdapter', () => { - let adapter; - let loadScriptStub; - let addBidResponseSpy; - - let emitScript = (script) => { - let node = document.createElement('script'); - node.type = 'text/javascript'; - node.appendChild(document.createTextNode(script)); - document.getElementsByTagName('head')[0].appendChild(node); - }; - - beforeEach(() => { - adapter = new Adapter(); - addBidResponseSpy = sinon.spy(bidManager, 'addBidResponse'); - }); - - afterEach(() => { - loadScriptStub.restore(); - addBidResponseSpy.restore(); - }); - - describe('response handling', () => { - const normalResponse = 'cdsTag.__callback__({"zones":{"as2000005991707":{"ad" : "

FOO<\/h1>","uid" : "","price" : 1.51,"floor" : 0,}},"tpCookieSync":"

FOOKIE<\/h1>"})'; - const zeroPriceResponse = 'cdsTag.__callback__({"zones":{"as2000005991707":{"ad" : "

DEFAULT FOO<\/h1>","uid" : "","price" : 0,"floor" : 0,}},"tpCookieSync":"

FOOKIE<\/h1>"})'; - const incompleteResponse = 'cdsTag.__callback__({"zones":{},"tpCookieSync":"

FOOKIE<\/h1>"})'; - - const oneBidConfig = { - bidderCode: 'cox', - bids: [{ - bidder: 'cox', - placementCode: 'FOO456789', - sizes: [300, 250], - params: { size: '300x250', id: 2000005991707, siteId: 2000100948180, env: 'PROD' }, - }] - }; - - // ===== 1 - it('should provide a correctly populated Bid given a valid response', () => { - loadScriptStub = sinon.stub(adLoader, 'loadScript', () => { emitScript(normalResponse); }) - - adapter.callBids(oneBidConfig); - - let bid = addBidResponseSpy.args[0][1]; - expect(bid.cpm).to.equal(1.51); - expect(bid.ad).to.be.a('string'); - expect(bid.bidderCode).to.equal('cox'); - }); - - // ===== 2 - it('should provide an empty Bid given a zero-price response', () => { - loadScriptStub = sinon.stub(adLoader, 'loadScript', () => { emitScript(zeroPriceResponse); }) - - adapter.callBids(oneBidConfig); - - let bid = addBidResponseSpy.args[0][1]; - expect(bid.cpm).to.not.be.ok - expect(bid.ad).to.not.be.ok; - }); - - // ===== 3 - it('should provide an empty Bid given an incomplete response', () => { - loadScriptStub = sinon.stub(adLoader, 'loadScript', () => { emitScript(incompleteResponse); }) - - adapter.callBids(oneBidConfig); - - let bid = addBidResponseSpy.args[0][1]; - expect(bid.cpm).to.not.be.ok - expect(bid.ad).to.not.be.ok; - }); - - // ===== 4 - it('should not provide a Bid given no response', () => { - loadScriptStub = sinon.stub(adLoader, 'loadScript', () => { emitScript(''); }); - - adapter.callBids(oneBidConfig); - - expect(addBidResponseSpy.callCount).to.equal(0); - }); - }); - - describe('request generation', () => { - const missingBidsConfig = { - bidderCode: 'cox', - bids: null, - }; - const missingParamsConfig = { - bidderCode: 'cox', - bids: [{ - bidder: 'cox', - placementCode: 'FOO456789', - sizes: [300, 250], - params: null, - }] - }; - - // ===== 5 - it('should not make an ad call given missing bids in config', () => { - loadScriptStub = sinon.stub(adLoader, 'loadScript'); - - adapter.callBids(missingBidsConfig); - - expect(loadScriptStub.callCount).to.equal(0); - }); - - // ===== 6 - it('should not make an ad call given missing params in config', () => { - loadScriptStub = sinon.stub(adLoader, 'loadScript'); - - adapter.callBids(missingParamsConfig); - - expect(loadScriptStub.callCount).to.equal(0); - }); - }); -}); +import Adapter from 'modules/coxBidAdapter'; +import bidManager from 'src/bidmanager'; +import adLoader from 'src/adloader'; +import {expect} from 'chai'; + +describe('CoxAdapter', () => { + let adapter; + let loadScriptStub; + let addBidResponseSpy; + + let emitScript = (script) => { + let node = document.createElement('script'); + node.type = 'text/javascript'; + node.appendChild(document.createTextNode(script)); + document.getElementsByTagName('head')[0].appendChild(node); + }; + + beforeEach(() => { + adapter = new Adapter(); + addBidResponseSpy = sinon.spy(bidManager, 'addBidResponse'); + }); + + afterEach(() => { + loadScriptStub.restore(); + addBidResponseSpy.restore(); + }); + + describe('response handling', () => { + const normalResponse = 'cdsTag.__callback__({"zones":{"as2000005991707":{"ad" : "

FOO<\/h1>","uid" : "","price" : 1.51,"floor" : 0,}},"tpCookieSync":"

FOOKIE<\/h1>"})'; + const zeroPriceResponse = 'cdsTag.__callback__({"zones":{"as2000005991707":{"ad" : "

DEFAULT FOO<\/h1>","uid" : "","price" : 0,"floor" : 0,}},"tpCookieSync":"

FOOKIE<\/h1>"})'; + const incompleteResponse = 'cdsTag.__callback__({"zones":{},"tpCookieSync":"

FOOKIE<\/h1>"})'; + + const oneBidConfig = { + bidderCode: 'cox', + bids: [{ + bidder: 'cox', + placementCode: 'FOO456789', + sizes: [300, 250], + params: { size: '300x250', id: 2000005991707, siteId: 2000100948180, env: 'PROD' }, + }] + }; + + // ===== 1 + it('should provide a correctly populated Bid given a valid response', () => { + loadScriptStub = sinon.stub(adLoader, 'loadScript', () => { emitScript(normalResponse); }) + + adapter.callBids(oneBidConfig); + + let bid = addBidResponseSpy.args[0][1]; + expect(bid.cpm).to.equal(1.51); + expect(bid.ad).to.be.a('string'); + expect(bid.bidderCode).to.equal('cox'); + }); + + // ===== 2 + it('should provide an empty Bid given a zero-price response', () => { + loadScriptStub = sinon.stub(adLoader, 'loadScript', () => { emitScript(zeroPriceResponse); }) + + adapter.callBids(oneBidConfig); + + let bid = addBidResponseSpy.args[0][1]; + expect(bid.cpm).to.not.be.ok + expect(bid.ad).to.not.be.ok; + }); + + // ===== 3 + it('should provide an empty Bid given an incomplete response', () => { + loadScriptStub = sinon.stub(adLoader, 'loadScript', () => { emitScript(incompleteResponse); }) + + adapter.callBids(oneBidConfig); + + let bid = addBidResponseSpy.args[0][1]; + expect(bid.cpm).to.not.be.ok + expect(bid.ad).to.not.be.ok; + }); + + // ===== 4 + it('should not provide a Bid given no response', () => { + loadScriptStub = sinon.stub(adLoader, 'loadScript', () => { emitScript(''); }); + + adapter.callBids(oneBidConfig); + + expect(addBidResponseSpy.callCount).to.equal(0); + }); + }); + + describe('request generation', () => { + const missingBidsConfig = { + bidderCode: 'cox', + bids: null, + }; + const missingParamsConfig = { + bidderCode: 'cox', + bids: [{ + bidder: 'cox', + placementCode: 'FOO456789', + sizes: [300, 250], + params: null, + }] + }; + + // ===== 5 + it('should not make an ad call given missing bids in config', () => { + loadScriptStub = sinon.stub(adLoader, 'loadScript'); + + adapter.callBids(missingBidsConfig); + + expect(loadScriptStub.callCount).to.equal(0); + }); + + // ===== 6 + it('should not make an ad call given missing params in config', () => { + loadScriptStub = sinon.stub(adLoader, 'loadScript'); + + adapter.callBids(missingParamsConfig); + + expect(loadScriptStub.callCount).to.equal(0); + }); + }); +}); From 07cd422814fec7ebd7f251ebcdbae2c27058d119 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Wed, 14 Jun 2017 10:03:30 -0600 Subject: [PATCH 098/111] carambola bid adapter converted to module --- .../carambolaBidAdapter.js | 15 +++++++++------ .../carambolaBidAdapter_spec.js} | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) rename src/adapters/carambola.js => modules/carambolaBidAdapter.js (94%) rename test/spec/{adapters/carambola_spec.js => modules/carambolaBidAdapter_spec.js} (98%) diff --git a/src/adapters/carambola.js b/modules/carambolaBidAdapter.js similarity index 94% rename from src/adapters/carambola.js rename to modules/carambolaBidAdapter.js index 18a7c154f6d..ae064e93ce1 100644 --- a/src/adapters/carambola.js +++ b/modules/carambolaBidAdapter.js @@ -2,12 +2,13 @@ * Carambola adapter */ -var bidfactory = require('../bidfactory.js'); -var bidmanager = require('../bidmanager.js'); -const utils = require('../utils.js'); -const ajax = require('../ajax.js').ajax; +const bidfactory = require('src/bidfactory.js'); +const bidmanager = require('src/bidmanager.js'); +const utils = require('src/utils.js'); +const ajax = require('src/ajax.js').ajax; +const adaptermanager = require('src/adaptermanager'); -const CarambolaAdapter = function CarambolaAdapter() { +function CarambolaAdapter() { const BIDDER_CODE = 'carambola'; const REQUEST_PATH = 'hb/inimage/getHbBIdProcessedResponse'; @@ -188,6 +189,8 @@ const CarambolaAdapter = function CarambolaAdapter() { return { callBids: _callBids }; -}; +} + +adaptermanager.registerBidAdapter(new CarambolaAdapter, 'carambola'); module.exports = CarambolaAdapter; diff --git a/test/spec/adapters/carambola_spec.js b/test/spec/modules/carambolaBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/carambola_spec.js rename to test/spec/modules/carambolaBidAdapter_spec.js index fe856f66c21..660944b4f28 100644 --- a/test/spec/adapters/carambola_spec.js +++ b/test/spec/modules/carambolaBidAdapter_spec.js @@ -1,6 +1,6 @@ import {expect} from 'chai'; import * as utils from 'src/utils'; -import CarambolaAdapter from 'src/adapters/carambola'; +import CarambolaAdapter from 'modules/carambolaBidAdapter'; import bidmanager from 'src/bidmanager'; const DEFAULT_BIDDER_REQUEST = { From 8e039f255b321c34f7881d7851fffc44cd5893c1 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Wed, 14 Jun 2017 15:14:35 -0600 Subject: [PATCH 099/111] eplanning bid adapter converted to module --- .../eplanning.js => modules/eplanningBidAdapter.js | 7 +++++-- .../eplanningBidAdapter_spec.js} | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) rename src/adapters/eplanning.js => modules/eplanningBidAdapter.js (98%) rename test/spec/{adapters/eplanning_spec.js => modules/eplanningBidAdapter_spec.js} (98%) diff --git a/src/adapters/eplanning.js b/modules/eplanningBidAdapter.js similarity index 98% rename from src/adapters/eplanning.js rename to modules/eplanningBidAdapter.js index fd4acc0e047..b08c6ad1a81 100644 --- a/src/adapters/eplanning.js +++ b/modules/eplanningBidAdapter.js @@ -1,7 +1,8 @@ var bidfactory = require('src/bidfactory.js'); var bidmanager = require('src/bidmanager.js'); +var adaptermanager = require('src/adaptermanager'); -var EPlanningAdapter = function EPlanningAdapter() { +function EPlanningAdapter() { (function() { var win = window, doc = win.document, pbjs = win.pbjs, _global = {}, _default = { 'sv': 'ads.us.e-planning.net', 't': 0 }, rnd, FILE = 'file', CALLBACK_FUNCTION = 'hbpb.rH', NULL_SIZE = '1x1', _csRequested = [], PROTO = location.protocol === 'https:' ? 'https:' : 'http:', ISV = 'aklc.img.e-planning.net'; function Hbpb() { @@ -275,6 +276,8 @@ var EPlanningAdapter = function EPlanningAdapter() { return { callBids: _callBids }; -}; +} + +adaptermanager.registerBidAdapter(new EPlanningAdapter, 'eplanning'); module.exports = EPlanningAdapter; diff --git a/test/spec/adapters/eplanning_spec.js b/test/spec/modules/eplanningBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/eplanning_spec.js rename to test/spec/modules/eplanningBidAdapter_spec.js index 668392c169b..ca7c498c610 100644 --- a/test/spec/adapters/eplanning_spec.js +++ b/test/spec/modules/eplanningBidAdapter_spec.js @@ -1,7 +1,7 @@ describe('eplanning adapter tests', function () { var urlParse = require('url-parse'); var querystringify = require('querystringify'); - var adapter = require('src/adapters/eplanning'); + var adapter = require('modules/eplanningBidAdapter'); var adLoader = require('src/adloader'); var expect = require('chai').expect; var bidmanager = require('src/bidmanager'); From 9e8267fef199d6772e78dcc343469f7f7d61f55f Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Wed, 14 Jun 2017 16:16:16 -0600 Subject: [PATCH 100/111] --modules arg allows .json file as parameter --- adapters.json | 1 - analytics.json | 1 - gulpHelpers.js | 20 +++++++++++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) delete mode 100644 adapters.json delete mode 100644 analytics.json diff --git a/adapters.json b/adapters.json deleted file mode 100644 index fe51488c706..00000000000 --- a/adapters.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/analytics.json b/analytics.json deleted file mode 100644 index fe51488c706..00000000000 --- a/analytics.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/gulpHelpers.js b/gulpHelpers.js index d83462148ad..a8bfed69133 100644 --- a/gulpHelpers.js +++ b/gulpHelpers.js @@ -6,6 +6,7 @@ const MANIFEST = 'package.json'; const exec = require('child_process').exec; const through = require('through2'); const _ = require('lodash'); +const gutil = require('gulp-util'); const MODULE_PATH = './modules'; const BUILD_PATH = './build/dist'; @@ -40,7 +41,24 @@ module.exports = { .replace(/\/>/g, '\\/>'); }, getArgModules() { - return (argv.modules || '').split(',').filter(module => !!module); + var modules = (argv.modules || '').split(',').filter(module => !!module); + + try { + if (modules.length === 1 && path.extname(modules[0]).toLowerCase() === '.json') { + var moduleFile = modules[0]; + + modules = JSON.parse( + fs.readFileSync(moduleFile, 'utf8') + ); + } + } catch(e) { + throw new gutil.PluginError({ + plugin: 'modules', + message: 'failed reading: ' + argv.modules + }); + } + + return modules; }, getModules: _.memoize(function(externalModules) { externalModules = externalModules || []; From f3de01e891ed6d6397e75f9a01c687d17343457f Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 15 Jun 2017 09:52:13 -0600 Subject: [PATCH 101/111] removing config module for now --- modules/rubiconBidAdapter.js | 13 +++------- src/config.js | 49 ------------------------------------ src/prebid.js | 3 --- 3 files changed, 4 insertions(+), 61 deletions(-) delete mode 100644 src/config.js diff --git a/modules/rubiconBidAdapter.js b/modules/rubiconBidAdapter.js index 6621b400b6c..c9d91a11430 100644 --- a/modules/rubiconBidAdapter.js +++ b/modules/rubiconBidAdapter.js @@ -1,11 +1,10 @@ -import * as Adapter from 'src/adapter.js'; +import * as Adapter from 'src/adapter'; import bidfactory from 'src/bidfactory'; import bidmanager from 'src/bidmanager'; import adaptermanager from 'src/adaptermanager'; import * as utils from 'src/utils'; import { ajax } from 'src/ajax'; import { STATUS } from 'src/constants'; -import { getConfig } from 'src/config'; const RUBICON_BIDDER_CODE = 'rubicon'; @@ -24,10 +23,6 @@ const VIDEO_ENDPOINT = '//fastlane-adv.rubiconproject.com/v1/auction/video'; const TIMEOUT_BUFFER = 500; -var ACCOUNT_ID; -getConfig('rubiconAdapter', config => ACCOUNT_ID = config.accountId); - - var sizeMap = { 1: '468x60', 2: '728x90', @@ -186,7 +181,7 @@ function RubiconAdapter() { let postData = { page_url: !params.referrer ? utils.getTopWindowUrl() : params.referrer, resolution: _getScreenResolution(), - account_id: params.accountId || ACCOUNT_ID, + account_id: params.accountId, integration: getIntegration(), timeout: bidderRequest.timeout - (Date.now() - bidderRequest.auctionStart + TIMEOUT_BUFFER), stash_creatives: true, @@ -260,13 +255,13 @@ function RubiconAdapter() { throw 'no valid sizes'; } - if (!/^\d+$/.test(accountId) && !ACCOUNT_ID) { + if (!/^\d+$/.test(accountId)) { throw 'invalid accountId provided'; } // using array to honor ordering. if order isn't important (it shouldn't be), an object would probably be preferable var queryString = [ - 'account_id', accountId || ACCOUNT_ID, + 'account_id', accountId, 'site_id', siteId, 'zone_id', zoneId, 'size_id', parsedSizes[0], diff --git a/src/config.js b/src/config.js deleted file mode 100644 index 1ef1a4def98..00000000000 --- a/src/config.js +++ /dev/null @@ -1,49 +0,0 @@ - -import { logWarn, logError } from 'utils'; - -const CONFIG_ATTR = 'data-prebid-config'; - -var scripts = document.querySelectorAll(`script[${CONFIG_ATTR}]`); -var scriptConfig = {}; -var config = {}; -var configHandlers = {}; - -for (let i = 0; i < scripts.length; i++) { - try { - let script = scripts[i]; - let attrConfig = script.getAttribute(CONFIG_ATTR); - - if (attrConfig) { - Object.assign(scriptConfig, JSON.parse(attrConfig)); - } - } catch (e) { - logError(`Error parsing ${CONFIG_ATTR}`, null, e); - } -} - -export function setConfig(setConfig) { - Object.assign(config, setConfig); - - Object.keys(setConfig).forEach(property => { - if (Array.isArray(configHandlers[property])) { - configHandlers[property].forEach(handler => { - if (!config[property]) { - logWarn(`no config found for ${property}`); - } - - handler(config[property]); - }) - } - }); -} - -export function getConfig(property, handler) { - if (!configHandlers[property]) { - configHandlers[property] = []; - } - configHandlers[property].push(handler); -} - -export function getScriptConfig(property) { - return scriptConfig[property]; -} diff --git a/src/prebid.js b/src/prebid.js index 6f334448e8e..e211c447a1b 100644 --- a/src/prebid.js +++ b/src/prebid.js @@ -11,7 +11,6 @@ import { listenMessagesFromCreative } from './secureCreatives'; import { syncCookies } from 'src/cookie.js'; import { loadScript } from './adloader'; import { setAjaxTimeout } from './ajax'; -import { setConfig } from './config'; var $$PREBID_GLOBAL$$ = getGlobal(); @@ -730,8 +729,6 @@ $$PREBID_GLOBAL$$.setS2SConfig = function(options) { adaptermanager.setS2SConfig(config); }; -$$PREBID_GLOBAL$$.setConfig = setConfig; - $$PREBID_GLOBAL$$.que.push(() => listenMessagesFromCreative()); /** From dba8d52c6fab0323784122a6cc2f85a4c7228e95 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 15 Jun 2017 10:37:09 -0600 Subject: [PATCH 102/111] don't bundle AnalyticsAdapter.js in common chunk --- webpack.conf.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/webpack.conf.js b/webpack.conf.js index 1238942dc3a..1dd3326a659 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -5,6 +5,11 @@ var webpack = require('webpack'); var helpers = require('./gulpHelpers'); var RequireEnsureWithoutJsonp = require('./plugins/RequireEnsureWithoutJsonP.js'); +// list of module names to never include in the common bundle chunk +var neverBundle = [ + 'AnalyticsAdapter.js' +]; + module.exports = { devtool: 'source-map', resolve: { @@ -82,7 +87,9 @@ module.exports = { new webpack.optimize.CommonsChunkPlugin({ name: 'prebid', filename: 'prebid.js', - minChunks: 2 + minChunks: function(module, count) { + return !(count < 2 || neverBundle.includes(path.basename(module.resource))) + } }) ] }; From 6edd771d53e18855edb3c66a97a85e4566e395d5 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 15 Jun 2017 10:46:23 -0600 Subject: [PATCH 103/111] unruly bid adapter converted to module --- src/adapters/unruly.js => modules/unrulyBidAdapter.js | 3 +++ .../unruly_spec.js => modules/unrulyBidAdapter_spec.js} | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) rename src/adapters/unruly.js => modules/unrulyBidAdapter.js (96%) rename test/spec/{adapters/unruly_spec.js => modules/unrulyBidAdapter_spec.js} (99%) diff --git a/src/adapters/unruly.js b/modules/unrulyBidAdapter.js similarity index 96% rename from src/adapters/unruly.js rename to modules/unrulyBidAdapter.js index c9fbfde1ecc..54c6c9412be 100644 --- a/src/adapters/unruly.js +++ b/modules/unrulyBidAdapter.js @@ -4,6 +4,7 @@ import bidmanager from 'src/bidmanager' import * as utils from 'src/utils' import { STATUS } from 'src/constants' import { Renderer } from 'src/Renderer' +import adaptermanager from 'src/adaptermanager' function createRenderHandler({ bidResponseBid, rendererConfig }) { function createApi() { @@ -105,4 +106,6 @@ function createUnrulyAdapter() { return adapter } +adaptermanager.registerBidAdapter(new createUnrulyAdapter, 'unruly') + module.exports = createUnrulyAdapter diff --git a/test/spec/adapters/unruly_spec.js b/test/spec/modules/unrulyBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/unruly_spec.js rename to test/spec/modules/unrulyBidAdapter_spec.js index de0aa683bc9..dfa7a72b8ad 100644 --- a/test/spec/adapters/unruly_spec.js +++ b/test/spec/modules/unrulyBidAdapter_spec.js @@ -5,7 +5,7 @@ import bidmanager from 'src/bidmanager' import * as utils from 'src/utils' import { STATUS } from 'src/constants' import { Renderer } from 'src/Renderer' -import createUnrulyAdapter from 'src/adapters/unruly' +import createUnrulyAdapter from 'modules/unrulyBidAdapter' describe('UnrulyAdapter', () => { function createBidRequestBid({ placementCode }) { From 997534eefe4aa0c9f6f5e7fb6f1a03e5761f221b Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 15 Jun 2017 11:04:14 -0600 Subject: [PATCH 104/111] fixed case-sensitivity in including webpack plugin --- webpack.conf.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.conf.js b/webpack.conf.js index 1dd3326a659..81f31cb3044 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -3,7 +3,7 @@ var StringReplacePlugin = require('string-replace-webpack-plugin'); var path = require('path'); var webpack = require('webpack'); var helpers = require('./gulpHelpers'); -var RequireEnsureWithoutJsonp = require('./plugins/RequireEnsureWithoutJsonP.js'); +var RequireEnsureWithoutJsonp = require('./plugins/RequireEnsureWithoutJsonp.js'); // list of module names to never include in the common bundle chunk var neverBundle = [ From 569c76cfc329ba22fb5a99827fe5b7034be076f4 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Thu, 15 Jun 2017 11:12:15 -0600 Subject: [PATCH 105/111] can't use class keyword, updated to constructor function for plugin --- plugins/RequireEnsureWithoutJsonp.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/plugins/RequireEnsureWithoutJsonp.js b/plugins/RequireEnsureWithoutJsonp.js index ece3bdecf31..59026e5209d 100644 --- a/plugins/RequireEnsureWithoutJsonp.js +++ b/plugins/RequireEnsureWithoutJsonp.js @@ -1,19 +1,18 @@ -class RequireEnsureWithoutJsonP { - apply(compiler) { - compiler.plugin('compilation', function(compilation) { - compilation.mainTemplate.plugin('require-ensure', function(_, chunk, hash) { - return ( +function RequireEnsureWithoutJsonp() {} +RequireEnsureWithoutJsonp.prototype.apply = function(compiler) { + compiler.plugin('compilation', function(compilation) { + compilation.mainTemplate.plugin('require-ensure', function(_, chunk, hash) { + return ( ` if(installedChunks[chunkId] === 0) return callback.call(null, __webpack_require__); else console.error('webpack chunk not found and jsonp disabled'); ` - ).trim(); - }); + ).trim(); }); - } -} + }); +}; -module.exports = RequireEnsureWithoutJsonP; +module.exports = RequireEnsureWithoutJsonp; From 6713303a546123cef336177c9cb5ee1d8b15da17 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 19 Jun 2017 10:06:55 -0600 Subject: [PATCH 106/111] added jsdoc to express and new webpack plugin --- modules/express.js | 11 ++++++++++- plugins/RequireEnsureWithoutJsonp.js | 14 +++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/modules/express.js b/modules/express.js index e691b6164a3..8a855245e36 100644 --- a/modules/express.js +++ b/modules/express.js @@ -3,7 +3,16 @@ import * as utils from 'src/utils'; const MODULE_NAME = 'express'; - +/** + * Express Module + * + * The express module allows the initiation of Prebid.js auctions automatically based on calls such as gpt.defineSlot. + * It works by monkey-patching the gpt methods and overloading their functionality. In order for this module to be + * used gpt must be included in the page, this module must be included in the Prebid.js bundle, and a call to + * pbjs.express() must be made. + * + * @param {Object[]} [adUnits = pbjs.adUnits] - an array of adUnits for express to operate on. + */ $$PREBID_GLOBAL$$.express = function(adUnits = $$PREBID_GLOBAL$$.adUnits) { utils.logMessage('loading ' + MODULE_NAME); diff --git a/plugins/RequireEnsureWithoutJsonp.js b/plugins/RequireEnsureWithoutJsonp.js index 59026e5209d..b3b38f5e336 100644 --- a/plugins/RequireEnsureWithoutJsonp.js +++ b/plugins/RequireEnsureWithoutJsonp.js @@ -1,4 +1,16 @@ - +/** + * RequireEnsureWithoutJsonp + * + * This plugin redefines the behavior of require.ensure that is used by webpack to load chunks. Usually require.ensure + * includes code that allows the asynchronous loading of webpack chunks through jsonp requests AND includes a manifest + * of all the build chunks so that they can be requested by name (e.g. require.ensure('./module.js'). Since that + * functionality is not required and we plan on loading all of our chunks manually (either by concatenating all the + * files together or including as individual scripts) we don't want the overhead of including that loading code or the + * file manifest. In this plugin, that code is replaced with an error message if a module is requested that hasn't been + * loaded manually. + * + * @constructor + */ function RequireEnsureWithoutJsonp() {} RequireEnsureWithoutJsonp.prototype.apply = function(compiler) { compiler.plugin('compilation', function(compilation) { From a2c5c1f41baeb814ddedc2dc4f35e01bcb545eaa Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 23 Jun 2017 14:18:28 -0700 Subject: [PATCH 107/111] fixed sourcemaps for concat step in bundle --- gulpfile.js | 6 ++- package.json | 3 +- yarn.lock | 125 ++++++++++++++++++++++++++++++++++----------------- 3 files changed, 92 insertions(+), 42 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 3a11ab39daa..d3f0521a82d 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -24,6 +24,7 @@ var shell = require('gulp-shell'); var optimizejs = require('gulp-optimize-js'); var eslint = require('gulp-eslint'); var gulpif = require('gulp-if'); +var sourcemaps = require('gulp-sourcemaps'); var fs = require('fs'); var CI_MODE = process.env.NODE_ENV === 'ci'; @@ -75,11 +76,14 @@ function bundle(dev) { return gulp.src( entries - ).pipe(concat(argv.bundleName ? argv.bundleName : 'bundle.js')) + ) + .pipe(sourcemaps.init({loadMaps: true})) + .pipe(concat(argv.bundleName ? argv.bundleName : 'bundle.js')) .pipe(gulpif(!argv.manualEnable, footer('\n<%= global %>.processQueue();', { global: prebid.globalVarName } ))) + .pipe(sourcemaps.write()) .pipe(gulp.dest('build/' + (dev ? 'dev' : 'dist'))); } diff --git a/package.json b/package.json index 70ca831706a..abe66a0aca3 100644 --- a/package.json +++ b/package.json @@ -105,6 +105,7 @@ }, "dependencies": { "babel-plugin-transform-object-assign": "^6.22.0", - "core-js": "^2.4.1" + "core-js": "^2.4.1", + "gulp-sourcemaps": "^2.6.0" } } diff --git a/yarn.lock b/yarn.lock index b05243b7580..2ea12377d1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,23 @@ # yarn lockfile v1 +"@gulp-sourcemaps/identity-map@1.X": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1" + dependencies: + acorn "^5.0.3" + css "^2.2.1" + normalize-path "^2.1.1" + source-map "^0.5.6" + through2 "^2.0.3" + +"@gulp-sourcemaps/map-sources@1.X": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" + dependencies: + normalize-path "^2.0.1" + through2 "^2.0.3" + "JSV@>= 4.0.x": version "4.0.2" resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" @@ -30,15 +47,15 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" +acorn@4.X, acorn@^4.0.3: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + acorn@^3.0.0, acorn@^3.0.4, acorn@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.3: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - -acorn@^5.0.1: +acorn@^5.0.1, acorn@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" @@ -1753,7 +1770,7 @@ content-type@~1.0.1, content-type@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" -convert-source-map@^1.1.0: +convert-source-map@1.X, convert-source-map@^1.1.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" @@ -1856,7 +1873,7 @@ css-value@~0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/css-value/-/css-value-0.0.1.tgz#5efd6c2eea5ea1fd6b6ac57ec0427b18452424ea" -css@^2.0.0: +css@2.X, css@^2.0.0, css@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc" dependencies: @@ -1902,7 +1919,7 @@ d@1: dependencies: es5-ext "^0.10.9" -"dargs@github:christian-bromann/dargs": +dargs@christian-bromann/dargs: version "4.0.1" resolved "https://codeload.github.com/christian-bromann/dargs/tar.gz/7d6d4164a7c4106dbd14ef39ed8d95b7b5e9b770" dependencies: @@ -1946,11 +1963,18 @@ ddata@~0.1.25: string-tools "^1.0.0" test-value "^2.0.0" +debug-fabulous@0.1.X: + version "0.1.0" + resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-0.1.0.tgz#ad0ea07a5d519324fb55842a8f34ee59c7f8ff6c" + dependencies: + debug "2.X" + object-assign "4.1.0" + debug@0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" -debug@2, debug@2.6.8, debug@^2.1.1, debug@^2.2.0: +debug@2, debug@2.6.8, debug@2.X, debug@^2.1.1, debug@^2.2.0: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: @@ -2103,6 +2127,10 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" +detect-newline@2.X: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + detective@^4.3.1: version "4.5.0" resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd1" @@ -2397,11 +2425,11 @@ escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -escape-string-regexp@1.0.2, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: +escape-string-regexp@1.0.2, escape-string-regexp@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3296,16 +3324,16 @@ glogg@^1.0.0: dependencies: sparkles "^1.0.0" +graceful-fs@4.X, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + graceful-fs@^3.0.0, graceful-fs@~3.0.2: version "3.0.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" dependencies: natives "^1.1.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - graceful-fs@~1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" @@ -3458,6 +3486,23 @@ gulp-shell@^0.5.2: lodash "^4.0.0" through2 "^2.0.0" +gulp-sourcemaps@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.0.tgz#7ccce899a8a3bfca1593a3348d0fbf41dd3f51e5" + dependencies: + "@gulp-sourcemaps/identity-map" "1.X" + "@gulp-sourcemaps/map-sources" "1.X" + acorn "4.X" + convert-source-map "1.X" + css "2.X" + debug-fabulous "0.1.X" + detect-newline "2.X" + graceful-fs "4.X" + source-map "0.X" + strip-bom-string "1.X" + through2 "2.X" + vinyl "1.X" + gulp-uglify@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-0.3.2.tgz#fa37bf6d4ad9a29a349c6cba862abb22eba67aac" @@ -5032,11 +5077,7 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - -lru-cache@2.2.x: +lru-cache@2, lru-cache@2.2.x: version "2.2.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" @@ -5480,7 +5521,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: @@ -6921,6 +6962,10 @@ source-map@0.1.32: dependencies: amdefine ">=0.0.4" +source-map@0.X, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + source-map@^0.1.38, source-map@^0.1.40, source-map@^0.1.41, source-map@~0.1.38, source-map@~0.1.7: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" @@ -6933,10 +6978,6 @@ source-map@^0.4.4, source-map@~0.4.1: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" @@ -7152,6 +7193,10 @@ strip-ansi@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" +strip-bom-string@1.X: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + strip-bom@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" @@ -7318,6 +7363,13 @@ throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" +through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + "through2@>=0.6.1 <1.0.0-0", through2@^0.6.1, through2@^0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" @@ -7339,13 +7391,6 @@ through2@^0.5.0: readable-stream "~1.0.17" xtend "~3.0.0" -through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -7735,6 +7780,14 @@ vinyl-sourcemaps-apply@^0.2.0: dependencies: source-map "^0.5.1" +vinyl@1.X, vinyl@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + vinyl@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" @@ -7756,14 +7809,6 @@ vinyl@^0.5.0: clone-stats "^0.0.1" replace-ext "0.0.1" -vinyl@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - vinyl@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.0.2.tgz#0a3713d8d4e9221c58f10ca16c0116c9e25eda7c" From 1dbd41d31f130fcedf2f166e91432d89584ec76a Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Fri, 23 Jun 2017 14:25:14 -0700 Subject: [PATCH 108/111] use external sourcemap for bundle instead of inline --- gulpfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index d3f0521a82d..da58cc71a23 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -83,7 +83,7 @@ function bundle(dev) { global: prebid.globalVarName } ))) - .pipe(sourcemaps.write()) + .pipe(sourcemaps.write('.')) .pipe(gulp.dest('build/' + (dev ? 'dev' : 'dist'))); } From 50e9bff5f4aa6a65624bfca9e10949e6d3e015f6 Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 26 Jun 2017 11:10:27 -0600 Subject: [PATCH 109/111] rename prebid.js to prebid-core.js and main bundle outputs prebid.js now --- gulpHelpers.js | 4 ++-- gulpfile.js | 8 ++++---- webpack.conf.js | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/gulpHelpers.js b/gulpHelpers.js index a8bfed69133..03069e3af5d 100644 --- a/gulpHelpers.js +++ b/gulpHelpers.js @@ -97,8 +97,8 @@ module.exports = { return modules.map(name => path.join(__dirname, dev ? DEV_PATH : BUILD_PATH, name + '.js')); }, - getBuiltPrebid: function(dev) { - return path.join(__dirname, dev ? DEV_PATH : BUILD_PATH, 'prebid' + '.js'); + getBuiltPrebidCoreFile: function(dev) { + return path.join(__dirname, dev ? DEV_PATH : BUILD_PATH, 'prebid-core' + '.js'); }, getModulePaths: function(externalModules) { diff --git a/gulpfile.js b/gulpfile.js index da58cc71a23..5a7b588820f 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -69,7 +69,7 @@ function bundle(dev) { } } - var entries = [helpers.getBuiltPrebid(dev)].concat(helpers.getBuiltModules(dev, modules)); + var entries = [helpers.getBuiltPrebidCoreFile(dev)].concat(helpers.getBuiltModules(dev, modules)); gutil.log('Concatenating files:\n', entries); gutil.log('Appending ' + prebid.globalVarName + '.processQueue();'); @@ -77,13 +77,13 @@ function bundle(dev) { return gulp.src( entries ) - .pipe(sourcemaps.init({loadMaps: true})) - .pipe(concat(argv.bundleName ? argv.bundleName : 'bundle.js')) + .pipe(gulpif(dev, sourcemaps.init({loadMaps: true}))) + .pipe(concat(argv.bundleName ? argv.bundleName : 'prebid.js')) .pipe(gulpif(!argv.manualEnable, footer('\n<%= global %>.processQueue();', { global: prebid.globalVarName } ))) - .pipe(sourcemaps.write('.')) + .pipe(gulpif(dev, sourcemaps.write('.'))) .pipe(gulp.dest('build/' + (dev ? 'dev' : 'dist'))); } diff --git a/webpack.conf.js b/webpack.conf.js index 81f31cb3044..52fc3ff923c 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -86,7 +86,7 @@ module.exports = { // this plugin must be last so it can be easily removed for karma unit tests new webpack.optimize.CommonsChunkPlugin({ name: 'prebid', - filename: 'prebid.js', + filename: 'prebid-core.js', minChunks: function(module, count) { return !(count < 2 || neverBundle.includes(path.basename(module.resource))) } From 1e2d6e58c8bd9cf64b3946a3b327ed842fe3250e Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 26 Jun 2017 14:42:03 -0600 Subject: [PATCH 110/111] updated README.md to be module specific --- README.md | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 6aa65288645..947ddbf2dfd 100644 --- a/README.md +++ b/README.md @@ -51,17 +51,11 @@ This runs some code quality checks, starts a web server at `http://localhost:999 ### Build Optimization -The standard build output contains all the available bidder adapters listed in `adapters.json`. +The standard build output contains all the available modules from within the `modules` folder. -You might want to exclude some/most of them from the final bundle. To make sure the build only includes the adapters you want, you can make your own adapters file. +You might want to exclude some/most of them from the final bundle. To make sure the build only includes the modules you want, you can specify the modules to be included with the `--modules` CLI argument. -For example, in `path/to/your/list-of-adapters.json`, write: - - [ - "openx", - "rubicon", - "sovrn" - ] +For example, when running the serve command: `gulp serve --modules=openxBidAdapter,rubiconBidAdapter,sovrnBidAdapter` Building with just these adapters will result in a smaller bundle which should allow your pages to load faster. @@ -71,26 +65,35 @@ Prebid now supports the `yarn` npm client. This is an alternative to using `npm` For more info about yarn see https://yarnpkg.com - Clone the repo, run `yarn install` -- Duplicate `adapters.json` to e.g. `list-of-adapters.json` -- Remove the unnecessary adapters from `list-of-adapters.json` - Then run the build: - $ gulp build --adapters path/to/your/list-of-adapters.json + $ gulp build --modules=openxBidAdapter,rubiconBidAdapter,sovrnBidAdapter + +Alternatively, a `.json` file can be specified that contains a list of modules you would like to include. + + $ gulp build --modules=modules.json + +With `modules.json` containing the following +```json modules.json +[ + "openxBidAdapter", + "rubiconBidAdapter", + "sovrnBidAdapter" +] +``` **Build prebid.js using Yarn for bundling** In case you'd like to explicitly show that your project uses `prebid.js` and want a reproducible build, consider adding it as an `yarn` dependency. - Add `prebid.js` as a `yarn` dependency of your project: `yarn add prebid.js` -- Duplicate `node_modules/prebid.js/adapters.json` to under your project path, e.g. `path/to/your/list-of-adapters.json` -- Remove the unnecessary adapters - Run the `prebid.js` build under the `node_modules/prebid.js/` folder - $ gulp build --adapters path/to/your/list-of-adapters.json + $ gulp build --modules=path/to/your/list-of-modules.json Most likely your custom `prebid.js` will only change when there's: -- A change in your list of adapters +- A change in your list of modules - A new release of `prebid.js` Having said that, you are probably safe to check your custom bundle into your project. You can also generate it in your build process. @@ -156,7 +159,7 @@ Our PR review process can be found [here](https://github.com/prebid/Prebid.js/tr ### Add a Bidder Adapter -To add a bidder adapter, see the instructions in [How to add a bidder adaptor](http://prebid.org/dev-docs/bidder-adaptor.html). +To add a bidder adapter module, see the instructions in [How to add a bidder adaptor](http://prebid.org/dev-docs/bidder-adaptor.html). Please **do NOT load Prebid.js inside your adapter**. If you do this, we will reject or remove your adapter as appropriate. From 15e8565a68e494edcf39527d72152c31637052bd Mon Sep 17 00:00:00 2001 From: Rich Snapp Date: Mon, 26 Jun 2017 15:30:59 -0600 Subject: [PATCH 111/111] added filter to ignore hidden files in modules directory --- gulpHelpers.js | 1 + 1 file changed, 1 insertion(+) diff --git a/gulpHelpers.js b/gulpHelpers.js index 03069e3af5d..5225cfb32e8 100644 --- a/gulpHelpers.js +++ b/gulpHelpers.js @@ -65,6 +65,7 @@ module.exports = { var internalModules; try { internalModules = fs.readdirSync(MODULE_PATH) + .filter(file => !(/(^|\/)\.[^\/\.]/g).test(file)) .reduce((memo, file) => { var moduleName = file.split(new RegExp('[.' + path.sep + ']'))[0]; var filePath = path.join(MODULE_PATH, file);