diff --git a/.circleci/config.yml b/.circleci/config.yml index c11f87b6f59..15bc6d83d6c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -17,9 +17,8 @@ aliases: - &restore_dep_cache keys: - - v1-dependencies-{{ checksum "package.json" }} - # fallback to using the latest cache if no exact match is found - - v1-dependencies- + - v5.20.x-legacy-dependencies-{{ checksum "package.json" }} + - v5.20.x-legacy-dependencies- - &save_dep_cache paths: diff --git a/gulpfile.js b/gulpfile.js index ff49436384b..3b40bb55835 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,30 +1,32 @@ /* eslint-disable no-console */ 'use strict'; -var _ = require('lodash'); +console.time('Loading Plugins in Prebid'); + var argv = require('yargs').argv; var gulp = require('gulp'); -var gutil = require('gulp-util'); -var connect = require('gulp-connect'); -var webpack = require('webpack'); -var webpackStream = require('webpack-stream'); -var gulpClean = require('gulp-clean'); -var KarmaServer = require('karma').Server; -var karmaConfMaker = require('./karma.conf.maker.js'); -var opens = require('opn'); -var webpackConfig = require('./webpack.conf.js'); -var helpers = require('./gulpHelpers.js'); +// var gutil = require('gulp-util'); +// var connect = require('gulp-connect'); +// var webpack = require('webpack'); +// var webpackStream = require('webpack-stream'); +// var terser = require('gulp-terser'); +// var gulpClean = require('gulp-clean'); +// var KarmaServer = require('karma').Server; +// var karmaConfMaker = require('./karma.conf.maker.js'); +// var opens = require('opn'); +// var webpackConfig = require('./webpack.conf.js'); +// var helpers = require('./gulpHelpers.js'); var concat = require('gulp-concat'); -var header = require('gulp-header'); -var footer = require('gulp-footer'); +// var header = require('gulp-header'); +// var footer = require('gulp-footer'); var replace = require('gulp-replace'); -var shell = require('gulp-shell'); -var eslint = require('gulp-eslint'); -var gulpif = require('gulp-if'); -var sourcemaps = require('gulp-sourcemaps'); -var through = require('through2'); -var fs = require('fs'); -var jsEscape = require('gulp-js-escape'); +// var shell = require('gulp-shell'); +// var eslint = require('gulp-eslint'); +// var gulpif = require('gulp-if'); +// var sourcemaps = require('gulp-sourcemaps'); +// var through = require('through2'); +// var fs = require('fs'); +// var jsEscape = require('gulp-js-escape'); const path = require('path'); const execa = require('execa'); @@ -32,8 +34,14 @@ var prebid = require('./package.json'); var dateString = 'Updated : ' + (new Date()).toISOString().substring(0, 10); var banner = '/* <%= prebid.name %> v<%= prebid.version %>\n' + dateString + '*/\n'; var port = 9999; + +/*console.timeEnd('Loading Plugins in Prebid'); +const FAKE_SERVER_HOST = argv.host ? argv.host : 'localhost'; +const FAKE_SERVER_PORT = 4444; */ + const INTEG_SERVER_HOST = argv.host ? argv.host : 'localhost'; const INTEG_SERVER_PORT = 4444; + const { spawn } = require('child_process'); // these modules must be explicitly listed in --modules to be included in the build, won't be part of "all" modules @@ -48,6 +56,7 @@ function bundleToStdout() { bundleToStdout.displayName = 'bundle-to-stdout'; function clean() { + var gulpClean = require('gulp-clean'); return gulp.src(['build'], { read: false, allowEmpty: true @@ -57,6 +66,7 @@ function clean() { // Dependant task for building postbid. It escapes postbid-config file. function escapePostbidConfig() { + var jsEscape = require('gulp-js-escape'); gulp.src('./integrationExamples/postbid/oas/postbid-config.js') .pipe(jsEscape()) .pipe(gulp.dest('build/postbid/')); @@ -64,20 +74,17 @@ function escapePostbidConfig() { escapePostbidConfig.displayName = 'escape-postbid-config'; function lint(done) { + + var eslint = require('gulp-eslint'); + var gulpif = require('gulp-if'); + if (argv.nolint) { return done(); } const isFixed = function (file) { return file.eslint != null && file.eslint.fixed; } - return gulp.src([ - 'src/**/*.js', - 'modules/**/*.js', - 'test/**/*.js', - 'plugins/**/*.js', - '!plugins/**/node_modules/**', - './*.js' - ], { base: './' }) + return gulp.src(['src/**/*.js', 'modules/**/*.js', 'test/**/*.js'], { base: './' }) .pipe(gulpif(argv.nolintfix, eslint(), eslint({ fix: true }))) .pipe(eslint.format('stylish')) .pipe(eslint.failAfterError()) @@ -86,6 +93,8 @@ function lint(done) { // View the code coverage report in the browser. function viewCoverage(done) { + var connect = require('gulp-connect'); + var opens = require('opn'); var coveragePort = 1999; var mylocalhost = (argv.host) ? argv.host : 'localhost'; @@ -114,12 +123,48 @@ function viewReview(done) { viewReview.displayName = 'view-review'; +// Watch Task with Live Reload +function watch(done) { + var connect = require('gulp-connect'); + var mainWatcher = gulp.watch([ + 'src/**/*.js', + 'modules/**/*.js', + 'test/spec/**/*.js', + '!test/spec/loaders/**/*.js' + ]); + var loaderWatcher = gulp.watch([ + 'loaders/**/*.js', + 'test/spec/loaders/**/*.js' + ]); + + connect.server({ + https: argv.https, + port: port, + host: FAKE_SERVER_HOST, + root: './', + livereload: true + }); + + mainWatcher.on('all', gulp.series(clean, gulp.parallel(lint, 'build-bundle-dev', test))); + loaderWatcher.on('all', gulp.series(lint)); + done(); +}; + +function makeModuleList(modules) { + return modules.map(module => { + return '"' + module + '"' + }); +} + function makeDevpackPkg() { + var _ = require('lodash'); + var connect = require('gulp-connect'); + var webpack = require('webpack'); + var webpackStream = require('webpack-stream'); + var webpackConfig = require('./webpack.conf'); + var helpers = require('./gulpHelpers'); var cloned = _.cloneDeep(webpackConfig); - Object.assign(cloned, { - devtool: 'source-map', - mode: 'development' - }) + cloned.devtool = 'source-map'; var externalModules = helpers.getArgModules(); const analyticsSources = helpers.getAnalyticsSources(); @@ -128,11 +173,21 @@ function makeDevpackPkg() { return gulp.src([].concat(moduleSources, analyticsSources, 'src/prebid.js')) .pipe(helpers.nameModules(externalModules)) .pipe(webpackStream(cloned, webpack)) + .pipe(replace(/('|")v\$prebid\.modulesList\$('|")/g, makeModuleList(externalModules))) .pipe(gulp.dest('build/dev')) .pipe(connect.reload()); } function makeWebpackPkg() { + var _ = require('lodash'); + var webpack = require('webpack'); + var webpackStream = require('webpack-stream'); + var terser = require('gulp-terser'); + var webpackConfig = require('./webpack.conf'); + var helpers = require('./gulpHelpers'); + var header = require('gulp-header'); + var gulpif = require('gulp-if'); + var cloned = _.cloneDeep(webpackConfig); if (!argv.sourceMaps) { delete cloned.devtool; @@ -146,6 +201,9 @@ function makeWebpackPkg() { return gulp.src([].concat(moduleSources, analyticsSources, 'src/prebid.js')) .pipe(helpers.nameModules(externalModules)) .pipe(webpackStream(cloned, webpack)) + /*.pipe(terser()) + .pipe(replace(/('|")v\$prebid\.modulesList\$('|")/g, makeModuleList(externalModules))) + .pipe(gulpif(file => file.basename === 'prebid-core.js', header(banner, { prebid: prebid })))*/ .pipe(gulp.dest('build/dist')); } @@ -167,6 +225,8 @@ function gulpBundle(dev) { return bundle(dev).pipe(gulp.dest('build/' + (dev ? 'dev' : 'dist'))); } +/*function nodeBundle(modules) { + var through = require('through2');*/ function nodeBundle(modules, dev = false) { return new Promise((resolve, reject) => { bundle(dev, modules) @@ -181,6 +241,13 @@ function nodeBundle(modules, dev = false) { } function bundle(dev, moduleArr) { + // console.time('Loading Plugins for Prebid'); + var _ = require('lodash'); + var gutil = require('gulp-util'); + var helpers = require('./gulpHelpers'); + var footer = require('gulp-footer'); + var gulpif = require('gulp-if'); + var sourcemaps = require('gulp-sourcemaps'); var modules = moduleArr || helpers.getArgModules(); var allModules = helpers.getModuleNames(modules); const sm = dev || argv.sourceMaps; @@ -206,9 +273,9 @@ function bundle(dev, moduleArr) { outputFileName = outputFileName.replace(/\.js$/, `.${argv.tag}.js`); } - gutil.log('Concatenating files:\n', entries); - gutil.log('Appending ' + prebid.globalVarName + '.processQueue();'); - gutil.log('Generating bundle:', outputFileName); + // gutil.log('Concatenating files:\n', entries); + // gutil.log('Appending ' + prebid.globalVarName + '.processQueue();'); + // gutil.log('Generating bundle:', outputFileName); return gulp.src( entries @@ -234,10 +301,58 @@ function bundle(dev, moduleArr) { // If --browsers is given, browsers can be chosen explicitly. e.g. --browsers=chrome,firefox,ie9 // If --notest is given, it will immediately skip the test task (useful for developing changes with `gulp serve --notest`) -function testTaskMaker(options = {}) { - ['watch', 'e2e', 'file', 'browserstack', 'notest'].forEach(opt => { - options[opt] = options[opt] || argv[opt]; - }) +function test(done) { + var KarmaServer = require('karma').Server; + var karmaConfMaker = require('./karma.conf.maker'); + var helpers = require('./gulpHelpers'); + if (argv.notest) { + done(); + } else if (argv.e2e) { + let wdioCmd = path.join(__dirname, 'node_modules/.bin/wdio'); + let wdioConf = path.join(__dirname, 'wdio.conf.js'); + let wdioOpts; + + if (argv.file) { + wdioOpts = [ + wdioConf, + `--spec`, + `${argv.file}` + ] + } else { + wdioOpts = [ + wdioConf + ]; + } + + + // run fake-server + /*const fakeServer = spawn('node', ['./test/fake-server/index.js', `--port=${FAKE_SERVER_PORT}`]); + fakeServer.stdout.on('data', (data) => { + console.log(`stdout: ${data}`); + }); + fakeServer.stderr.on('data', (data) => { + console.log(`stderr: ${data}`); + }); + + execa(wdioCmd, wdioOpts, { stdio: 'inherit' }) + .then(stdout => { + // kill fake server + fakeServer.kill('SIGINT'); + done(); + process.exit(0); + }) + .catch(err => { + // kill fake server + fakeServer.kill('SIGINT'); + done(new Error(`Tests failed with error: ${err}`)); + process.exit(1); + }); + } else { + var karmaConf = karmaConfMaker(false, argv.browserstack, argv.watch, argv.file); + + var browserOverride = helpers.parseBrowserArgs(argv); + if (browserOverride.length > 0) { + karmaConf.browsers = browserOverride;*/ return function test(done) { if (options.notest) { @@ -268,6 +383,8 @@ function testTaskMaker(options = {}) { new KarmaServer(karmaConf, newKarmaCallback(done)).start(); } + + new KarmaServer(karmaConf, newKarmaCallback(done)).start(); } } @@ -311,10 +428,13 @@ function newKarmaCallback(done) { // If --file "" is given, the task will only run tests in the specified file. function testCoverage(done) { + var KarmaServer = require('karma').Server; + var karmaConfMaker = require('./karma.conf.maker'); new KarmaServer(karmaConfMaker(true, false, false, argv.file), newKarmaCallback(done)).start(); } function coveralls() { // 2nd arg is a dependency: 'test' must be finished + var shell = require('gulp-shell'); // first send results of istanbul's test coverage to coveralls.io. return gulp.src('gulpfile.js', { read: false }) // You have to give it a file, but you don't // have to read it. @@ -325,6 +445,7 @@ function coveralls() { // 2nd arg is a dependency: 'test' must be finished // More info can be found here http://prebid.org/overview/what-is-post-bid.html function buildPostbid() { + var fs = require('fs'); var fileContent = fs.readFileSync('./build/postbid/postbid-config.js', 'utf8'); return gulp.src('./integrationExamples/postbid/oas/postbid.js') @@ -332,6 +453,14 @@ function buildPostbid() { .pipe(gulp.dest('build/postbid/')); } +/*function setupE2e(done) { + var gutil = require('gulp-util'); + if (!argv.host) { + throw new gutil.PluginError({ + plugin: 'E2E test', + message: gutil.colors.red('Host should be defined e.g. ap.localhost, anlocalhost. localhost cannot be used as safari browserstack is not able to connect to localhost') + });*/ + function startIntegServer(dev = false) { const args = ['./test/fake-server/index.js', `--port=${INTEG_SERVER_PORT}`, `--host=${INTEG_SERVER_HOST}`]; if (dev) { @@ -357,6 +486,7 @@ function startLocalServer(options = {}) { }); } + // Watch Task with Live Reload function watchTaskMaker(options = {}) { if (options.livereload == null) { @@ -392,8 +522,7 @@ gulp.task('build-bundle-dev', gulp.series(makeDevpackPkg, gulpBundle.bind(null, gulp.task('build-bundle-prod', gulp.series(makeWebpackPkg, addBanner, gulpBundle.bind(null, false))); // public tasks (dependencies are needed for each task since they can be ran on their own) -gulp.task('test-only', test); -gulp.task('test', gulp.series(clean, lint, 'test-only')); +gulp.task('test', gulp.series(clean, lint, test)); gulp.task('test-coverage', gulp.series(clean, testCoverage)); gulp.task(viewCoverage); @@ -404,11 +533,16 @@ gulp.task('build', gulp.series(clean, 'build-bundle-prod')); gulp.task('build-postbid', gulp.series(escapePostbidConfig, buildPostbid)); gulp.task('serve', gulp.series(clean, lint, gulp.parallel('build-bundle-dev', watch, test))); + +/*gulp.task('serve-fast', gulp.series(clean, gulp.parallel('build-bundle-dev', watch))); +gulp.task('serve-fake', gulp.series(clean, gulp.parallel('build-bundle-dev', watch), injectFakeServerEndpointDev, test, startFakeServer));*/ + gulp.task('serve-fast', gulp.series(clean, gulp.parallel('build-bundle-dev', watchFast))); gulp.task('serve-and-test', gulp.series(clean, gulp.parallel('build-bundle-dev', watchFast, testTaskMaker({watch: true})))); gulp.task('serve-e2e', gulp.series(clean, 'build-bundle-prod', gulp.parallel(() => startIntegServer(), startLocalServer))) gulp.task('serve-e2e-dev', gulp.series(clean, 'build-bundle-dev', gulp.parallel(() => startIntegServer(true), startLocalServer))) + gulp.task('default', gulp.series(clean, 'build-bundle-prod')); gulp.task('e2e-test-only', () => runWebdriver({file: argv.file})) @@ -421,4 +555,4 @@ gulp.task('bundle', gulpBundle.bind(null, false)); // used for just concatenatin gulp.task(viewReview); gulp.task('review-start', gulp.series(clean, lint, gulp.parallel('build-bundle-dev', watch, testCoverage), viewReview)); -module.exports = nodeBundle; +module.exports = nodeBundle; \ No newline at end of file diff --git a/integrationExamples/gpt/gdpr_iframe_hello_world.html b/integrationExamples/gpt/gdpr_iframe_hello_world.html new file mode 100644 index 00000000000..4ead5832bc7 --- /dev/null +++ b/integrationExamples/gpt/gdpr_iframe_hello_world.html @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + +

Prebid.js Test

+
Div-1
+
+ +
+ + \ No newline at end of file diff --git a/integrationExamples/gpt/gdpr_iframe_test.html b/integrationExamples/gpt/gdpr_iframe_test.html new file mode 100644 index 00000000000..bb643da24a6 --- /dev/null +++ b/integrationExamples/gpt/gdpr_iframe_test.html @@ -0,0 +1,10 @@ + + + + + + + +