<commit_before>import {
  convertToDate,
  dateNDaysAgo,
  getBeginningTimeForDate,
  getRange,
  shiftDate
} from '../src/helpers';

describe('shiftDate', () => {
  it('adds a day to the first day of a month', () => {
    const startingDate = new Date(2017, 0, 1);
    const expectedDate = new Date(2017, 0, 2);

    expect(shiftDate(startingDate, 1).getTime()).toBe(expectedDate.getTime());
  });

  it('adds multiple days to the first day of a month', () => {
    const startingDate = new Date(2017, 0, 1);
    const expectedDate = new Date(2017, 0, 3);

    expect(shiftDate(startingDate, 2).getTime()).toBe(expectedDate.getTime());
  });

  it('subtracts a day from the first day of a month', () => {
    const startingDate = new Date(2017, 0, 1);
    const expectedDate = new Date(2016, 11, 31);

    expect(shiftDate(startingDate, -1).getTime()).toBe(expectedDate.getTime());
  });

  it('subtracts multiple days from the first day of a month', () => {
    const startingDate = new Date(2017, 0, 1);
    const expectedDate = new Date(2016, 11, 30);

    expect(shiftDate(startingDate, -2).getTime()).toBe(expectedDate.getTime());
  });

  it('adds a day to a non-first day of a month', () => {
    const startingDate = new Date(2017, 0, 2);
    const expectedDate = new Date(2017, 0, 3);

    expect(shiftDate(startingDate, 1).getTime()).toBe(expectedDate.getTime());
  });

  it('adds multiple days to a non-first day of a month', () => {
    const startingDate = new Date(2017, 0, 2);
    const expectedDate = new Date(2017, 0, 4);

    expect(shiftDate(startingDate, 2).getTime()).toBe(expectedDate.getTime());
  });

  it('subtracts a day from a non-first day of a month', () => {
    const startingDate = new Date(2017, 0, 2);
    const expectedDate = new Date(2017, 0, 1);

    expect(shiftDate(startingDate, -1).getTime()).toBe(expectedDate.getTime());
  });

  it('subtracts multiple days from a non-first day of a month', () => {
    const startingDate = new Date(2017, 0, 2);
    const expectedDate = new Date(2016, 11, 31);

    expect(shiftDate(startingDate, -2).getTime()).toBe(expectedDate.getTime());
  });
});

describe('getBeginningTimeForDate', () => {
  it('gets midnight (in the local timezone) on the date passed in', () => {
    const inputDate = new Date(2017, 11, 25, 21, 30, 59, 750);
    const expectedDate = new Date(2017, 11, 25, 0, 0, 0, 0);

    expect(getBeginningTimeForDate(inputDate).getTime()).toBe(expectedDate.getTime());
  });
});

describe('convertToDate', () => {
  it('interprets an "ISO-8601 date-only" string as UTC and converts it into a Date object representing the first millisecond on that date', () => {
    const iso8601DateOnlyString = '2017-07-14';
    const expectedDate = new Date(Date.UTC(2017, 6, 14, 0, 0, 0, 0));

    expect(convertToDate(iso8601DateOnlyString).getTime()).toBe(expectedDate.getTime());
  });

  it('interprets a millisecond timestamp integer as UTC and converts it into a Date object representing that same millisecond', () => {
    const msTimestamp = 1500000001234; // Friday, July 14, 2017 2:40:01.234 AM, according to https://epochconverter.com
    const expectedDate = new Date(Date.UTC(2017, 6, 14, 2, 40, 1, 234));

    expect(convertToDate(msTimestamp).getTime()).toBe(expectedDate.getTime());
  });

  it('returns the same Date object it receives', () => {
    const inputDate = new Date(2017, 11, 25, 21, 30, 59, 750);
    const originalTimestamp = inputDate.getTime();

    expect(convertToDate(inputDate)).toBe(inputDate);
    expect(convertToDate(inputDate).getTime()).toBe(originalTimestamp);
  });
});

describe('dateNDaysAgo', () => {
  it('crosses month boundaries in the negative direction', () => {
    const numDays = 32;
    const startingDate = new Date();
    const expectedDate = new Date(startingDate.getTime());
    expectedDate.setDate(startingDate.getDate() - numDays);

    expect(dateNDaysAgo(numDays).getTime()).toBe(expectedDate.getTime());
  });

  it('crosses month boundaries in the positive direction', () => {
    const numDays = -32;
    const startingDate = new Date();
    const expectedDate = new Date(startingDate.getTime());
    expectedDate.setDate(startingDate.getDate() - numDays);

    expect(dateNDaysAgo(numDays).getTime()).toBe(expectedDate.getTime());
  });

  it('crosses year boundaries in the negative direction', () => {
    const numDays = 366;
    const startingDate = new Date();
    const expectedDate = new Date(startingDate.getTime());
    expectedDate.setDate(startingDate.getDate() - numDays);

    expect(dateNDaysAgo(numDays).getTime()).toBe(expectedDate.getTime());
  });

  it('crosses year boundaries in the positive direction', () => {
    const numDays = -366;
    const startingDate = new Date();
    const expectedDate = new Date(startingDate.getTime());
    expectedDate.setDate(startingDate.getDate() - numDays);

    expect(dateNDaysAgo(numDays).getTime()).toBe(expectedDate.getTime());
  });
});

describe('getRange', () => {
  it('generates an empty array', () => {
    expect(getRange(0)).toEqual([]);
  });

  it('generates an array containing one integer', () => {
    expect(getRange(1)).toEqual([0]);
  });

  it('generates an array containing multiple integers', () => {
    expect(getRange(5)).toEqual([0, 1, 2, 3, 4]);
  });
});
<commit_msg>Add missing trailing comma<commit_after>import {
  convertToDate,
  dateNDaysAgo,
  getBeginningTimeForDate,
  getRange,
  shiftDate,
} from '../src/helpers';

describe('shiftDate', () => {
  it('adds a day to the first day of a month', () => {
    const startingDate = new Date(2017, 0, 1);
    const expectedDate = new Date(2017, 0, 2);

    expect(shiftDate(startingDate, 1).getTime()).toBe(expectedDate.getTime());
  });

  it('adds multiple days to the first day of a month', () => {
    const startingDate = new Date(2017, 0, 1);
    const expectedDate = new Date(2017, 0, 3);

    expect(shiftDate(startingDate, 2).getTime()).toBe(expectedDate.getTime());
  });

  it('subtracts a day from the first day of a month', () => {
    const startingDate = new Date(2017, 0, 1);
    const expectedDate = new Date(2016, 11, 31);

    expect(shiftDate(startingDate, -1).getTime()).toBe(expectedDate.getTime());
  });

  it('subtracts multiple days from the first day of a month', () => {
    const startingDate = new Date(2017, 0, 1);
    const expectedDate = new Date(2016, 11, 30);

    expect(shiftDate(startingDate, -2).getTime()).toBe(expectedDate.getTime());
  });

  it('adds a day to a non-first day of a month', () => {
    const startingDate = new Date(2017, 0, 2);
    const expectedDate = new Date(2017, 0, 3);

    expect(shiftDate(startingDate, 1).getTime()).toBe(expectedDate.getTime());
  });

  it('adds multiple days to a non-first day of a month', () => {
    const startingDate = new Date(2017, 0, 2);
    const expectedDate = new Date(2017, 0, 4);

    expect(shiftDate(startingDate, 2).getTime()).toBe(expectedDate.getTime());
  });

  it('subtracts a day from a non-first day of a month', () => {
    const startingDate = new Date(2017, 0, 2);
    const expectedDate = new Date(2017, 0, 1);

    expect(shiftDate(startingDate, -1).getTime()).toBe(expectedDate.getTime());
  });

  it('subtracts multiple days from a non-first day of a month', () => {
    const startingDate = new Date(2017, 0, 2);
    const expectedDate = new Date(2016, 11, 31);

    expect(shiftDate(startingDate, -2).getTime()).toBe(expectedDate.getTime());
  });
});

describe('getBeginningTimeForDate', () => {
  it('gets midnight (in the local timezone) on the date passed in', () => {
    const inputDate = new Date(2017, 11, 25, 21, 30, 59, 750);
    const expectedDate = new Date(2017, 11, 25, 0, 0, 0, 0);

    expect(getBeginningTimeForDate(inputDate).getTime()).toBe(expectedDate.getTime());
  });
});

describe('convertToDate', () => {
  it('interprets an "ISO-8601 date-only" string as UTC and converts it into a Date object representing the first millisecond on that date', () => {
    const iso8601DateOnlyString = '2017-07-14';
    const expectedDate = new Date(Date.UTC(2017, 6, 14, 0, 0, 0, 0));

    expect(convertToDate(iso8601DateOnlyString).getTime()).toBe(expectedDate.getTime());
  });

  it('interprets a millisecond timestamp integer as UTC and converts it into a Date object representing that same millisecond', () => {
    const msTimestamp = 1500000001234; // Friday, July 14, 2017 2:40:01.234 AM, according to https://epochconverter.com
    const expectedDate = new Date(Date.UTC(2017, 6, 14, 2, 40, 1, 234));

    expect(convertToDate(msTimestamp).getTime()).toBe(expectedDate.getTime());
  });

  it('returns the same Date object it receives', () => {
    const inputDate = new Date(2017, 11, 25, 21, 30, 59, 750);
    const originalTimestamp = inputDate.getTime();

    expect(convertToDate(inputDate)).toBe(inputDate);
    expect(convertToDate(inputDate).getTime()).toBe(originalTimestamp);
  });
});

describe('dateNDaysAgo', () => {
  it('crosses month boundaries in the negative direction', () => {
    const numDays = 32;
    const startingDate = new Date();
    const expectedDate = new Date(startingDate.getTime());
    expectedDate.setDate(startingDate.getDate() - numDays);

    expect(dateNDaysAgo(numDays).getTime()).toBe(expectedDate.getTime());
  });

  it('crosses month boundaries in the positive direction', () => {
    const numDays = -32;
    const startingDate = new Date();
    const expectedDate = new Date(startingDate.getTime());
    expectedDate.setDate(startingDate.getDate() - numDays);

    expect(dateNDaysAgo(numDays).getTime()).toBe(expectedDate.getTime());
  });

  it('crosses year boundaries in the negative direction', () => {
    const numDays = 366;
    const startingDate = new Date();
    const expectedDate = new Date(startingDate.getTime());
    expectedDate.setDate(startingDate.getDate() - numDays);

    expect(dateNDaysAgo(numDays).getTime()).toBe(expectedDate.getTime());
  });

  it('crosses year boundaries in the positive direction', () => {
    const numDays = -366;
    const startingDate = new Date();
    const expectedDate = new Date(startingDate.getTime());
    expectedDate.setDate(startingDate.getDate() - numDays);

    expect(dateNDaysAgo(numDays).getTime()).toBe(expectedDate.getTime());
  });
});

describe('getRange', () => {
  it('generates an empty array', () => {
    expect(getRange(0)).toEqual([]);
  });

  it('generates an array containing one integer', () => {
    expect(getRange(1)).toEqual([0]);
  });

  it('generates an array containing multiple integers', () => {
    expect(getRange(5)).toEqual([0, 1, 2, 3, 4]);
  });
});
<|endoftext|>


<commit_before>/* jshint camelcase: false, strict: false */
/* global describe, beforeEach, it */

var chai = require('chai'),
    should = chai.should(),
    util = require('util'),
    gutil = require('gulp-util'),
    path = require('path'),
    commandRunner = require('../lib/commandRunner'),
    install = require('../.'),
    args = process.argv.slice();

function fixture (file) {
  var filepath = path.join(__dirname, file);
  return new gutil.File({
    path: filepath,
    cwd: __dirname,
    base: path.join(__dirname, path.dirname(file)),
    contents: null
  });
}

var originalRun;

describe('gulp-install', function () {
  beforeEach(function () {
    originalRun = commandRunner.run;
    commandRunner.run = mockRunner();
    process.argv = args;
  });

  afterEach(function () {
    commandRunner.run = originalRun;
  });

  it('should run `npm install` if stream contains `package.json`', function (done) {
    var file = fixture('package.json');

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install']);
      done();
    });

    stream.write(file);

    stream.end();
  });

  it('should run `npm install --production` if stream contains `package.json` and `production` option is set', function (done) {
    var file = fixture('package.json');

    var stream = install({production:true});

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install', '--production']);
      done();
    });

    stream.write(file);

    stream.end();
  });

  it('should run `npm install --ignore-scripts` if stream contains `package.json` and `ignoreScripts` option is set', function (done) {
    var file = fixture('package.json');

    var stream = install({ignoreScripts:true});

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install', '--ignore-scripts']);
      done();
    });

    stream.write(file);

    stream.end();
  });

  it('should run `bower install --config.interactive=false` if stream contains `bower.json`', function (done) {
    var file = fixture('bower.json');

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('bower');
      commandRunner.run.commands[0].args.should.eql(['install', '--config.interactive=false']);
      done();
    });

    stream.write(file);

    stream.end();

  });

   it('should run `bower install --production --config.interactive=false` if stream contains `bower.json`', function (done) {
    var file = fixture('bower.json');

    var stream = install({production:true});

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('bower');
      commandRunner.run.commands[0].args.should.eql(['install', '--config.interactive=false', '--production']);
      done();
    });

    stream.write(file);

    stream.end();

  });

  it('should run both `npm install` and `bower install --config.interactive=false` if stream contains both `package.json` and `bower.json`', function (done) {
    var files = [
      fixture('package.json'),
      fixture('bower.json')
    ];

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(2);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install']);
      commandRunner.run.commands[1].cmd.should.equal('bower');
      commandRunner.run.commands[1].args.should.eql(['install', '--config.interactive=false']);
      done();
    });

    files.forEach(function (file) {
      stream.write(file);
    });

    stream.end();
  });

  it('should run both `npm install --production` and `bower install --production --config.interactive=false` if stream contains both `package.json` and `bower.json`', function (done) {
    var files = [
      fixture('package.json'),
      fixture('bower.json')
    ];

    var stream = install({production:true});

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(2);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install', '--production']);
      commandRunner.run.commands[1].cmd.should.equal('bower');
      commandRunner.run.commands[1].args.should.eql(['install', '--config.interactive=false', '--production']);
      done();
    });

    files.forEach(function (file) {
      stream.write(file);
    });

    stream.end();
  });

  it('should run both `bower install --allow-root --config.interactive=false` if stream contains `bower.json`', function (done) {
    var files = [
      fixture('bower.json')
    ];

    var stream = install({allowRoot:true});

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('bower');
      commandRunner.run.commands[0].args.should.eql(['install', '--config.interactive=false', '--allow-root']);
      done();
    });

    files.forEach(function (file) {
      stream.write(file);
    });

    stream.end();
  });

  it('should run `tsd reinstall --save` if stream contains `tsd.json`', function (done) {
    var file = fixture('tsd.json');

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('tsd');
      commandRunner.run.commands[0].args.should.eql(['reinstall', '--save']);
      done();
    });

    stream.write(file);

    stream.end();

  });

  it('should run `pip install -r requirements.txt` if stream contains `requirements.txt`', function (done) {
    var file = fixture('requirements.txt');

    var stream = install();

    stream.on('error', function (err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('pip');
      commandRunner.run.commands[0].args.should.eql(['install', '-r', 'requirements.txt']);
      done();
    });

    stream.write(file);

    stream.end();

  });

  it('should not run any installs when `--skip-install` CLI option is provided', function (done) {
    var newArgs = args.slice();
    newArgs.push('--skip-install');
    process.argv = newArgs;

    var files = [
      fixture('tsd.json'),
      fixture('package.json'),
      fixture('bower.json')
    ];

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(0);
      done();
    });

    files.forEach(function (file) {
      stream.write(file);
    });

    stream.end();
  });

  it('should set `cwd` correctly to be able to run the same command in multiple folders', function (done) {
    var files = [
      fixture('dir1/package.json'),
      fixture('dir2/package.json')
    ];

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(2);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install']);
      commandRunner.run.commands[0].cwd.should.equal(path.join(__dirname, 'dir1'));
      commandRunner.run.commands[1].cmd.should.equal('npm');
      commandRunner.run.commands[1].args.should.eql(['install']);
      commandRunner.run.commands[1].cwd.should.equal(path.join(__dirname, 'dir2'));
      done();
    });

    files.forEach(function (file) {
      stream.write(file);
    });

    stream.end();
  });
});

function mockRunner () {
  var mock = function mock (cmd, cb) {
    mock.called += 1;
    mock.commands.push(cmd);
    cb();
  };
  mock.called = 0;
  mock.commands = [];
  return mock;
}
<commit_msg>add --allow-root flag<commit_after>/* jshint camelcase: false, strict: false */
/* global describe, beforeEach, it */

var chai = require('chai'),
    should = chai.should(),
    util = require('util'),
    gutil = require('gulp-util'),
    path = require('path'),
    commandRunner = require('../lib/commandRunner'),
    install = require('../.'),
    args = process.argv.slice();

function fixture (file) {
  var filepath = path.join(__dirname, file);
  return new gutil.File({
    path: filepath,
    cwd: __dirname,
    base: path.join(__dirname, path.dirname(file)),
    contents: null
  });
}

var originalRun;

describe('gulp-install', function () {
  beforeEach(function () {
    originalRun = commandRunner.run;
    commandRunner.run = mockRunner();
    process.argv = args;
  });

  afterEach(function () {
    commandRunner.run = originalRun;
  });

  it('should run `npm install` if stream contains `package.json`', function (done) {
    var file = fixture('package.json');

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install']);
      done();
    });

    stream.write(file);

    stream.end();
  });

  it('should run `npm install --production` if stream contains `package.json` and `production` option is set', function (done) {
    var file = fixture('package.json');

    var stream = install({production:true});

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install', '--production']);
      done();
    });

    stream.write(file);

    stream.end();
  });

  it('should run `npm install --ignore-scripts` if stream contains `package.json` and `ignoreScripts` option is set', function (done) {
    var file = fixture('package.json');

    var stream = install({ignoreScripts:true});

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install', '--ignore-scripts']);
      done();
    });

    stream.write(file);

    stream.end();
  });

  it('should run `bower install --config.interactive=false` if stream contains `bower.json`', function (done) {
    var file = fixture('bower.json');

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('bower');
      commandRunner.run.commands[0].args.should.eql(['install', '--config.interactive=false']);
      done();
    });

    stream.write(file);

    stream.end();

  });

   it('should run `bower install --production --config.interactive=false` if stream contains `bower.json`', function (done) {
    var file = fixture('bower.json');

    var stream = install({production:true});

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('bower');
      commandRunner.run.commands[0].args.should.eql(['install', '--config.interactive=false', '--production']);
      done();
    });

    stream.write(file);

    stream.end();

  });

  it('should run both `npm install` and `bower install --config.interactive=false` if stream contains both `package.json` and `bower.json`', function (done) {
    var files = [
      fixture('package.json'),
      fixture('bower.json')
    ];

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(2);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install']);
      commandRunner.run.commands[1].cmd.should.equal('bower');
      commandRunner.run.commands[1].args.should.eql(['install', '--config.interactive=false']);
      done();
    });

    files.forEach(function (file) {
      stream.write(file);
    });

    stream.end();
  });

  it('should run both `npm install --production` and `bower install --production --config.interactive=false` if stream contains both `package.json` and `bower.json`', function (done) {
    var files = [
      fixture('package.json'),
      fixture('bower.json')
    ];

    var stream = install({production:true});

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(2);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install', '--production']);
      commandRunner.run.commands[1].cmd.should.equal('bower');
      commandRunner.run.commands[1].args.should.eql(['install', '--config.interactive=false', '--production']);
      done();
    });

    files.forEach(function (file) {
      stream.write(file);
    });

    stream.end();
  });

  it('should run `bower install --allow-root --config.interactive=false` if stream contains `bower.json`', function (done) {
    var files = [
      fixture('bower.json')
    ];

    var stream = install({allowRoot:true});

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('bower');
      commandRunner.run.commands[0].args.should.eql(['install', '--config.interactive=false', '--allow-root']);
      done();
    });

    files.forEach(function (file) {
      stream.write(file);
    });

    stream.end();
  });

  it('should run `tsd reinstall --save` if stream contains `tsd.json`', function (done) {
    var file = fixture('tsd.json');

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('tsd');
      commandRunner.run.commands[0].args.should.eql(['reinstall', '--save']);
      done();
    });

    stream.write(file);

    stream.end();

  });

  it('should run `pip install -r requirements.txt` if stream contains `requirements.txt`', function (done) {
    var file = fixture('requirements.txt');

    var stream = install();

    stream.on('error', function (err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(1);
      commandRunner.run.commands[0].cmd.should.equal('pip');
      commandRunner.run.commands[0].args.should.eql(['install', '-r', 'requirements.txt']);
      done();
    });

    stream.write(file);

    stream.end();

  });

  it('should not run any installs when `--skip-install` CLI option is provided', function (done) {
    var newArgs = args.slice();
    newArgs.push('--skip-install');
    process.argv = newArgs;

    var files = [
      fixture('tsd.json'),
      fixture('package.json'),
      fixture('bower.json')
    ];

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(0);
      done();
    });

    files.forEach(function (file) {
      stream.write(file);
    });

    stream.end();
  });

  it('should set `cwd` correctly to be able to run the same command in multiple folders', function (done) {
    var files = [
      fixture('dir1/package.json'),
      fixture('dir2/package.json')
    ];

    var stream = install();

    stream.on('error', function(err) {
      should.exist(err);
      done(err);
    });

    stream.on('data', function () {
    });

    stream.on('end', function () {
      commandRunner.run.called.should.equal(2);
      commandRunner.run.commands[0].cmd.should.equal('npm');
      commandRunner.run.commands[0].args.should.eql(['install']);
      commandRunner.run.commands[0].cwd.should.equal(path.join(__dirname, 'dir1'));
      commandRunner.run.commands[1].cmd.should.equal('npm');
      commandRunner.run.commands[1].args.should.eql(['install']);
      commandRunner.run.commands[1].cwd.should.equal(path.join(__dirname, 'dir2'));
      done();
    });

    files.forEach(function (file) {
      stream.write(file);
    });

    stream.end();
  });
});

function mockRunner () {
  var mock = function mock (cmd, cb) {
    mock.called += 1;
    mock.commands.push(cmd);
    cb();
  };
  mock.called = 0;
  mock.commands = [];
  return mock;
}
<|endoftext|>


<commit_before>var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
e)).finalize(b)}}});var n=d.algo={};return d}(Math);
(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
l)}})();
CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();

export default function decrypt(url,decryptKey) {
  var data = CryptoJS.enc.Base64.parse(url).toString(CryptoJS.enc.Hex)
  var key = CryptoJS.enc.Utf8.parse(decryptKey)
  var iv = CryptoJS.enc.Hex.parse(data.substr(0,32))
  var message = CryptoJS.enc.Hex.parse(data.substr(32))

  var options = {
      iv:iv,
      mode:CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
  }

  var params = CryptoJS.lib.CipherParams.create({ciphertext:message})
  var decryptedMessage = CryptoJS.AES.decrypt(params,key,options)
  return decryptedMessage.toString(CryptoJS.enc.Utf8)
}
<commit_msg>Reformat URL decryption to comply with ES6<commit_after>const CryptoJS = require('crypto-js');

export default function decrypt(url, decryptKey) {
  const data = CryptoJS.enc.Base64.parse(url).toString(CryptoJS.enc.Hex)
  const key = CryptoJS.enc.Utf8.parse(decryptKey)
  const iv = CryptoJS.enc.Hex.parse(data.substr(0,32))
  const message = CryptoJS.enc.Hex.parse(data.substr(32))

  const options = {
    iv:iv,
    mode:CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  }

  const params = CryptoJS.lib.CipherParams.create({ciphertext:message})
  const decryptedMessage = CryptoJS.AES.decrypt(params,key,options)
  return decryptedMessage.toString(CryptoJS.enc.Utf8)
}
<|endoftext|>


<commit_before>//测试分界符号指定 可使用命令行直接运行
var path = require('path');
var Sdopx = require("../../push/sdopx").Sdopx;
//Sdopx.create_runfile=true; //输出编译后的文件

//设置模板路径
Sdopx.view_paths = path.join(__dirname, '../views/');
//更改分解符号
Sdopx.left_delimiter = '{@';
Sdopx.rigth_delimiter = '@}';

var opx = new Sdopx();
//注册变量 简单的变量 (非数组/对象)
opx.assign('foo1', 'hello sdopx');
opx.assign('foo', 'bar');
opx.assign('name', 'Albert');
var outhtml = opx.display('delimiter');
console.log(outhtml);<commit_msg>修复拼写错误<commit_after>//测试分界符号指定 可使用命令行直接运行
var path = require('path');
var Sdopx = require("../../push/sdopx").Sdopx;
//Sdopx.create_runfile=true; //输出编译后的文件

//设置模板路径
Sdopx.view_paths = path.join(__dirname, '../views/');
//更改分解符号
Sdopx.left_delimiter = '{@';
Sdopx.right_delimiter = '@}';

var opx = new Sdopx();
//注册变量 简单的变量 (非数组/对象)
opx.assign('foo1', 'hello sdopx');
opx.assign('foo', 'bar');
opx.assign('name', 'Albert');
var outhtml = opx.display('delimiter');
console.log(outhtml);<|endoftext|>


<commit_before>(function(){
  var loaded = false;
  var open = true;

  eventPageMessage = function (type, data) {
    return {
      type: type,
      data: data
    };
  };

  chrome.runtime.onMessage.addListener( function(message,sender,sendResponse) {
    //console.log("CS: received message",message);
    if (loaded && message.message === "toggle" ) {
      //console.log("CS:toggling");
      document.querySelector('content-push').setAttribute("toggle", open);
      open = !open;
    }
  });

  var port = chrome.runtime.connect({name: "ContentPushChannel"});

  port.onMessage.addListener(function (message) {
    console.log(message);
    switch(message.message) {
      case "keywordlist":
        var event = new CustomEvent("keywordlist", {
                      detail: message.data,
                      bubbles: true,
                      cancelable: true
                    });

        var keywords = message.data;
        //console.log('length:'+ Object.keys(keywords).length);
        for (var i in keywords) {
           console.log(keywords[i].text);
        }

        document.dispatchEvent(event);
        break;
      default:
        console.log("Unknown message from event page");
    }
  });

  //Do this immediately when script is injected
  rehostPage();

  function rehostPage() {
    // create and open panel
    var currentTabUrl=document.URL;
    var extensionUrl=chrome.extension.getURL("");
    var indexUrl=chrome.extension.getURL("index.html");

    // remove document content and add new head and body
    document.removeChild(document.documentElement);
    var html = document.createElement('html');
    var head = document.createElement('head');
    var body = document.createElement('body');
    html.appendChild(head);
    html.appendChild(body);
    document.appendChild(html);

    /*Add new link/import element to head
      to load the index.html content */
    var link = document.createElement('link');
    link.rel = 'import';
    link.href = indexUrl;
    link.onload = function(e) {
      // copy head and body from import into main document
      var link = document.querySelector('link[rel="import"]');
      var content = link.import;

      // Grab DOM from warning.html's document.
      var head = content.querySelector('head');
      var body = content.querySelector('body');

      document.head.innerHTML=
        '<base href="'+extensionUrl+'">\n'+
        head.innerHTML;
      document.body.innerHTML=body.innerHTML;

      // set iframe url in <content-push> element
      var cp = document.querySelector('content-push');
      cp.setAttribute("iframeurl", currentTabUrl);

      cp.addEventListener('lineadd', function (e) {
        port.postMessage(eventPageMessage('lineadd', e.detail));
      });

      cp.addEventListener('resetextractor', function (e) {
        port.postMessage(eventPageMessage('resetextractor', e.detail));
      });

      cp.addEventListener('getkeywords', function (e) {
        port.postMessage(eventPageMessage('getkeywords', e.detail));
      });

    };

    link.onerror = function(e) { console.log("got link error"); };
    document.head.appendChild(link);

    //send results back to event page
    //console.log("CS: sending done response");
    loaded = true;
  }
})();
<commit_msg>rehostPage: Remove obsolete console messages.<commit_after>(function(){
  var loaded = false;
  var open = true;

  eventPageMessage = function (type, data) {
    return {
      type: type,
      data: data
    };
  };

  chrome.runtime.onMessage.addListener( function(message,sender,sendResponse) {
    //console.log("CS: received message",message);
    if (loaded && message.message === "toggle" ) {
      //console.log("CS:toggling");
      document.querySelector('content-push').setAttribute("toggle", open);
      open = !open;
    }
  });

  var port = chrome.runtime.connect({name: "ContentPushChannel"});

  port.onMessage.addListener(function (message) {
    switch(message.message) {
      case "keywordlist":
        var event = new CustomEvent("keywordlist", {
                      detail: message.data,
                      bubbles: true,
                      cancelable: true
                    });

        document.dispatchEvent(event);
        break;
      default:
        console.log("Unknown message from event page");
    }
  });

  //Do this immediately when script is injected
  rehostPage();

  function rehostPage() {
    // create and open panel
    var currentTabUrl=document.URL;
    var extensionUrl=chrome.extension.getURL("");
    var indexUrl=chrome.extension.getURL("index.html");

    // remove document content and add new head and body
    document.removeChild(document.documentElement);
    var html = document.createElement('html');
    var head = document.createElement('head');
    var body = document.createElement('body');
    html.appendChild(head);
    html.appendChild(body);
    document.appendChild(html);

    /*Add new link/import element to head
      to load the index.html content */
    var link = document.createElement('link');
    link.rel = 'import';
    link.href = indexUrl;
    link.onload = function(e) {
      // copy head and body from import into main document
      var link = document.querySelector('link[rel="import"]');
      var content = link.import;

      // Grab DOM from warning.html's document.
      var head = content.querySelector('head');
      var body = content.querySelector('body');

      document.head.innerHTML=
        '<base href="'+extensionUrl+'">\n'+
        head.innerHTML;
      document.body.innerHTML=body.innerHTML;

      // set iframe url in <content-push> element
      var cp = document.querySelector('content-push');
      cp.setAttribute("iframeurl", currentTabUrl);

      cp.addEventListener('lineadd', function (e) {
        port.postMessage(eventPageMessage('lineadd', e.detail));
      });

      cp.addEventListener('resetextractor', function (e) {
        port.postMessage(eventPageMessage('resetextractor', e.detail));
      });

      cp.addEventListener('getkeywords', function (e) {
        port.postMessage(eventPageMessage('getkeywords', e.detail));
      });

    };

    link.onerror = function(e) { console.log("got link error"); };
    document.head.appendChild(link);

    //send results back to event page
    //console.log("CS: sending done response");
    loaded = true;
  }
})();
<|endoftext|>


<commit_before>'use strict';
/*global SVG, mill, EventBus */

function SVGjsAnim(id)
{
  this.draw = SVG(id)
    .addClass('svg-content')
    .spof();

  this.scene = this.draw
    .group()
    .attr({ id: 'scene' });
  this.sceneHeadings = this.draw
    .group()
    .attr({ id: 'scene-headings' });

  this.origSceneW = 1366;
  this.origSceneH = 700;

  this.draw.viewbox(0, 0, this.origSceneW, this.origSceneH);
  this.draw.attr('preserveAspectRatio', 'xMidYMax meet');
}

SVGjsAnim.prototype.Scene = function() {
  this.scene.click(function(){
    EventBus.dispatch('clicked_Scene');
  });

  EventBus.addEventListener('clicked_Scene', function(){
    var scene = this.scene;
    var headingName = scene.data('active-heading');
    scene.data('active-heading', null);
    if (scene.hasClass('zoom-out')) {
      scene.removeClass('zoom-out');
      scene.animate()
        .transform(new SVG.Matrix);

      console.log(headingName);
      this.headings[headingName]
        .removeClass('action')
        .addClass('zoom-in');
    }
  }, this);

  EventBus.addEventListener('clicked_heading', function(e, headingName, scale, cx, cy){
    var scene = this.scene;
    scene.data('active-heading', headingName);
    var dev = this.headings[headingName];
    if (dev.hasClass('zoom-in')) {
      dev.removeClass('zoom-in')
        .addClass('action');
      scene
        .animate()
        .transform({ scaleX: scale, scaleY: scale, cx: cx, cy: cy })
        .after(function(){
          console.log('zoomed');
          scene.addClass('zoom-out');
        })
      ;
    } else {
      EventBus.dispatch('play_video', this, 'development');
      console.log('play video');
    }
    event.stopPropagation();
  }, this);

  this.scene.add(this.sceneHeadings);
};

SVGjsAnim.prototype.headings = {};

SVGjsAnim.prototype.init = function() {
    var svgjsAnim = mill;
    // @TODO skip if no images to preload
    if (svgjsAnim.preloadedImages) {
        var loadingImage = document.getElementById('anim-loading');
        loadingImage.parentNode.removeChild(loadingImage);
        svgjsAnim.build();
        svgjsAnim.start();
    } else {
        setTimeout(svgjsAnim.init, 100);
    }
};

SVGjsAnim.prototype.build = function() {
    var w = this.origSceneW;
    var h = this.origSceneH;

    this.HeadingsSVG();

    var background = this.draw.use('Background', 'images/master.svg');
    this.scene.add(background);

    var clouds = this.draw.image('images/clouds.svg', w, h);
    this.cloudGroup = this.draw.group().attr({ id: 'cloud-group' })
      .add(clouds)
      .add(clouds.clone().move(-w, 0));
    this.scene.add(this.cloudGroup);
    this.scene.add(this.cloudGroup);

    this.Hoisting();
    this.Development();
    this.Haulage();
    this.Skipping();
    this.Shop();
    this.Stoping();

    var foreground = this.draw.use('Foreground', 'images/master.svg');
    this.scene.add(foreground);

    this.Scene();
};

SVGjsAnim.prototype.start = function()
{
  return this.cloudGroup
    .animate(380000, '-', 0)
    .move(this.origSceneW, 0)
    .loop()
  ;
};
<commit_msg>var name change<commit_after>'use strict';
/*global SVG, mill, EventBus */

function SVGjsAnim(id)
{
  this.draw = SVG(id)
    .addClass('svg-content')
    .spof();

  this.scene = this.draw
    .group()
    .attr({ id: 'scene' });
  this.sceneHeadings = this.draw
    .group()
    .attr({ id: 'scene-headings' });

  this.origSceneW = 1366;
  this.origSceneH = 700;

  this.draw.viewbox(0, 0, this.origSceneW, this.origSceneH);
  this.draw.attr('preserveAspectRatio', 'xMidYMax meet');
}

SVGjsAnim.prototype.Scene = function() {
  this.scene.click(function(){
    EventBus.dispatch('clicked_Scene');
  });

  EventBus.addEventListener('clicked_Scene', function(){
    var scene = this.scene;
    var headingName = scene.data('active-heading');
    scene.data('active-heading', null);
    if (scene.hasClass('zoom-out')) {
      scene.removeClass('zoom-out');
      scene.animate()
        .transform(new SVG.Matrix);

      console.log(headingName);
      this.headings[headingName]
        .removeClass('action')
        .addClass('zoom-in');
    }
  }, this);

  EventBus.addEventListener('clicked_heading', function(e, headingName, scale, cx, cy){
    var scene = this.scene;
    scene.data('active-heading', headingName);
    var head = this.headings[headingName];
    if (head.hasClass('zoom-in')) {
      head.removeClass('zoom-in')
        .addClass('action');
      scene
        .animate()
        .transform({ scaleX: scale, scaleY: scale, cx: cx, cy: cy })
        .after(function(){
          console.log('zoomed');
          scene.addClass('zoom-out');
        })
      ;
    } else {
      EventBus.dispatch('play_video', this, 'development');
      console.log('play video');
    }
    event.stopPropagation();
  }, this);

  this.scene.add(this.sceneHeadings);
};

SVGjsAnim.prototype.headings = {};

SVGjsAnim.prototype.init = function() {
    var svgjsAnim = mill;
    // @TODO skip if no images to preload
    if (svgjsAnim.preloadedImages) {
        var loadingImage = document.getElementById('anim-loading');
        loadingImage.parentNode.removeChild(loadingImage);
        svgjsAnim.build();
        svgjsAnim.start();
    } else {
        setTimeout(svgjsAnim.init, 100);
    }
};

SVGjsAnim.prototype.build = function() {
    var w = this.origSceneW;
    var h = this.origSceneH;

    this.HeadingsSVG();

    var background = this.draw.use('Background', 'images/master.svg');
    this.scene.add(background);

    var clouds = this.draw.image('images/clouds.svg', w, h);
    this.cloudGroup = this.draw.group().attr({ id: 'cloud-group' })
      .add(clouds)
      .add(clouds.clone().move(-w, 0));
    this.scene.add(this.cloudGroup);
    this.scene.add(this.cloudGroup);

    this.Hoisting();
    this.Development();
    this.Haulage();
    this.Skipping();
    this.Shop();
    this.Stoping();

    var foreground = this.draw.use('Foreground', 'images/master.svg');
    this.scene.add(foreground);

    this.Scene();
};

SVGjsAnim.prototype.start = function()
{
  return this.cloudGroup
    .animate(380000, '-', 0)
    .move(this.origSceneW, 0)
    .loop()
  ;
};
<|endoftext|>


<commit_before>function main(argv) {
  new HttpServer({
    'GET': createServlet(StaticServlet),
    'HEAD': createServlet(StaticServlet)
  }).start(process.env.PORT || Number(argv[2]) || DEFAULT_PORT);
}
<commit_msg>Need to revisit deployment<commit_after><|endoftext|>


<commit_before>/* eslint-env node, es6 */

const path = require('path');
const pkg = require('../package.json');

/**
 * The config below is not enough to run Karma.  In addition, we need to add
 * all library files in dependency order.  This could be done with a plugin if
 * Karma supported async plugins (there may be other alternatives as well).  But
 * for now we start Karma with the `tasks/test.js` script.  This script
 * sorts dependencies and adds files to the Karma config below.
 */

module.exports = function(karma) {
  karma.set({
    frameworks: ['mocha'],
    client: {
      runInParent: true
    },
    files: [
      {
        pattern: 'module-global.js',
        watched: false
      }, {
        pattern: path.resolve(__dirname, require.resolve('jquery/dist/jquery.js')),
        watched: false
      }, {
        pattern: path.resolve(__dirname, require.resolve('expect.js/index.js')),
        watched: false
      }, {
        pattern: path.resolve(__dirname, require.resolve('sinon/pkg/sinon.js')),
        watched: false
      }, {
        pattern: path.resolve(__dirname, require.resolve('proj4/dist/proj4.js')),
        watched: false
      }, {
        pattern: path.resolve(__dirname, require.resolve('pixelmatch/index.js')),
        watched: false
      }, {
        pattern: path.resolve(__dirname, './test-extensions.js')
      }, {
        pattern: '**/*.test.js'
      }, {
        pattern: '**/*',
        included: false,
        watched: false
      }
    ],
    proxies: {
      '/rendering/': '/base/rendering/',
      '/spec/': '/base/spec/'
    },
    preprocessors: {
      // source files, that you wanna generate coverage for
      // do not include tests or libraries
      // (these files will be instrumented by Istanbul)
      '../src/**/*.js': ['coverage']
    },
    reporters: ['progress', 'coverage'],
    coverageReporter: {
      reporters: [
        {
          type: 'lcov', // produces HTML output and lcov
          dir: '../coverage/',
          subdir: '.'
        },
        {
          type: 'text-summary' // prints the textual summary to the terminal
        }
      ]
    }
  });

  if (process.env.TRAVIS) {
    const testName = process.env.TRAVIS_PULL_REQUEST ?
      `https://github.com/openlayers/openlayers/pull/${process.env.TRAVIS_PULL_REQUEST}` :
      `${pkg.name}@${pkg.version} (${process.env.TRAVIS_COMMIT})`;

    // see https://wiki.saucelabs.com/display/DOCS/Platform+Configurator
    // for platform and browserName options (Selenium API, node.js code)
    const customLaunchers = {
      SL_Chrome: {
        base: 'SauceLabs',
        browserName: 'chrome'
      },
      SL_Firefox: {
        base: 'SauceLabs',
        browserName: 'firefox'
      // },
      // SL_Edge: {
      //   base: 'SauceLabs',
      //   platform: 'Windows 10',
      //   browserName: 'MicrosoftEdge'
      // },
      // SL_Safari: {
      //   base: 'SauceLabs',
      //   platform: 'macos 10.12',
      //   browserName: 'safari'
      }
    };
    karma.set({
      sauceLabs: {
        testName: testName,
        recordScreenshots: false,
        connectOptions: {
          port: 5757
        },
        startConnect: false,
        tunnelIdentifier: process.env.TRAVIS_JOB_NUMBER,
        username: 'openlayers',
        accessKey: process.env.SAUCE_ACCESS_KEY
      },
      reporters: ['dots', 'saucelabs', 'coverage'],
      captureTimeout: 240000,
      browserNoActivityTimeout: 240000,
      customLaunchers: customLaunchers,
      browsers: Object.keys(customLaunchers),
      coverageReporter: {
        reporters: [
          {
            type: 'lcovonly', // that's enough for coveralls, no HTML
            dir: '../coverage/',
            subdir: '.'
          },
          {
            type: 'text-summary' // prints the textual summary to the terminal
          }
        ]
      }
    });
  } else {
    karma.set({
      browsers: ['Chrome']
    });
  }
};
<commit_msg>Enable Travis tests in Safari<commit_after>/* eslint-env node, es6 */

const path = require('path');
const pkg = require('../package.json');

/**
 * The config below is not enough to run Karma.  In addition, we need to add
 * all library files in dependency order.  This could be done with a plugin if
 * Karma supported async plugins (there may be other alternatives as well).  But
 * for now we start Karma with the `tasks/test.js` script.  This script
 * sorts dependencies and adds files to the Karma config below.
 */

module.exports = function(karma) {
  karma.set({
    frameworks: ['mocha'],
    client: {
      runInParent: true
    },
    files: [
      {
        pattern: 'https://cdn.polyfill.io/v2/polyfill.min.js?features=URL|gated',
        watched: false
      },
      {
        pattern: 'module-global.js',
        watched: false
      }, {
        pattern: path.resolve(__dirname, require.resolve('jquery/dist/jquery.js')),
        watched: false
      }, {
        pattern: path.resolve(__dirname, require.resolve('expect.js/index.js')),
        watched: false
      }, {
        pattern: path.resolve(__dirname, require.resolve('sinon/pkg/sinon.js')),
        watched: false
      }, {
        pattern: path.resolve(__dirname, require.resolve('proj4/dist/proj4.js')),
        watched: false
      }, {
        pattern: path.resolve(__dirname, require.resolve('pixelmatch/index.js')),
        watched: false
      }, {
        pattern: path.resolve(__dirname, './test-extensions.js')
      }, {
        pattern: '**/*.test.js'
      }, {
        pattern: '**/*',
        included: false,
        watched: false
      }
    ],
    proxies: {
      '/rendering/': '/base/rendering/',
      '/spec/': '/base/spec/'
    },
    preprocessors: {
      // source files, that you wanna generate coverage for
      // do not include tests or libraries
      // (these files will be instrumented by Istanbul)
      '../src/**/*.js': ['coverage']
    },
    reporters: ['progress', 'coverage'],
    coverageReporter: {
      reporters: [
        {
          type: 'lcov', // produces HTML output and lcov
          dir: '../coverage/',
          subdir: '.'
        },
        {
          type: 'text-summary' // prints the textual summary to the terminal
        }
      ]
    }
  });

  if (process.env.TRAVIS) {
    const testName = process.env.TRAVIS_PULL_REQUEST ?
      `https://github.com/openlayers/openlayers/pull/${process.env.TRAVIS_PULL_REQUEST}` :
      `${pkg.name}@${pkg.version} (${process.env.TRAVIS_COMMIT})`;

    // see https://wiki.saucelabs.com/display/DOCS/Platform+Configurator
    // for platform and browserName options (Selenium API, node.js code)
    const customLaunchers = {
      SL_Chrome: {
        base: 'SauceLabs',
        browserName: 'chrome'
      },
      SL_Firefox: {
        base: 'SauceLabs',
        browserName: 'firefox'
      },
      // SL_Edge: {
      //   base: 'SauceLabs',
      //   platform: 'Windows 10',
      //   browserName: 'MicrosoftEdge'
      // },
      SL_Safari: {
        base: 'SauceLabs',
        platform: 'macos 10.12',
        browserName: 'safari'
      }
    };
    karma.set({
      sauceLabs: {
        testName: testName,
        recordScreenshots: false,
        connectOptions: {
          port: 5757
        },
        startConnect: false,
        tunnelIdentifier: process.env.TRAVIS_JOB_NUMBER,
        username: 'openlayers',
        accessKey: process.env.SAUCE_ACCESS_KEY
      },
      reporters: ['dots', 'saucelabs', 'coverage'],
      captureTimeout: 240000,
      browserNoActivityTimeout: 240000,
      customLaunchers: customLaunchers,
      browsers: Object.keys(customLaunchers),
      coverageReporter: {
        reporters: [
          {
            type: 'lcovonly', // that's enough for coveralls, no HTML
            dir: '../coverage/',
            subdir: '.'
          },
          {
            type: 'text-summary' // prints the textual summary to the terminal
          }
        ]
      }
    });
  } else {
    karma.set({
      browsers: ['Chrome']
    });
  }
};
<|endoftext|>


<commit_before>var jpgp      = require('../lib/jpgp');
var async     = require('async');
var mongoose  = require('mongoose');
var _         = require('underscore');
var THTEntry  = mongoose.model('THTEntry');
var Amendment = mongoose.model('Amendment');
var PublicKey = mongoose.model('PublicKey');
var Merkle    = mongoose.model('Merkle');
var Vote      = mongoose.model('Vote');

module.exports.get = function (currency) {

  this.submit = function (signedEntry, done) {

    async.waterfall([

      function (callback) {
        if(signedEntry.indexOf('-----BEGIN') == -1){
          callback('Signature not found in given THT entry');
          return;
        }
        callback();
      },

      // Check signature's key ID
      function(callback){
        var sig = signedEntry.substring(signedEntry.indexOf('-----BEGIN'));
        var keyID = jpgp().signature(sig).issuer();
        if(!(keyID && keyID.length == 16)){
          callback('Cannot identify signature issuer`s keyID');
          return;
        }
        callback(null, keyID);
      },

      // Looking for corresponding public key
      function(keyID, callback){
        PublicKey.getTheOne(keyID, function (err, pubkey) {
          callback(null, pubkey);
        });
      },

      // Verify signature
      function(pubkey, callback){
        var entry = new THTEntry();
        async.waterfall([
          function (next){
            entry.parse(signedEntry, next);
          },
          function (entry, next){
            entry.verify(currency, next);
          },
          function (valid, next){
            entry.verifySignature(pubkey.raw, next);
          },
          function (verified, next){
            if(!verified){
              next('Bad signature');
              return;
            }
            if(pubkey.fingerprint != entry.fingerprint){
              next('Fingerprint in THT entry (' + entry.fingerprint + ') does not match signatory (' + pubkey.fingerprint + ')');
              return;
            }
            next();
          },
          function (next){
            THTEntry.find({ fingerprint: pubkey.fingerprint }, next);
          },
          function (entries, next){
            var entryEntity = entry;
            var previousHash = entryEntity.hash;
            if(entries.length > 0){
              // Already existing THT entry
              if(entries[0].sigDate >= entryEntity.sigDate){
                next('Cannot record a previous THT entry');
                return;
              }
              entryEntity = entries[0];
              previousHash = entries[0].hash;
              entry.copyValues(entryEntity);
            }
            entryEntity.fingerprint = pubkey.fingerprint;
            entryEntity.save(function (err) {
              next(err, entryEntity, previousHash);
            });
          },
          function (entry, previousHash, next) {
            Merkle.updateForTHTEntries(previousHash, entry.hash, function (err) {
              next(err, entry);
            });
          }
        ], callback);
      }
    ], done);
  }

  return this;
}<commit_msg>Fix: THT changes were propagated only once<commit_after>var jpgp      = require('../lib/jpgp');
var async     = require('async');
var mongoose  = require('mongoose');
var _         = require('underscore');
var THTEntry  = mongoose.model('THTEntry');
var Amendment = mongoose.model('Amendment');
var PublicKey = mongoose.model('PublicKey');
var Merkle    = mongoose.model('Merkle');
var Vote      = mongoose.model('Vote');

module.exports.get = function (currency) {

  this.submit = function (signedEntry, done) {

    async.waterfall([

      function (callback) {
        if(signedEntry.indexOf('-----BEGIN') == -1){
          callback('Signature not found in given THT entry');
          return;
        }
        callback();
      },

      // Check signature's key ID
      function(callback){
        var sig = signedEntry.substring(signedEntry.indexOf('-----BEGIN'));
        var keyID = jpgp().signature(sig).issuer();
        if(!(keyID && keyID.length == 16)){
          callback('Cannot identify signature issuer`s keyID');
          return;
        }
        callback(null, keyID);
      },

      // Looking for corresponding public key
      function(keyID, callback){
        PublicKey.getTheOne(keyID, function (err, pubkey) {
          callback(null, pubkey);
        });
      },

      // Verify signature
      function(pubkey, callback){
        var entry = new THTEntry();
        async.waterfall([
          function (next){
            entry.parse(signedEntry, next);
          },
          function (entry, next){
            entry.verify(currency, next);
          },
          function (valid, next){
            entry.verifySignature(pubkey.raw, next);
          },
          function (verified, next){
            if(!verified){
              next('Bad signature');
              return;
            }
            if(pubkey.fingerprint != entry.fingerprint){
              next('Fingerprint in THT entry (' + entry.fingerprint + ') does not match signatory (' + pubkey.fingerprint + ')');
              return;
            }
            next();
          },
          function (next){
            THTEntry.find({ fingerprint: pubkey.fingerprint }, next);
          },
          function (entries, next){
            var entryEntity = entry;
            var previousHash = entryEntity.hash;
            if(entries.length > 0){
              // Already existing THT entry
              if(entries[0].sigDate >= entryEntity.sigDate){
                next('Cannot record a previous THT entry');
                return;
              }
              entryEntity = entries[0];
              previousHash = entries[0].hash;
              entry.copyValues(entryEntity);
            }
            entryEntity.propagated = false;
            entryEntity.fingerprint = pubkey.fingerprint;
            entryEntity.save(function (err) {
              next(err, entryEntity, previousHash);
            });
          },
          function (entry, previousHash, next) {
            Merkle.updateForTHTEntries(previousHash, entry.hash, function (err) {
              next(err, entry);
            });
          }
        ], callback);
      }
    ], done);
  }

  return this;
}<|endoftext|>


<commit_before>import webpackConfig from '../webpack.config.babel'

export default function (config) {
  config.set({
    browsers: ['Chrome'],
    singleRun: true,
    frameworks: ['mocha', 'chai'],
    files: ['karma.webpack.js'],
    preprocessors: {
      'karma.webpack.js': ['webpack', 'sourcemap']
    },
    reporters: ['mocha', 'coverage'],
    webpack: {
      ...webpackConfig,
      devtool: 'inline-source-map'
    },
    webpackServer: {
      noInfo: true
    },
    client: {
      mocha: {
        timeout: 60000
      }
    },
    browserNoActivityTimeout: 60000,
    coverageReporter: {
      dir: 'coverage',
      reporters: [
        { type: 'lcov', subdir: '.' }
      ]
    }
  })
}
<commit_msg>Run Chrome with --no-sandbox on Travis<commit_after>import webpackConfig from '../webpack.config.babel'

export default function (config) {
  config.set({
    browsers: [process.env.TRAVIS ? 'ChromeTravis' : 'Chrome'],
    singleRun: true,
    frameworks: ['mocha', 'chai'],
    files: ['karma.webpack.js'],
    preprocessors: {
      'karma.webpack.js': ['webpack', 'sourcemap']
    },
    reporters: ['mocha', 'coverage'],
    webpack: {
      ...webpackConfig,
      devtool: 'inline-source-map'
    },
    webpackServer: {
      noInfo: true
    },
    client: {
      mocha: {
        timeout: 60000
      }
    },
    browserNoActivityTimeout: 60000,
    coverageReporter: {
      dir: 'coverage',
      reporters: [
        { type: 'lcov', subdir: '.' }
      ]
    },
    customLaunchers: {
      ChromeTravis: {
        base: 'Chrome',
        flags: ['--no-sandbox']
      }
    }
  })
}
<|endoftext|>


<commit_before>import firebase from 'app/services/Firebase';
import {
    AppState
} from 'react-native';
import * as ScannedDevicesSelectors from 'app/redux/selectors/ScannedDevicesSelectors';
import * as SetsSelectors from 'app/redux/selectors/SetsSelectors';
import * as ConnectedDeviceStatusSelectors from 'app/redux/selectors/ConnectedDeviceStatusSelectors';
import * as AppStateSelectors from 'app/redux/selectors/AppStateSelectors';
import * as SurveySelectors from 'app/redux/selectors/SurveySelectors';
import DeviceInfo from 'react-native-device-info';

//initial analytics and initial screen

export const setInitialAnalytics = () => {
    const mobileID = DeviceInfo.getUniqueID();
    // set initial user props analytics
    setUserProp('connected_device_id', null);
    setUserProp('mobile_identifier', mobileID);
    setUserProp('device_version', null);
    setCurrentScreen('settings');
};

// User ID

// user ID defaults to the mobile identifier for anonymous users
export const setUserID = (userID=DeviceInfo.getUniqueID()) => {
    firebase.app().analytics().setUserId(userID);
    firebase.fabric.crashlytics().setUserIdentifier(userID);

    console.tron.display({
        name: 'UserID',
        value: userID,
        preview: userID,
        important: true,
        image: 'https://firebase.google.com/_static/images/firebase/touchicon-180.png'
    });
};

// Screens

export const setCurrentScreen = (screen) => {
    firebase.app().analytics().setCurrentScreen(screen);

    console.tron.display({
        name: 'SetScreen',
        value: screen,
        preview: screen,
        important: true,
        image: 'https://firebase.google.com/_static/images/firebase/touchicon-180.png'
    });
};

// User Properties

export const setUserProp = (name, value) => {
    firebase.app().analytics().setUserProperty(name, value);

    console.tron.display({
        name: 'SetUserProp',
        value: value,
        preview: name + " = " + value,
        important: true,
        image: 'https://firebase.google.com/_static/images/firebase/touchicon-180.png'
    });
};

// Log Events
// params must be an object
export const logEvent = (event, params) => {
    firebase.app().analytics().logEvent(event, params);

    console.tron.display({
        name: 'LogEvent',
        value: params,
        preview: event,
        important: true,
        image: 'https://firebase.google.com/_static/images/firebase/touchicon-180.png'
    });
};

export const logEventWithAppState = (event, params, state) => {
    const screenStatus = AppStateSelectors.getScreenStatus(state);
    const currentAppState = AppState.currentState;

    // if (screenStatus === 'active') {
    //     params.is_screen_locked = false;
    // } else {
    //     params.is_screen_locked = true;
    // }

    // if (currentAppState === 'active') {
    //     params.is_app_active = true;
    //     params.is_app_in_background = false;
    //     params.is_app_inactive = false;
    // } else if (currentAppState === 'background') {
    //     params.is_app_active = false;
    //     params.is_app_in_background = true;
    //     params.is_app_inactive = false;
    // } else if (currentAppState === 'inactive') {
    //     params.is_app_active = false;
    //     params.is_app_in_background = true;
    //     params.is_app_inactive = true;
    // }

    let devices = ScannedDevicesSelectors.getScannedDevices(state);
    if (devices.length > 25) {
        devices = devices.slice(0, 25);
    };
    const connectedDeviceStatus = ConnectedDeviceStatusSelectors.getConnectedDeviceStatus(state);
    const isWorkoutEmpty = SetsSelectors.getIsWorkoutEmpty(state);
    const isSurveyVisible = SurveySelectors.getSurveyAvailable(state);

    const scanned_devices = devices.join().replace(/\s|OB|,/g, '');
    params.scanned_devices = scanned_devices;

    params.num_scanned_devices = devices.length;

    // params.is_bluetooth_on = connectedDeviceStatus !== 'BLUETOOTH_OFF';

    params.is_workout_in_progress = !isWorkoutEmpty;

    params.is_survey_visible = isSurveyVisible;

    logEvent(event, params);
};

// ERRORS
// auto adds error to the params
// auto chooses the code from the error if it exists, else defaults to 9001 as it's unknown

const addErrorToParams = (error, params) => {
    // parse error string
    if (error) {
        var errorString = JSON.stringify(error);
    } else {
        var errorString = "";
    }

    // create params
    if (params) {
        params.error = errorString;
    } else {
        params = {error: errorString};
    }

    return params;
};

const getErrorCode = (error) => {
    if (error && error.code) {
        return error.code;
    } else {
        return 9001;
    }
};

const logCrashlyticsError = (code, event, params) => {
    let message = JSON.stringify(params);
    firebase.fabric.crashlytics().setStringValue("error_params", message);
    firebase.fabric.crashlytics().recordError(code, event);
};

export const logError = (error, event, params) => {
    let errorParams = addErrorToParams(error, params);
    let errorCode = getErrorCode(error);
    logCrashlyticsError(errorCode, event, errorParams);
    logEvent(event, errorParams);
};

export const logErrorWithAppState = (error, event, params, state) => {
    let errorParams = addErrorToParams(error, params);
    let errorCode = getErrorCode(error);
    logCrashlyticsError(errorCode, event, errorParams);
    logEventWithAppState(event, errorParams, state);
};
<commit_msg>Ensure error code is an itneger<commit_after>import firebase from 'app/services/Firebase';
import {
    AppState
} from 'react-native';
import * as ScannedDevicesSelectors from 'app/redux/selectors/ScannedDevicesSelectors';
import * as SetsSelectors from 'app/redux/selectors/SetsSelectors';
import * as ConnectedDeviceStatusSelectors from 'app/redux/selectors/ConnectedDeviceStatusSelectors';
import * as AppStateSelectors from 'app/redux/selectors/AppStateSelectors';
import * as SurveySelectors from 'app/redux/selectors/SurveySelectors';
import DeviceInfo from 'react-native-device-info';

//initial analytics and initial screen

export const setInitialAnalytics = () => {
    const mobileID = DeviceInfo.getUniqueID();
    // set initial user props analytics
    setUserProp('connected_device_id', null);
    setUserProp('mobile_identifier', mobileID);
    setUserProp('device_version', null);
    setCurrentScreen('settings');
};

// User ID

// user ID defaults to the mobile identifier for anonymous users
export const setUserID = (userID=DeviceInfo.getUniqueID()) => {
    firebase.app().analytics().setUserId(userID);
    firebase.fabric.crashlytics().setUserIdentifier(userID);

    console.tron.display({
        name: 'UserID',
        value: userID,
        preview: userID,
        important: true,
        image: 'https://firebase.google.com/_static/images/firebase/touchicon-180.png'
    });
};

// Screens

export const setCurrentScreen = (screen) => {
    firebase.app().analytics().setCurrentScreen(screen);

    console.tron.display({
        name: 'SetScreen',
        value: screen,
        preview: screen,
        important: true,
        image: 'https://firebase.google.com/_static/images/firebase/touchicon-180.png'
    });
};

// User Properties

export const setUserProp = (name, value) => {
    firebase.app().analytics().setUserProperty(name, value);

    console.tron.display({
        name: 'SetUserProp',
        value: value,
        preview: name + " = " + value,
        important: true,
        image: 'https://firebase.google.com/_static/images/firebase/touchicon-180.png'
    });
};

// Log Events
// params must be an object
export const logEvent = (event, params) => {
    firebase.app().analytics().logEvent(event, params);

    console.tron.display({
        name: 'LogEvent',
        value: params,
        preview: event,
        important: true,
        image: 'https://firebase.google.com/_static/images/firebase/touchicon-180.png'
    });
};

export const logEventWithAppState = (event, params, state) => {
    const screenStatus = AppStateSelectors.getScreenStatus(state);
    const currentAppState = AppState.currentState;

    // if (screenStatus === 'active') {
    //     params.is_screen_locked = false;
    // } else {
    //     params.is_screen_locked = true;
    // }

    // if (currentAppState === 'active') {
    //     params.is_app_active = true;
    //     params.is_app_in_background = false;
    //     params.is_app_inactive = false;
    // } else if (currentAppState === 'background') {
    //     params.is_app_active = false;
    //     params.is_app_in_background = true;
    //     params.is_app_inactive = false;
    // } else if (currentAppState === 'inactive') {
    //     params.is_app_active = false;
    //     params.is_app_in_background = true;
    //     params.is_app_inactive = true;
    // }

    let devices = ScannedDevicesSelectors.getScannedDevices(state);
    if (devices.length > 25) {
        devices = devices.slice(0, 25);
    };
    const connectedDeviceStatus = ConnectedDeviceStatusSelectors.getConnectedDeviceStatus(state);
    const isWorkoutEmpty = SetsSelectors.getIsWorkoutEmpty(state);
    const isSurveyVisible = SurveySelectors.getSurveyAvailable(state);

    const scanned_devices = devices.join().replace(/\s|OB|,/g, '');
    params.scanned_devices = scanned_devices;

    params.num_scanned_devices = devices.length;

    // params.is_bluetooth_on = connectedDeviceStatus !== 'BLUETOOTH_OFF';

    params.is_workout_in_progress = !isWorkoutEmpty;

    params.is_survey_visible = isSurveyVisible;

    logEvent(event, params);
};

// ERRORS
// auto adds error to the params
// auto chooses the code from the error if it exists, else defaults to 9001 as it's unknown

const addErrorToParams = (error, params) => {
    // parse error string
    if (error) {
        var errorString = JSON.stringify(error);
    } else {
        var errorString = "";
    }

    // create params
    if (params) {
        params.error = errorString;
    } else {
        params = {error: errorString};
    }

    return params;
};

const getErrorCode = (error) => {
    if (error && error.code && !isNaN(error.code)) {
        return error.code;
    } else {
        return 9001;
    }
};

const logCrashlyticsError = (code, event, params) => {
    let message = JSON.stringify(params);
    firebase.fabric.crashlytics().setStringValue("error_params", message);
    firebase.fabric.crashlytics().recordError(code, event);
};

export const logError = (error, event, params) => {
    let errorParams = addErrorToParams(error, params);
    let errorCode = getErrorCode(error);
    logCrashlyticsError(errorCode, event, errorParams);
    logEvent(event, errorParams);
};

export const logErrorWithAppState = (error, event, params, state) => {
    let errorParams = addErrorToParams(error, params);
    let errorCode = getErrorCode(error);
    logCrashlyticsError(errorCode, event, errorParams);
    logEventWithAppState(event, errorParams, state);
};
<|endoftext|>


<commit_before>const serverEndpoints = require('./server')

module.exports = function(config) {
  config.set({
    basePath: '..',
    frameworks: ['mocha', 'chai'],
    client: {
      mocha: {
        ui: 'tdd'
      }
    },
    files: ['dist/fetch.umd.js', 'test/test.js'],
    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless'],
    autoWatch: false,
    singleRun: true,
    concurrency: Infinity,
    customLaunchers: {
      ChromeHeadlessNoSandbox: {
        base: 'ChromeHeadless',
        flags: ['--no-sandbox']
      },
      FirefoxHeadless: {
        base: 'Firefox',
        flags: ['-headless'],
        displayName: 'HeadlessFirefox'
      }
    },
    beforeMiddleware: ['custom'],
    plugins: [
      'karma-*',
      {
        'middleware:custom': ['value', serverEndpoints]
      }
    ]
  })
}
<commit_msg>Load polyfills for testing older browsers<commit_after>const serverEndpoints = require('./server')

module.exports = function(config) {
  config.set({
    basePath: '..',
    frameworks: ['mocha', 'chai'],
    client: {
      mocha: {
        ui: 'tdd'
      }
    },
    files: [
      'node_modules/promise-polyfill/promise.js',
      'node_modules/abortcontroller-polyfill/dist/abortcontroller-polyfill-only.js',
      'node_modules/url-search-params/build/url-search-params.max.js',
      'dist/fetch.umd.js',
      'test/test.js'
    ],
    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    browsers: ['ChromeHeadlessNoSandbox', 'FirefoxHeadless'],
    autoWatch: false,
    singleRun: true,
    concurrency: Infinity,
    customLaunchers: {
      ChromeHeadlessNoSandbox: {
        base: 'ChromeHeadless',
        flags: ['--no-sandbox']
      },
      FirefoxHeadless: {
        base: 'Firefox',
        flags: ['-headless'],
        displayName: 'HeadlessFirefox'
      }
    },
    beforeMiddleware: ['custom'],
    plugins: [
      'karma-*',
      {
        'middleware:custom': ['value', serverEndpoints]
      }
    ]
  })
}
<|endoftext|>


<commit_before>/*
 * @fileOverview Main testing helper lib.
 */
var axios = require('axios');

var schemaFix = require('../fixtures/schema.fix');

var testLib = module.exports = {};

// testLib.KAFKA_SCHEMA_REGISTRY_URL = 'http://schema-registry-confluent.internal.dev.waldo.photos';
// testLib.KAFKA_BROKER_URL = 'broker-1.service.consul:9092,broker-3.service.consul:9092,broker-2.service.consul:9092';

testLib.KAFKA_SCHEMA_REGISTRY_URL = 'http://localhost:8081';
testLib.KAFKA_BROKER_URL = 'localhost:9092';

testLib.topic = schemaFix.name;

// curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
//     --data '{"schema": "{\"name\": \"string\", \"long\": \"long\"}"}' \
//      http://schema-registry-confluent.internal.dev.waldo.photos/subjects/test-thanpolas-Kafka/versions

var testBoot = false;

/**
 * Require from all test scripts, prepares kafka for testing.
 *
 */
testLib.init = function() {
  if (testBoot) {
    return;
  }
  testBoot = true;

  beforeEach(function() {
    var schemaCreateUrl = testLib.KAFKA_SCHEMA_REGISTRY_URL +
      '/subjects/' + testLib.topic + '-value/versions';

    var data = {
      schema: JSON.stringify(schemaFix),
    };
    console.log('DATA:', data);
    return axios({
      url: schemaCreateUrl,
      method: 'post',
      headers: {
        'Content-Type': 'application/vnd.schemaregistry.v1+json',
      },
      data: data,
    })
      .catch(function(err) {
        console.error('Axios SR creation failed:', err);
        throw err;
      });
  });

  // # Register a new version of a schema under the subject "Kafka-value"
  // $ curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \
  //     --data '{"schema": "{\"type\": \"string\"}"}' \
  //      http://localhost:8081/subjects/Kafka-value/versions
  //   {"id":1}
};

/** @type {Object} simple logger */
testLib.log = {
  info: function() {
    let args = Array.prototype.splice.call(arguments, 0);
    console.log('INFO:', args.join(' '));
  },
  error: function() {
    let args = Array.prototype.splice.call(arguments, 0);
    console.log('ERROR:', args.join(' '));
  },
};

/**
 * Have a Cooldown period between tests.
 *
 * @param {number} seconds cooldown in seconds.
 * @return {Function} use is beforeEach().
 */
testLib.cooldown = function(seconds) {
  return function(done) {
    setTimeout(done, seconds);
  };
};
<commit_msg>cleanup testlib and write createSchema helper<commit_after>/*
 * @fileOverview Main testing helper lib.
 */
var axios = require('axios');
var Promise = require('bluebird');

var schemaFix = require('../fixtures/schema.fix');

var testLib = module.exports = {};

testLib.KAFKA_SCHEMA_REGISTRY_URL = 'http://localhost:8081';
testLib.KAFKA_BROKER_URL = 'localhost:9092';

testLib.topic = schemaFix.name;
testLib.topicTwo = schemaFix.name + 'Two';

var testBoot = false;

/**
 * Require from all test scripts, prepares kafka for testing.
 *
 */
testLib.init = function() {
  if (testBoot) {
    return;
  }
  testBoot = true;

  beforeEach(function() {
    return Promise.all([
      testLib.registerSchema(testLib.topic, schemaFix),
      testLib.registerSchema(testLib.topicTwo, schemaFix),
    ]);
  });
};

/**
 * Register a schema on SR.
 *
 * @param {string} The topic.
 * @param {schema} Object The schema to register.
 * @return {Promise} A Promise.
 */
testLib.registerSchema = Promise.method(function(topic, schema) {
  var schemaCreateUrl = testLib.KAFKA_SCHEMA_REGISTRY_URL +
    '/subjects/' + topic + '-value/versions';

  var data = {
    schema: JSON.stringify(schema),
  };
  return axios({
    url: schemaCreateUrl,
    method: 'post',
    headers: {
      'Content-Type': 'application/vnd.schemaregistry.v1+json',
    },
    data: data,
  })
    .catch(function(err) {
      console.error('Axios SR creation failed:', err);
      throw err;
    });
});

/** @type {Object} simple logger */
testLib.log = {
  info: function() {
    let args = Array.prototype.splice.call(arguments, 0);
    console.log('INFO:', args.join(' '));
  },
  error: function() {
    let args = Array.prototype.splice.call(arguments, 0);
    console.log('ERROR:', args.join(' '));
  },
};

/**
 * Have a Cooldown period between tests.
 *
 * @param {number} seconds cooldown in seconds.
 * @return {Function} use is beforeEach().
 */
testLib.cooldown = function(seconds) {
  return function(done) {
    setTimeout(done, seconds);
  };
};
<|endoftext|>