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. diff --git a/adapters.json b/adapters.json deleted file mode 100644 index 71dc5fbb0a2..00000000000 --- a/adapters.json +++ /dev/null @@ -1,161 +0,0 @@ -[ - "aardvark", - "adblade", - "adbund", - "adbutler", - "adequant", - "adform", - "adkernel", - "admedia", - "adyoulike", - "bidfluence", - "vertamedia", - "aol", - "appnexus", - "appnexusAst", - "beachfront", - "audienceNetwork", - "carambola", - "conversant", - "districtmDMX", - "fidelity", - "gumgum", - "hiromedia", - "indexExchange", - "innity", - "kruxlink", - "getintent", - "inneractive", - "komoona", - "lifestreet", - "mantis", - "openx", - "piximedia", - "pubmatic", - "pubgears", - "pulsepoint", - "pulsepointLite", - "quantcast", - "rhythmone", - "rubicon", - "smartyads", - "huddledmasses", - "smartadserver", - "sekindoUM", - "serverbid", - "sonobi", - "sovrn", - "springserve", - "thoughtleadr", - "stickyadstv", - "triplelift", - "twenga", - "yieldbot", - "nginad", - "brightcom", - "wideorbit", - "jcm", - "underdogmedia", - "memeglobal", - "criteo", - "centro", - "xhb", - "sharethrough", - "roxot", - "vertoz", - "widespace", - "admixer", - "atomx", - "tapsense", - "trion", - "eplanning", - "prebidServer", - "adsupply", - "cox", - { - "appnexus": { - "alias": "brealtime" - } - }, - { - "appnexus": { - "alias": "pagescience" - } - }, - { - "appnexus": { - "alias": "defymedia" - } - }, - { - "appnexus": { - "alias": "gourmetads" - } - }, - { - "appnexusAst": { - "supportedMediaTypes": ["video", "native"] - } - }, - { - "vertamedia": { - "supportedMediaTypes": ["video"] - } - }, - { - "beachfront": { - "supportedMediaTypes": ["video"] - } - }, - { - "appnexus": { - "alias": "matomy" - } - }, - { - "rubicon": { - "alias": "rubiconLite", - "supportedMediaTypes": ["video"] - } - }, - { - "appnexus": { - "alias": "featureforward" - } - }, - { - "appnexus": { - "alias": "oftmedia" - } - }, - { - "adkernel": { - "alias": "headbidding" - } - }, - { - "getintent": { - "supportedMediaTypes" : ["video"] - } - }, - { - "stickyadstv": { - "alias": "freewheel-ssp" - } - }, - { - "rhythmone": { - "supportedMediaTypes": ["video"] - } - }, - { - "admixer": { - "supportedMediaTypes": ["video"] - } - }, - { - "conversant": { - "supportedMediaTypes": ["video"] - } - } -] 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 6091dc4c495..5225cfb32e8 100644 --- a/gulpHelpers.js +++ b/gulpHelpers.js @@ -4,6 +4,26 @@ 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 gutil = require('gulp-util'); + +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) { @@ -20,6 +40,85 @@ module.exports = { .replace(/<\//g, '<\\/') .replace(/\/>/g, '\\/>'); }, + getArgModules() { + 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 || []; + 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); + var modulePath = path.join(__dirname, filePath) + if (fs.lstatSync(filePath).isDirectory()) { + modulePath = path.join(__dirname, filePath, "index.js") + } + memo[modulePath] = moduleName; + return memo; + }, {}); + } 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, 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')); + }, + + getBuiltPrebidCoreFile: function(dev) { + return path.join(__dirname, dev ? DEV_PATH : BUILD_PATH, 'prebid-core' + '.js'); + }, + + getModulePaths: function(externalModules) { + var modules = this.getModules(externalModules); + return Object.keys(modules); + }, + + getModuleNames: function(externalModules) { + return _.values(this.getModules(externalModules)); + }, + + nameModules: function(externalModules) { + var modules = this.getModules(externalModules); + 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` @@ -37,18 +136,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..5a7b588820f 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'); @@ -6,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'); @@ -14,11 +17,15 @@ 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 sourcemaps = require('gulp-sourcemaps'); +var fs = require('fs'); var CI_MODE = process.env.NODE_ENV === 'ci'; var prebid = require('./package.json'); @@ -29,15 +36,15 @@ var analyticsDirectory = '../analytics'; var port = 9999; // Tasks -gulp.task('default', ['clean', 'lint', 'webpack']); +gulp.task('default', ['clean', 'webpack']); -gulp.task('serve', ['clean', 'lint', 'devpack', 'webpack', '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('run-tests', ['clean', 'lint', 'webpack', 'test']); -gulp.task('build', ['webpack']); +gulp.task('build', ['build-bundle-prod']); gulp.task('clean', function () { return gulp.src(['build'], { @@ -46,10 +53,53 @@ gulp.task('clean', function () { .pipe(clean()); }); +function bundle(dev) { + var modules = helpers.getArgModules(), + allModules = helpers.getModuleNames(modules); + + if(modules.length === 0) { + modules = allModules; + } else { + var diff = _.difference(modules, allModules); + if(diff.length !== 0) { + throw new gutil.PluginError({ + plugin: 'bundle', + message: 'invalid modules: ' + diff.join(', ') + }); + } + } + + var entries = [helpers.getBuiltPrebidCoreFile(dev)].concat(helpers.getBuiltModules(dev, modules)); + + gutil.log('Concatenating files:\n', entries); + gutil.log('Appending ' + prebid.globalVarName + '.processQueue();'); + + return gulp.src( + entries + ) + .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(gulpif(dev, sourcemaps.write('.'))) + .pipe(gulp.dest('build/' + (dev ? 'dev' : 'dist'))); +} + +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 = helpers.getArgModules(); + const analyticsSources = helpers.getAnalyticsSources(analyticsDirectory); - return gulp.src([].concat(analyticsSources, 'src/prebid.js')) + const moduleSources = helpers.getModulePaths(externalModules); + + return gulp.src([].concat(moduleSources, analyticsSources, 'src/prebid.js')) + .pipe(helpers.nameModules(externalModules)) .pipe(webpack(webpackConfig)) .pipe(replace('$prebid.version$', prebid.version)) .pipe(gulp.dest('build/dev')) @@ -65,12 +115,17 @@ gulp.task('webpack', ['clean'], function () { webpackConfig.devtool = null; + var externalModules = helpers.getArgModules(); + const analyticsSources = helpers.getAnalyticsSources(analyticsDirectory); - return gulp.src([].concat(analyticsSources, 'src/prebid.js')) + const moduleSources = helpers.getModulePaths(externalModules); + + return gulp.src([].concat(moduleSources, analyticsSources, 'src/prebid.js')) + .pipe(helpers.nameModules(externalModules)) .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()); @@ -134,26 +189,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; @@ -179,13 +214,15 @@ gulp.task('watch', function () { gulp.watch([ 'src/**/*.js', + 'modules/**/*.js', 'test/spec/**/*.js', '!test/spec/loaders/**/*.js' - ], ['clean', 'lint', 'webpack', 'devpack', 'test']); + ], ['lint', 'build-bundle-dev', 'test']); 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/karma.conf.js b/karma.conf.js index 3da7b378cbd..97a40d8430e 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -9,6 +9,9 @@ webpackConfig.module.postLoaders = [ } ]; +// remove optimize plugin for tests +webpackConfig.plugins.pop(); + var CI_MODE = process.env.NODE_ENV === 'ci'; module.exports = function (config) { @@ -38,19 +41,16 @@ 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: { 'test/**/*_spec.js': ['webpack'], + 'test/helpers/prebidGlobal.js': ['webpack'], '!test/**/*_spec.js': 'coverage', 'src/**/*.js': ['webpack', 'coverage'] }, 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/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/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/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/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/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/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/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/src/adapters/adkernel.js b/modules/adkernelBidAdapter.js similarity index 97% rename from src/adapters/adkernel.js rename to modules/adkernelBidAdapter.js index 32415bcba41..cd0ec8eb3cd 100644 --- a/src/adapters/adkernel.js +++ b/modules/adkernelBidAdapter.js @@ -2,7 +2,8 @@ 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'; /** * Adapter for requesting bids from AdKernel white-label platform @@ -267,4 +268,7 @@ AdKernelAdapter.createNew = function() { return new AdKernelAdapter(); }; +adaptermanager.registerBidAdapter(new AdKernelAdapter, 'adkernel'); +adaptermanager.aliasBidAdapter('adkernel', 'headbidding'); + module.exports = AdKernelAdapter; 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; 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/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/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/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/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/appnexusAst.js b/modules/appnexusAstBidAdapter.js similarity index 98% rename from src/adapters/appnexusAst.js rename to modules/appnexusAstBidAdapter.js index 193d12fa049..c7434680349 100644 --- a/src/adapters/appnexusAst.js +++ b/modules/appnexusAstBidAdapter.js @@ -1,10 +1,11 @@ -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'; 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/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/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/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/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/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; 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/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/src/adapters/conversant.js b/modules/conversantBidAdapter.js similarity index 95% rename from src/adapters/conversant.js rename to modules/conversantBidAdapter.js index 974eb4c8100..12984b521db 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,8 @@ var ConversantAdapter = function () { }; }; +adaptermanager.registerBidAdapter(new ConversantAdapter, 'conversant', { + supportedMediaTypes: ['video'] +}); + module.exports = ConversantAdapter; 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/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/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/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/modules/express.js b/modules/express.js new file mode 100644 index 00000000000..8a855245e36 --- /dev/null +++ b/modules/express.js @@ -0,0 +1,209 @@ + +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); + + if (adUnits.length === 0) { + utils.logWarn('no valid adUnits found, not loading ' + MODULE_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' + MODULE_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) { + $$PREBID_GLOBAL$$.requestBids({ + adUnits: adUnits, + bidsBackHandler: function () { + $$PREBID_GLOBAL$$.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) { + $$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); + }; + }); + +}; 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/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/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/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/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/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/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/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/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/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/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/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; 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/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/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/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; 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/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/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/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/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; 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/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/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/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/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/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/src/adapters/rubicon.js b/modules/rubiconBidAdapter.js similarity index 97% rename from src/adapters/rubicon.js rename to modules/rubiconBidAdapter.js index 241e30c6fdf..c9d91a11430 100644 --- a/src/adapters/rubicon.js +++ b/modules/rubiconBidAdapter.js @@ -1,6 +1,7 @@ -import * as Adapter from './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'; @@ -414,5 +415,10 @@ RubiconAdapter.createNew = function() { return new RubiconAdapter(); }; +adaptermanager.registerBidAdapter(new RubiconAdapter, RUBICON_BIDDER_CODE, { + supportedMediaTypes: ['video'] +}); +adaptermanager.aliasBidAdapter(RUBICON_BIDDER_CODE, 'rubiconLite'); + module.exports = RubiconAdapter; 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/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/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/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/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/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/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/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/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; 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/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/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/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/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/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/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/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/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/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/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/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/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; 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/package.json b/package.json index f4c751dea7b..abe66a0aca3 100644 --- a/package.json +++ b/package.json @@ -45,10 +45,12 @@ "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", "gulp-optimize-js": "^1.1.0", "gulp-rename": "^1.2.0", "gulp-replace": "^0.4.0", @@ -94,6 +96,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", @@ -102,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/plugins/RequireEnsureWithoutJsonp.js b/plugins/RequireEnsureWithoutJsonp.js new file mode 100644 index 00000000000..b3b38f5e336 --- /dev/null +++ b/plugins/RequireEnsureWithoutJsonp.js @@ -0,0 +1,30 @@ +/** + * 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) { + 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/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/adapter.js b/src/adapter.js similarity index 100% rename from src/adapters/adapter.js rename to src/adapter.js diff --git a/src/adaptermanager.js b/src/adaptermanager.js index 106f0f80e48..97ed301ee1d 100644 --- a/src/adaptermanager.js +++ b/src/adaptermanager.js @@ -2,12 +2,11 @@ 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'); var events = require('./events'); -import { BaseAdapter } from './adapters/baseAdapter'; var _bidderRegistry = {}; exports.bidderRegistry = _bidderRegistry; @@ -32,7 +31,7 @@ function getBids({bidderCode, requestId, bidderRequestId, adUnits}) { if (adUnit.nativeParams) { bid = Object.assign({}, bid, { - nativeParams: native(adUnit.nativeParams), + nativeParams: processNativeAdUnitParams(adUnit.nativeParams), }); } @@ -154,10 +153,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'); } @@ -177,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'); } @@ -231,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/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/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'; - } -} 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/src/prebid.js b/src/prebid.js index 03762858d27..e211c447a1b 100644 --- a/src/prebid.js +++ b/src/prebid.js @@ -77,54 +77,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) @@ -777,6 +729,56 @@ $$PREBID_GLOBAL$$.setS2SConfig = function(options) { adaptermanager.setS2SConfig(config); }; -$$PREBID_GLOBAL$$.cmd.push(() => listenMessagesFromCreative()); -processQueue($$PREBID_GLOBAL$$.cmd); -processQueue($$PREBID_GLOBAL$$.que); +$$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; + +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); + } + } + }); +} + +$$PREBID_GLOBAL$$.processQueue = function() { + processQueue($$PREBID_GLOBAL$$.que); + processQueue($$PREBID_GLOBAL$$.cmd); +}; diff --git a/test/helpers/prebidGlobal.js b/test/helpers/prebidGlobal.js new file mode 100644 index 00000000000..597076ab0db --- /dev/null +++ b/test/helpers/prebidGlobal.js @@ -0,0 +1,3 @@ +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/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/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/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'); 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'; 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'; diff --git a/test/spec/adapters/adbutler_spec.js b/test/spec/modules/adbutlerBidAdapter_spec.js similarity index 98% rename from test/spec/adapters/adbutler_spec.js rename to test/spec/modules/adbutlerBidAdapter_spec.js index ed08fb1888a..ec7073545b2 100644 --- a/test/spec/adapters/adbutler_spec.js +++ b/test/spec/modules/adbutlerBidAdapter_spec.js @@ -1,14 +1,9 @@ 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'); - window.pbjs = window.pbjs || {}; - if (typeof (pbjs) === 'undefined') { - var pbjs = window.pbjs; - } - describe('creation of bid url', function () { var stubLoadScript; 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; 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'; 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'); 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 59f7dc42d41..040c08e0ac1 100644 --- a/test/spec/adapters/adsupply_spec.js +++ b/test/spec/modules/adsupplyBidAdapter_spec.js @@ -1,14 +1,15 @@ 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(); - // before(() => sinon.stub(document.body, 'appendChild')); - // after(() => document.body.appendChild.restore()); + beforeEach(() => { + pbjs._bidsRequested = []; + }); 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/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'; 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 = () => { 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/adapters/appnexusAst_spec.js b/test/spec/modules/appnexusAstBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/appnexusAst_spec.js rename to test/spec/modules/appnexusAstBidAdapter_spec.js index db037f6d27b..0f125917614 100644 --- a/test/spec/adapters/appnexusAst_spec.js +++ b/test/spec/modules/appnexusAstBidAdapter_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/appnexusBidAdapter_spec.js similarity index 94% rename from test/spec/adapters/appnexus_spec.js rename to test/spec/modules/appnexusBidAdapter_spec.js index 7479f7960ff..e7f5310d90c 100644 --- a/test/spec/adapters/appnexus_spec.js +++ b/test/spec/modules/appnexusBidAdapter_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/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 db865057d68..1a62bac28a1 100644 --- a/test/spec/adapters/atomx_spec.js +++ b/test/spec/modules/atomxBidAdapter_spec.js @@ -1,6 +1,5 @@ -window.pbjs = window.pbjs || {}; 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'); 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'; 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'; diff --git a/test/spec/adapters/bidfluence_spec.js b/test/spec/modules/bidfluenceBidAdapter_spec.js similarity index 91% rename from test/spec/adapters/bidfluence_spec.js rename to test/spec/modules/bidfluenceBidAdapter_spec.js index 1e5510c4532..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 = { @@ -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/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 = { diff --git a/test/spec/adapters/centro_spec.js b/test/spec/modules/centroBidAdapter_spec.js similarity index 91% rename from test/spec/adapters/centro_spec.js rename to test/spec/modules/centroBidAdapter_spec.js index 73dcf287ff0..53283a92afe 100644 --- a/test/spec/adapters/centro_spec.js +++ b/test/spec/modules/centroBidAdapter_spec.js @@ -4,16 +4,11 @@ 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'); - window.pbjs = window.pbjs || {}; - if (typeof (pbjs) === 'undefined') { - var pbjs = window.pbjs; - } - let stubLoadScript; beforeEach(function () { stubLoadScript = sinon.stub(adLoader, 'loadScript'); @@ -33,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 () { @@ -103,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 = { @@ -172,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/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 () { 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); + }); + }); +}); 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'; 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'; 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'); diff --git a/test/spec/adapters/fidelity_spec.js b/test/spec/modules/fidelityBidAdapter_spec.js similarity index 93% rename from test/spec/adapters/fidelity_spec.js rename to test/spec/modules/fidelityBidAdapter_spec.js index 3b852713bff..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; @@ -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/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'; 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/gumgum_spec.js b/test/spec/modules/gumgumBidAdapter_spec.js similarity index 97% rename from test/spec/adapters/gumgum_spec.js rename to test/spec/modules/gumgumBidAdapter_spec.js index a6d33dc5bd0..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'; @@ -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/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); + }); + }); +}); 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'; 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 df143b6476c..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; @@ -8,8 +7,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/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 2e563b13398..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'; @@ -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/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 fbb3e05f5b0..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; @@ -7,8 +6,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/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 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'); diff --git a/test/spec/adapters/jcm_spec.js b/test/spec/modules/jcmBidAdapter_spec.js similarity index 83% rename from test/spec/adapters/jcm_spec.js rename to test/spec/modules/jcmBidAdapter_spec.js index 9d92fcb8e1e..59f95dfe6e6 100644 --- a/test/spec/adapters/jcm_spec.js +++ b/test/spec/modules/jcmBidAdapter_spec.js @@ -5,14 +5,10 @@ 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'); - window.pbjs = window.pbjs || {}; - if (typeof (pbjs) === 'undefined') { - var pbjs = window.pbjs; - } let stubLoadScript; beforeEach(function () { @@ -24,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 () { @@ -98,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 () { @@ -164,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 = { @@ -202,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 () { @@ -217,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/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'; 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(), 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'); diff --git a/test/spec/adapters/memeglobal_spec.js b/test/spec/modules/memeglobalBidAdapter_spec.js similarity index 92% rename from test/spec/adapters/memeglobal_spec.js rename to test/spec/modules/memeglobalBidAdapter_spec.js index 6aeaf161838..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'; @@ -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/modules/openxBidAdapter_spec.js similarity index 94% rename from test/spec/adapters/openx_spec.js rename to test/spec/modules/openxBidAdapter_spec.js index 437561a9621..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'); @@ -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/modules/piximediaBidAdapter_spec.js similarity index 81% rename from test/spec/adapters/piximedia_spec.js rename to test/spec/modules/piximediaBidAdapter_spec.js index f6168390182..76e4ded1b1b 100644 --- a/test/spec/adapters/piximedia_spec.js +++ b/test/spec/modules/piximediaBidAdapter_spec.js @@ -4,13 +4,12 @@ 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'); var CONSTANTS = require('src/constants.json'); - var pbjs = window.pbjs = window.pbjs || {}; let stubLoadScript; beforeEach(function () { @@ -22,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 () { @@ -125,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 () { @@ -153,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 () { @@ -181,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 = { @@ -212,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 () { @@ -238,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]; @@ -288,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]; @@ -331,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]; @@ -370,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); @@ -400,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/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)); 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', () => { 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/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'; 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'; 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 () { 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/adapters/roxot_spec.js b/test/spec/modules/roxotBidAdapter_spec.js similarity index 90% rename from test/spec/adapters/roxot_spec.js rename to test/spec/modules/roxotBidAdapter_spec.js index 471d97d9a22..af7bef291e1 100644 --- a/test/spec/adapters/roxot_spec.js +++ b/test/spec/modules/roxotBidAdapter_spec.js @@ -1,11 +1,11 @@ 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 () { 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/rubicon_spec.js b/test/spec/modules/rubiconBidAdapter_spec.js similarity index 99% rename from test/spec/adapters/rubicon_spec.js rename to test/spec/modules/rubiconBidAdapter_spec.js index 94a4fea82b9..254ab205439 100644 --- a/test/spec/adapters/rubicon_spec.js +++ b/test/spec/modules/rubiconBidAdapter_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/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', () => { 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'; 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', () => { diff --git a/test/spec/adapters/sharethrough_spec.js b/test/spec/modules/sharethroughBidAdapter_spec.js similarity index 94% rename from test/spec/adapters/sharethrough_spec.js rename to test/spec/modules/sharethroughBidAdapter_spec.js index 8f0bef53a4a..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', () => { @@ -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/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'); 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'; 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'); diff --git a/test/spec/adapters/sovrn_spec.js b/test/spec/modules/sovrnBidAdapter_spec.js similarity index 93% rename from test/spec/adapters/sovrn_spec.js rename to test/spec/modules/sovrnBidAdapter_spec.js index ee36fee5f3b..e0be789c1bf 100644 --- a/test/spec/adapters/sovrn_spec.js +++ b/test/spec/modules/sovrnBidAdapter_spec.js @@ -1,11 +1,11 @@ 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 () { 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/modules/stickyadstvBidAdapter_spec.js similarity index 97% rename from test/spec/adapters/stickyadstv_spec.js rename to test/spec/modules/stickyadstvBidAdapter_spec.js index 96a589ea07d..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 () { @@ -49,13 +48,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/modules/tapsenseBidAdapter_spec.js similarity index 94% rename from test/spec/adapters/tapsense_spec.js rename to test/spec/modules/tapsenseBidAdapter_spec.js index 162a8307443..997f0ca6c6e 100644 --- a/test/spec/adapters/tapsense_spec.js +++ b/test/spec/modules/tapsenseBidAdapter_spec.js @@ -1,11 +1,9 @@ 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'; -window.pbjs = window.pbjs || {}; - const DEFAULT_BIDDER_REQUEST = { 'bidderCode': 'tapsense', 'bidderRequestId': '141ed07a281ca3', @@ -31,7 +29,7 @@ const DEFAULT_BIDDER_REQUEST = { } } ] -} +}; const SUCCESSFUL_RESPONSE = { 'count_ad_units': 1, @@ -202,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'); }) }); @@ -220,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); @@ -233,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); @@ -251,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/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; diff --git a/test/spec/adapters/trion_spec.js b/test/spec/modules/trionBidAdapter_spec.js similarity index 89% rename from test/spec/adapters/trion_spec.js rename to test/spec/modules/trionBidAdapter_spec.js index dbbcf66ec87..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'); @@ -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/modules/tripleliftBidAdapter_spec.js similarity index 89% rename from test/spec/adapters/triplelift_spec.js rename to test/spec/modules/tripleliftBidAdapter_spec.js index cae78d95e30..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'; @@ -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/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'); 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'; 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 }) { 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'; diff --git a/test/spec/adapters/vertoz_spec.js b/test/spec/modules/vertozBidAdapter_spec.js similarity index 89% rename from test/spec/adapters/vertoz_spec.js rename to test/spec/modules/vertozBidAdapter_spec.js index b3881091df4..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'; @@ -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/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'); diff --git a/test/spec/adapters/widespace_spec.js b/test/spec/modules/widespaceBidAdapter_spec.js similarity index 92% rename from test/spec/adapters/widespace_spec.js rename to test/spec/modules/widespaceBidAdapter_spec.js index 95f4a16458c..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'; @@ -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/modules/yieldbotBidAdapter_spec.js similarity index 93% rename from test/spec/adapters/yieldbot_spec.js rename to test/spec/modules/yieldbotBidAdapter_spec.js index 3a8f52ca05e..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,8 +71,8 @@ let sandbox; let bidManagerStub; let yieldbotLibStub; -before(function() { - window.pbjs._bidsRequested.push(bidderRequest); +beforeEach(function() { + 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'; }); diff --git a/test/spec/unit/pbjs_api_spec.js b/test/spec/unit/pbjs_api_spec.js index 95aed3b396f..d4a0f5a5fa0 100644 --- a/test/spec/unit/pbjs_api_spec.js +++ b/test/spec/unit/pbjs_api_spec.js @@ -23,6 +23,10 @@ var events = require('src/events'); var adserver = require('src/adserver'); var CONSTANTS = require('src/constants.json'); +// 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'); $$PREBID_GLOBAL$$ = $$PREBID_GLOBAL$$ || {}; diff --git a/webpack.conf.js b/webpack.conf.js index 60aed503740..52fc3ff923c 100644 --- a/webpack.conf.js +++ b/webpack.conf.js @@ -1,25 +1,46 @@ var prebid = require('./package.json'); 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'); + +// list of module names to never include in the common bundle chunk +var neverBundle = [ + 'AnalyticsAdapter.js' +]; module.exports = { - output: { - filename: 'prebid.js' - }, devtool: 'source-map', resolve: { - modulesDirectories: ['', 'node_modules', 'src'] + root: [ + path.resolve('.') + ], + modulesDirectories: ['', 'node_modules'] }, resolveLoader: { - modulesDirectories: ['loaders', 'node_modules'] + root: [ + path.resolve('./loaders'), + path.resolve('./node_modules') + ] + }, + output: { + jsonpFunction: 'pbjsChunk' }, module: { loaders: [ { test: /\.js$/, - include: /(src|test)/, - exclude: path.resolve(__dirname, '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'] } @@ -28,21 +49,6 @@ module.exports = { test: /\.json$/, loader: 'json' }, - { - test: /adaptermanager.js/, - include: /(src)/, - loader: 'analyticsLoader' - }, - { - test: /adaptermanager.js/, - include: /(src)/, - loader: 'adapterLoader' - }, - { - test: /native.js/, - include: /(src)/, - loader: 'nativeLoader' - }, { test: /constants.json$/, include: /(src)/, @@ -59,7 +65,7 @@ module.exports = { }, { test: /\.js$/, - include: /(src|test|integrationExamples)/, + include: /(src|test|modules|integrationExamples)/, loader: StringReplacePlugin.replace({ replacements: [ { @@ -74,6 +80,16 @@ module.exports = { ] }, plugins: [ - new StringReplacePlugin() + 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-core.js', + minChunks: function(module, count) { + return !(count < 2 || neverBundle.includes(path.basename(module.resource))) + } + }) ] }; diff --git a/yarn.lock b/yarn.lock index f47012ba413..2ea12377d1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,27 @@ # 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" + abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" @@ -26,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.11" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" - -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" @@ -47,8 +68,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 +140,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 +163,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 +190,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 +319,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 +344,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 +429,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 +568,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 +596,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 +849,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 +948,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 +1053,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 +1062,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 +1175,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 +1316,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 +1326,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 +1368,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 +1467,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 +1580,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 +1740,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" @@ -1599,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" @@ -1622,6 +1793,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" @@ -1698,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: @@ -1734,13 +1909,17 @@ 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" 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: @@ -1784,15 +1963,22 @@ 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.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.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: - ms "0.7.3" + ms "2.0.0" debug@2.0.0: version "2.0.0" @@ -1812,17 +1998,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" +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" - -debug@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d" - 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 +2014,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,12 +2113,24 @@ 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" 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" @@ -1998,10 +2194,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" @@ -2012,6 +2236,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 +2271,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" @@ -2101,6 +2334,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" @@ -2121,8 +2362,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" @@ -2184,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" @@ -2203,7 +2444,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: @@ -2232,8 +2473,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" @@ -2244,7 +2485,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" @@ -2334,7 +2575,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" @@ -2355,7 +2596,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" @@ -2371,7 +2612,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" @@ -2386,7 +2627,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: @@ -2422,6 +2663,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" @@ -2496,6 +2741,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" @@ -2621,11 +2870,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" @@ -2659,6 +2908,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" @@ -2719,6 +2974,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" @@ -2794,6 +3053,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" @@ -2946,14 +3209,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: @@ -2961,7 +3217,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: @@ -2992,13 +3248,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" @@ -3035,9 +3291,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" @@ -3064,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.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" @@ -3139,6 +3399,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 +3416,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,16 +3450,11 @@ gulp-karma@0.0.4: optimist "~0.6.0" xtend "~2.1.1" -gulp-mocha@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-2.2.0.tgz#1ce5eba4b94b40c7436afec3c4982c8eea894192" +gulp-match@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.0.3.tgz#91c7c0d7f29becd6606d57d80a7f8776a87aba8e" 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" + minimatch "^3.0.3" gulp-optimize-js@^1.1.0: version "1.1.0" @@ -3206,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" @@ -3332,8 +3629,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" @@ -3388,6 +3685,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" @@ -3454,6 +3755,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" @@ -3461,7 +3769,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" @@ -3475,6 +3783,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" @@ -3534,6 +3852,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" @@ -3565,8 +3887,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" @@ -3589,6 +3911,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" @@ -3658,10 +3984,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" @@ -3690,8 +4012,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" @@ -3733,6 +4055,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" @@ -3840,7 +4168,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" @@ -3883,11 +4211,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" @@ -3900,6 +4226,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" @@ -3908,6 +4242,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" @@ -3980,6 +4358,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" @@ -4010,6 +4394,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" @@ -4028,6 +4416,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" @@ -4221,6 +4616,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" @@ -4263,6 +4662,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" @@ -4281,6 +4689,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" @@ -4335,6 +4750,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" @@ -4402,10 +4825,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" @@ -4586,7 +5017,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" @@ -4646,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" @@ -4732,14 +5159,20 @@ 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" + 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" @@ -4799,20 +5232,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: @@ -4843,7 +5276,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" @@ -4855,7 +5288,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: @@ -4900,21 +5333,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" @@ -4948,9 +5366,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" @@ -4973,7 +5391,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" @@ -4989,7 +5407,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" @@ -5053,8 +5475,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" @@ -5070,6 +5492,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" @@ -5092,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: @@ -5189,7 +5618,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: @@ -5299,10 +5728,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" @@ -5384,12 +5831,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" @@ -5420,6 +5875,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" @@ -5475,17 +5940,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" @@ -5529,6 +5990,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" @@ -5682,6 +6153,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" @@ -5690,7 +6168,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: @@ -5699,15 +6191,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" @@ -5755,7 +6247,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: @@ -5814,10 +6306,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" @@ -5826,16 +6314,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: @@ -5853,6 +6340,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" @@ -5864,8 +6361,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" @@ -5879,6 +6376,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" @@ -5899,7 +6402,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: @@ -6090,6 +6593,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" @@ -6129,6 +6636,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" @@ -6143,7 +6654,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: @@ -6153,7 +6664,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" @@ -6179,7 +6690,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" @@ -6282,9 +6793,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" @@ -6390,8 +6905,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" @@ -6425,6 +6940,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" @@ -6435,6 +6956,16 @@ 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.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" @@ -6447,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" @@ -6492,8 +7019,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" @@ -6502,7 +7029,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" @@ -6510,6 +7036,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" @@ -6564,6 +7094,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" @@ -6575,8 +7109,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" @@ -6620,10 +7154,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" @@ -6655,6 +7189,14 @@ 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-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" @@ -6678,6 +7220,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" @@ -6688,10 +7234,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" @@ -6780,12 +7322,14 @@ 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" +ternary-stream@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.0.1.tgz#064e489b4b5bf60ba6a6b7bc7f2f5c274ecf8269" dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" + 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" @@ -6819,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" @@ -6840,14 +7391,7 @@ through2@^0.5.0: readable-stream "~1.0.17" xtend "~3.0.0" -through2@^2.0.0, through2@^2.0.1: - 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.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" @@ -6896,13 +7440,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" @@ -6922,10 +7470,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" @@ -6970,7 +7522,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: @@ -6981,9 +7533,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" @@ -6995,8 +7547,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" @@ -7111,18 +7663,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" @@ -7151,11 +7703,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" @@ -7180,7 +7747,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" @@ -7213,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" @@ -7234,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" @@ -7268,6 +7835,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" @@ -7414,6 +8000,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" @@ -7477,7 +8075,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: