From ca021544931e051d0b9f1ef36e1efeaa5c4b8ae2 Mon Sep 17 00:00:00 2001 From: miller45 <rklein@rosen-group.com> Date: Thu, 6 Jun 2019 14:05:02 +0200 Subject: [PATCH 01/12] added unit test for new lock.file handling removed superflus code --- tests/reporter/util_metadata_test.js | 141 +++++++++++++++++---------- 1 file changed, 90 insertions(+), 51 deletions(-) diff --git a/tests/reporter/util_metadata_test.js b/tests/reporter/util_metadata_test.js index d0cf23b..58568ed 100644 --- a/tests/reporter/util_metadata_test.js +++ b/tests/reporter/util_metadata_test.js @@ -158,6 +158,19 @@ describe('unit tests', () => { }).toThrow(); }); + + it('catches error and logs if mkdirSync throws', () => { + const errorMsg = "fake error"; + const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; + spyOn(fs, 'mkdirSync').and.callFake(() => { + throw new Error(errorMsg); + }); + spyOn(console, 'error').and.stub(); + util.addMetaData({}, fakePath, {}); + expect(console.error).toHaveBeenCalledWith(new Error(errorMsg)); + }); + + }); describe('working scenarios', () => { @@ -211,7 +224,6 @@ describe('unit tests', () => { expect(console.error).not.toHaveBeenCalled(); }); - it('writes contents to target file with preexisting file', () => { const errorMsg = "mock case not expected: "; const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; @@ -262,6 +274,69 @@ describe('unit tests', () => { expect(console.error).not.toHaveBeenCalled(); }); + it('retries when locked and writes contents to target file with preexisting file ', () => { + const errorMsg = "mock case not expected: "; + const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; + + function makeFEXISTErr() { + const errorMsg = `EEXIST: file already exists, mkdir '${fakePath}'`; + let err = new Error(errorMsg); + err.code = "EEXIST"; + return err; + } + + //region mocks + + // for addMetaData + spyOn(fse, "ensureFileSync").and.stub(); + spyOn(fs, "rmdirSync").and.stub(); + let times = 0; + spyOn(fs, "mkdirSync").and.callFake(() => { + times++; + if (times === 1) { + throw makeFEXISTErr(); + } + }); + spyOn(fse, "readJsonSync").and.callFake(() => { + return "[]"; + }); + spyOn(fse, "outputJsonSync").and.stub(); + + spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { + if (fpath.endsWith("combined.json")) { + return true; + } + throw new Error(errorMsg + fpath); + }); + + // for addHTMLReport + spyOn(fse, 'copySync').and.stub(); + spyOn(fs, 'readFileSync').and.returnValue( + function () { + this.toString = function () { + return ""; + }; + } + ); + spyOn(fs, 'createWriteStream').and.returnValue({ + write: jasmine.createSpy('write'), + end: jasmine.createSpy('end') + }); + + // misc + spyOn(console, 'error').and.stub(); + //end region mocks + + const metaData = {}; + const options = { + docName: "report.html", + sortFunction: defaultSortFunction + }; + util.addMetaData(metaData, fakePath, options); + + expect(console.error).not.toHaveBeenCalled(); + }); + }); @@ -287,9 +362,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -299,11 +371,11 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(htmlTemplate); + return Buffer.from(htmlTemplate); }); - spyOn(fs, 'createWriteStream').and.callFake((wfile) => { + spyOn(fs, 'createWriteStream').and.callFake(() => { throw new Error("Weird Error writing file"); }); @@ -342,9 +414,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -354,7 +423,7 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(htmlTemplate); + return Buffer.from(htmlTemplate); }); let htmlContents; @@ -407,9 +476,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -419,7 +485,7 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(htmlTemplate); + return Buffer.from(htmlTemplate); }); let htmlContents; @@ -473,9 +539,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -485,7 +548,7 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(htmlTemplate); + return Buffer.from(htmlTemplate); }); let htmlContents; @@ -544,9 +607,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -556,7 +616,7 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(jsTemplate); + return Buffer.from(jsTemplate); }); let jsContents; @@ -617,9 +677,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -629,7 +686,7 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(jsTemplate); + return Buffer.from(jsTemplate); }); let jsContents; @@ -686,9 +743,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -698,7 +752,7 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(jsTemplate); + return Buffer.from(jsTemplate); }); let jsContents; @@ -733,7 +787,7 @@ describe('unit tests', () => { util.addMetaData(metaData, fakePath, options); expect(console.error).not.toHaveBeenCalled(); - expect(jsContents).not.toContain('<Sort Function Replacement>') + expect(jsContents).not.toContain('<Sort Function Replacement>'); expect(/results\.sort\(/.test(jsContents)).toBeTruthy(); }); //} @@ -756,9 +810,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -768,7 +819,7 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(jsTemplate); + return Buffer.from(jsTemplate); }); let jsContents; @@ -828,9 +879,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -840,7 +888,7 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(jsTemplate); + return Buffer.from(jsTemplate); }); let jsContents; @@ -896,9 +944,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -908,7 +953,7 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(jsTemplate); + return Buffer.from(jsTemplate); }); let jsContents; @@ -976,9 +1021,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -988,7 +1030,7 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(jsTemplate); + return Buffer.from(jsTemplate); }); let jsContents; @@ -1044,9 +1086,6 @@ describe('unit tests', () => { spyOn(fse, "outputJsonSync").and.stub(); spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith(".lock")) { - return false; - } if (fpath.endsWith("combined.json")) { return true; } @@ -1056,7 +1095,7 @@ describe('unit tests', () => { // for addHTMLReport spyOn(fse, 'copySync').and.stub(); spyOn(fs, 'readFileSync').and.callFake(() => { - return new Buffer(jsTemplate); + return Buffer.from(jsTemplate); }); let jsContents; From 89f1b3a5286836e80e27db0c6382587a9035ed05 Mon Sep 17 00:00:00 2001 From: miller45 <rklein@rosen-group.com> Date: Thu, 6 Jun 2019 14:22:04 +0200 Subject: [PATCH 02/12] removed tests for oldversion --- tests/reporter/util_metadata_test.js | 523 ++++++--------------------- 1 file changed, 114 insertions(+), 409 deletions(-) diff --git a/tests/reporter/util_metadata_test.js b/tests/reporter/util_metadata_test.js index 58568ed..8df9601 100644 --- a/tests/reporter/util_metadata_test.js +++ b/tests/reporter/util_metadata_test.js @@ -8,8 +8,6 @@ const defaultSortFunction = (a, b) => { return (a + b) ? 0 : 0; // }; -const oldVersion = false; // upcoming need different handling of replacesments - describe('unit tests', () => { describe('reporter utils', () => { @@ -588,9 +586,6 @@ describe('unit tests', () => { it('replaces results in app.js', () => { let jsTemplate = " var results = [];//'<Results Replacement>'; "; - if (oldVersion) { - jsTemplate = " var results = '<Results Replacement>';"; - } const errorMsg = "mock case not expected: "; const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; @@ -651,80 +646,77 @@ describe('unit tests', () => { }; util.addMetaData(metaData, fakePath, options); expect(console.error).not.toHaveBeenCalled(); - if (oldVersion) { - expect(jsContents.length).toEqual(15475); - } else { - //fs.writeFileSync(dbgFile,jsContents,'utf-8'); - expect(jsContents.length).toEqual(1920); - } + + // fs.writeFileSync(dbgFile,jsContents,'utf-8'); + expect(jsContents.length).toEqual(1920); + }); - if (!oldVersion) { // use ajax not yet implemwented - it('replaces results with [] clientDefaults.useAjax is true in app.js', () => { - const jsTemplate = " var results = [];//'<Results Replacement>'; "; - const errorMsg = "mock case not expected: "; - const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; - - //region mocks - - // for addMetaData - spyOn(fse, "ensureFileSync").and.stub(); - spyOn(fs, "rmdirSync").and.stub(); - spyOn(fs, "mkdirSync").and.stub(); - spyOn(fse, "readJsonSync").and.callFake(() => { - return "[]"; - }); - spyOn(fse, "outputJsonSync").and.stub(); - - spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith("combined.json")) { - return true; - } - throw new Error(errorMsg + fpath); - }); - - // for addHTMLReport - spyOn(fse, 'copySync').and.stub(); - spyOn(fs, 'readFileSync').and.callFake(() => { - return Buffer.from(jsTemplate); - }); - - let jsContents; - spyOn(fs, 'createWriteStream').and.callFake((wfile) => { - if (wfile.endsWith(".js")) { - return { - write: function (txt) { - jsContents = txt; - }, - end: jasmine.createSpy('end') - }; - } + + it('replaces results with [] clientDefaults.useAjax is true in app.js', () => { + const jsTemplate = " var results = [];//'<Results Replacement>'; "; + const errorMsg = "mock case not expected: "; + const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; + + //region mocks + + // for addMetaData + spyOn(fse, "ensureFileSync").and.stub(); + spyOn(fs, "rmdirSync").and.stub(); + spyOn(fs, "mkdirSync").and.stub(); + spyOn(fse, "readJsonSync").and.callFake(() => { + return "[]"; + }); + spyOn(fse, "outputJsonSync").and.stub(); + + spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { + if (fpath.endsWith("combined.json")) { + return true; + } + throw new Error(errorMsg + fpath); + }); + + // for addHTMLReport + spyOn(fse, 'copySync').and.stub(); + spyOn(fs, 'readFileSync').and.callFake(() => { + return Buffer.from(jsTemplate); + }); + + let jsContents; + spyOn(fs, 'createWriteStream').and.callFake((wfile) => { + if (wfile.endsWith(".js")) { return { - write: jasmine.createSpy('write'), + write: function (txt) { + jsContents = txt; + }, end: jasmine.createSpy('end') }; + } + return { + write: jasmine.createSpy('write'), + end: jasmine.createSpy('end') + }; - }); + }); - // misc - spyOn(console, 'error').and.stub(); - //end region mocks + // misc + spyOn(console, 'error').and.stub(); + //end region mocks - const metaData = testResults[0]; - const options = { - docName: "report.html", - docTitle: "my super fance document title", - sortFunction: defaultSortFunction, - clientDefaults: { - useAjax: true - } - }; - util.addMetaData(metaData, fakePath, options); + const metaData = testResults[0]; + const options = { + docName: "report.html", + docTitle: "my super fance document title", + sortFunction: defaultSortFunction, + clientDefaults: { + useAjax: true + } + }; + util.addMetaData(metaData, fakePath, options); - expect(console.error).not.toHaveBeenCalled(); - expect(jsContents).toEqual(' var results = []; '); - }); - } + expect(console.error).not.toHaveBeenCalled(); + expect(jsContents).toEqual(' var results = []; '); + }); it('replaces sortfunction in app.js', () => { const jsTemplate = " this.results = results.sort(defaultSortFunction/*<Sort Function Replacement>*/); "; @@ -790,361 +782,74 @@ describe('unit tests', () => { expect(jsContents).not.toContain('<Sort Function Replacement>'); expect(/results\.sort\(/.test(jsContents)).toBeTruthy(); }); - //} - - if (!oldVersion) { - it('replaces clientDefaults in app.js', () => { - const jsTemplate = " var clientDefaults = {};//'<Client Defaults Replacement>'; "; - const errorMsg = "mock case not expected: "; - const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; - - //region mocks - - // for addMetaData - spyOn(fse, "ensureFileSync").and.stub(); - spyOn(fs, "rmdirSync").and.stub(); - spyOn(fs, "mkdirSync").and.stub(); - spyOn(fse, "readJsonSync").and.callFake(() => { - return "[]"; - }); - spyOn(fse, "outputJsonSync").and.stub(); - - spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith("combined.json")) { - return true; - } - throw new Error(errorMsg + fpath); - }); - - // for addHTMLReport - spyOn(fse, 'copySync').and.stub(); - spyOn(fs, 'readFileSync').and.callFake(() => { - return Buffer.from(jsTemplate); - }); - - let jsContents; - spyOn(fs, 'createWriteStream').and.callFake((wfile) => { - if (wfile.endsWith(".js")) { - return { - write: function (txt) { - jsContents = txt; - }, - end: jasmine.createSpy('end') - }; - } - return { - write: jasmine.createSpy('write'), - end: jasmine.createSpy('end') - }; - - }); - - // misc - spyOn(console, 'error').and.stub(); - //end region mocks - - const metaData = testResults[0]; - const options = { - docName: "report.html", - docTitle: "my super fance document title", - sortFunction: defaultSortFunction, - clientDefaults: { - searchSettings: {}, - columnSettings: {} - }, - prepareAssets: true - }; - util.addMetaData(metaData, fakePath, options); - - expect(console.error).not.toHaveBeenCalled(); - const jsContentsWoLF = jsContents.replace(/\r\n/g, "").replace(/\n/g, ""); - expect(jsContentsWoLF).toEqual(' var clientDefaults = { "searchSettings": {}, "columnSettings": {}}; '); - }); - } else { - it('replaces columnsettings in app.js with defaults', () => { - const jsTemplate = " var initialColumnSettings = '<Column Settings Replacement>'" + - "; // enable customisation of visible columns on first page hit"; - const errorMsg = "mock case not expected: "; - const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; - - //region mocks - - // for addMetaData - spyOn(fse, "ensureFileSync").and.stub(); - spyOn(fs, "rmdirSync").and.stub(); - spyOn(fs, "mkdirSync").and.stub(); - spyOn(fse, "readJsonSync").and.callFake(() => { - return "[]"; - }); - spyOn(fse, "outputJsonSync").and.stub(); - - spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith("combined.json")) { - return true; - } - throw new Error(errorMsg + fpath); - }); - - // for addHTMLReport - spyOn(fse, 'copySync').and.stub(); - spyOn(fs, 'readFileSync').and.callFake(() => { - return Buffer.from(jsTemplate); - }); - - let jsContents; - spyOn(fs, 'createWriteStream').and.callFake((wfile) => { - if (wfile.endsWith(".js")) { - return { - write: function (txt) { - jsContents = txt; - }, - end: jasmine.createSpy('end') - }; - } - return { - write: jasmine.createSpy('write'), - end: jasmine.createSpy('end') - }; - }); - - // misc - spyOn(console, 'error').and.stub(); - //end region mocks + it('replaces clientDefaults in app.js', () => { + const jsTemplate = " var clientDefaults = {};//'<Client Defaults Replacement>'; "; + const errorMsg = "mock case not expected: "; + const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; - const metaData = testResults[0]; - const options = { - docName: "report.html", - docTitle: "my super fance document title", - sortFunction: defaultSortFunction, - prepareAssets: true - }; - util.addMetaData(metaData, fakePath, options); + //region mocks - expect(console.error).not.toHaveBeenCalled(); - expect(/'<Column Settings Replacement>'/.test(jsContents)).toBeFalsy(); - expect(/=[ ]*undefined/.test(jsContents)).toBeTruthy("columnSettings should be undefined"); + // for addMetaData + spyOn(fse, "ensureFileSync").and.stub(); + spyOn(fs, "rmdirSync").and.stub(); + spyOn(fs, "mkdirSync").and.stub(); + spyOn(fse, "readJsonSync").and.callFake(() => { + return "[]"; }); + spyOn(fse, "outputJsonSync").and.stub(); - it('replaces columnsettings in app.js with options', () => { - const jsTemplate = " var initialColumnSettings = '<Column Settings Replacement>'" + - "; // enable customisation of visible columns on first page hit"; - const errorMsg = "mock case not expected: "; - const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; - - //region mocks - - // for addMetaData - spyOn(fse, "ensureFileSync").and.stub(); - spyOn(fs, "rmdirSync").and.stub(); - spyOn(fs, "mkdirSync").and.stub(); - spyOn(fse, "readJsonSync").and.callFake(() => { - return "[]"; - }); - spyOn(fse, "outputJsonSync").and.stub(); - - spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith("combined.json")) { - return true; - } - throw new Error(errorMsg + fpath); - }); - - // for addHTMLReport - spyOn(fse, 'copySync').and.stub(); - spyOn(fs, 'readFileSync').and.callFake(() => { - return Buffer.from(jsTemplate); - }); - - let jsContents; - spyOn(fs, 'createWriteStream').and.callFake((wfile) => { - if (wfile.endsWith(".js")) { - return { - write: function (txt) { - jsContents = txt; - }, - end: jasmine.createSpy('end') - }; - } - return { - write: jasmine.createSpy('write'), - end: jasmine.createSpy('end') - }; + spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { + if (fpath.endsWith("combined.json")) { + return true; + } + throw new Error(errorMsg + fpath); + }); - }); - - // misc - spyOn(console, 'error').and.stub(); - //end region mocks - - const metaData = testResults[0]; - const options = { - docName: "report.html", - docTitle: "my super fance document title", - sortFunction: defaultSortFunction, - columnSettings: { - displayTime: true, - displayBrowser: false, - displaySessionId: true, - inlineScreenshots: false - }, - prepareAssets: true - }; - util.addMetaData(metaData, fakePath, options); - - expect(console.error).not.toHaveBeenCalled(); - expect(jsContents).toBeDefined(); - expect(/'<Column Settings Replacement>'/.test(jsContents)).toBeFalsy(); - let match = /var initialColumnSettings[ ]*=[ ]*([^;]+);/.exec(jsContents); - expect(match).toBeDefined(); - let extrSettings = match[1]; - expect(extrSettings).toEqual( - '{"displayTime":true,"displayBrowser":false,"displaySessionId":true,"inlineScreenshots":false}' - ); + // for addHTMLReport + spyOn(fse, 'copySync').and.stub(); + spyOn(fs, 'readFileSync').and.callFake(() => { + return Buffer.from(jsTemplate); }); - it('replaces searchSettings in app.js with defaults', () => { - const jsTemplate = "}, '<Search Settings Replacement>'); " + - "// enable customisation of search settings on first page hit"; - const errorMsg = "mock case not expected: "; - const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; - - //region mocks - - // for addMetaData - spyOn(fse, "ensureFileSync").and.stub(); - spyOn(fs, "rmdirSync").and.stub(); - spyOn(fs, "mkdirSync").and.stub(); - spyOn(fse, "readJsonSync").and.callFake(() => { - return "[]"; - }); - spyOn(fse, "outputJsonSync").and.stub(); - - spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith("combined.json")) { - return true; - } - throw new Error(errorMsg + fpath); - }); - - // for addHTMLReport - spyOn(fse, 'copySync').and.stub(); - spyOn(fs, 'readFileSync').and.callFake(() => { - return Buffer.from(jsTemplate); - }); - - let jsContents; - spyOn(fs, 'createWriteStream').and.callFake((wfile) => { - if (wfile.endsWith(".js")) { - return { - write: function (txt) { - jsContents = txt; - }, - end: jasmine.createSpy('end') - }; - } + let jsContents; + spyOn(fs, 'createWriteStream').and.callFake((wfile) => { + if (wfile.endsWith(".js")) { return { - write: jasmine.createSpy('write'), + write: function (txt) { + jsContents = txt; + }, end: jasmine.createSpy('end') }; - - }); - - // misc - spyOn(console, 'error').and.stub(); - //end region mocks - - const metaData = testResults[0]; - const options = { - docName: "report.html", - docTitle: "my super fance document title", - sortFunction: defaultSortFunction, - prepareAssets: true + } + return { + write: jasmine.createSpy('write'), + end: jasmine.createSpy('end') }; - util.addMetaData(metaData, fakePath, options); - expect(console.error).not.toHaveBeenCalled(); - expect(/'<Search Settings Replacement>'/.test(jsContents)).toBeFalsy("placeholders not replaced"); - expect(/\{\}/.test(jsContents)).toBeTruthy("didt not find {} as replacement"); }); - it('replaces searchSettings in app.js with options', () => { - const jsTemplate = "\}, '<Search Settings Replacement>'); " + - "// enable customisation of search settings on first page hit"; - const errorMsg = "mock case not expected: "; - const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; - - //region mocks - - // for addMetaData - spyOn(fse, "ensureFileSync").and.stub(); - spyOn(fs, "rmdirSync").and.stub(); - spyOn(fs, "mkdirSync").and.stub(); - spyOn(fse, "readJsonSync").and.callFake(() => { - return "[]"; - }); - spyOn(fse, "outputJsonSync").and.stub(); - - spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { - if (fpath.endsWith("combined.json")) { - return true; - } - throw new Error(errorMsg + fpath); - }); - - // for addHTMLReport - spyOn(fse, 'copySync').and.stub(); - spyOn(fs, 'readFileSync').and.callFake(() => { - return Buffer.from(jsTemplate); - }); - - let jsContents; - spyOn(fs, 'createWriteStream').and.callFake((wfile) => { - if (wfile.endsWith(".js")) { - return { - write: function (txt) { - jsContents = txt; - }, - end: jasmine.createSpy('end') - }; - } - return { - write: jasmine.createSpy('write'), - end: jasmine.createSpy('end') - }; + // misc + spyOn(console, 'error').and.stub(); + //end region mocks - }); - - // misc - spyOn(console, 'error').and.stub(); - //end region mocks - - const metaData = testResults; - const options = { - docName: "report.html", - docTitle: "my super fance document title", - sortFunction: defaultSortFunction, - searchSettings: { - allselected: false, - passed: false, - failed: false, - pending: true, - withLog: true - }, - prepareAssets: true - }; - util.addMetaData(metaData, fakePath, options); - - expect(console.error).not.toHaveBeenCalled(); - expect(/'<Search Settings Replacement>'/.test(jsContents)).toBeFalsy("placeholders not replaced"); - let match = /\}[ ]*,[ ]*([^;]+);/.exec(jsContents); - expect(match).toBeDefined(); - let extrSettings = match[1]; - expect(extrSettings).toEqual( - '{"allselected":false,"passed":false,"failed":false,"pending":true,"withLog":true})' - ); - }); - } + const metaData = testResults[0]; + const options = { + docName: "report.html", + docTitle: "my super fance document title", + sortFunction: defaultSortFunction, + clientDefaults: { + searchSettings: {}, + columnSettings: {} + }, + prepareAssets: true + }; + util.addMetaData(metaData, fakePath, options); + + expect(console.error).not.toHaveBeenCalled(); + const jsContentsWoLF = jsContents.replace(/\r\n/g, "").replace(/\n/g, ""); + expect(jsContentsWoLF).toEqual(' var clientDefaults = { "searchSettings": {}, "columnSettings": {}}; '); + }); }); }); From 0671c3978f0b16a90319afaaadf154f6b30909a5 Mon Sep 17 00:00:00 2001 From: miller45 <rklein@rosen-group.com> Date: Thu, 6 Jun 2019 14:39:01 +0200 Subject: [PATCH 03/12] add tests for css inline option --- tests/reporter/util_metadata_test.js | 63 ++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/tests/reporter/util_metadata_test.js b/tests/reporter/util_metadata_test.js index 8df9601..9b51a75 100644 --- a/tests/reporter/util_metadata_test.js +++ b/tests/reporter/util_metadata_test.js @@ -850,6 +850,69 @@ describe('unit tests', () => { const jsContentsWoLF = jsContents.replace(/\r\n/g, "").replace(/\n/g, ""); expect(jsContentsWoLF).toEqual(' var clientDefaults = { "searchSettings": {}, "columnSettings": {}}; '); }); + + it('adds customCssInline if configured so', () => { + const htmlTemplate = '<!-- Here will be CSS placed -->'; + const errorMsg = "mock case not expected: "; + const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir"; + + //region mocks + + // for addMetaData + spyOn(fse, "ensureFileSync").and.stub(); + spyOn(fs, "rmdirSync").and.stub(); + spyOn(fs, "mkdirSync").and.stub(); + spyOn(fse, "readJsonSync").and.callFake(() => { + return "[]"; + }); + spyOn(fse, "outputJsonSync").and.stub(); + + spyOn(fse, 'pathExistsSync').and.callFake((fpath) => { + if (fpath.endsWith("combined.json")) { + return true; + } + throw new Error(errorMsg + fpath); + }); + + // for addHTMLReport + spyOn(fse, 'copySync').and.stub(); + spyOn(fs, 'readFileSync').and.callFake(() => { + return Buffer.from(htmlTemplate); + }); + + let htmlContents; + spyOn(fs, 'createWriteStream').and.callFake((wfile) => { + if (wfile.endsWith(".html")) { + return { + write: function (txt) { + htmlContents = txt; + }, + end: jasmine.createSpy('end') + }; + } + return { + write: jasmine.createSpy('write'), + end: jasmine.createSpy('end') + }; + + }); + + // misc + spyOn(console, 'error').and.stub(); + //end region mocks + + const metaData = {}; + const options = { + docName: "report.html", + sortFunction: defaultSortFunction, + customCssInline: ".myspecial-custom-class { font-face: bold; }", + prepareAssets: true + }; + util.addMetaData(metaData, fakePath, options); + + expect(console.error).not.toHaveBeenCalled(); + expect(htmlContents).toEqual('<link rel="stylesheet" href="assets/bootstrap.css"> <style type="text/css">.myspecial-custom-class { font-face: bold; }</style>'); + }); }); }); From 75397064fa93a92d48773be30276b867f2677d17 Mon Sep 17 00:00:00 2001 From: Ramon Klein <gmse45forse@googlemail.com> Date: Tue, 11 Jun 2019 23:36:13 +0200 Subject: [PATCH 04/12] Update README.md --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 56f3543..9121655 100644 --- a/README.md +++ b/README.md @@ -279,6 +279,17 @@ Default is `report.html`. , cssOverrideFile: 'css/style.css' }); ``` + + ### Option to add inline CSS in reporter (optional) + If you want to tweak some details you can add/overide css rules into the page. + + This example will make the image/browserlogs modal window to occupy more screen real-estate + ```javascript + new HtmlReporter({ + baseDirectory: 'tmp/screenshots' + , customCssInline: `.modal-lg { width: 88% }`, + }); + ``` ### Preserve base directory (optional) You can preserve (or clear) the base directory using `preserveDirectory:` option: From fb91b3dfa3c89a80c3ffeefbaf2d70aaec2a012a Mon Sep 17 00:00:00 2001 From: Maurice Matuschek <maurice.matuschek@hec.de> Date: Wed, 12 Jun 2019 13:51:51 +0200 Subject: [PATCH 05/12] First update to take multiple screenshots --- app/reporter.js | 5 +- examples/protractor.jasmine2.conf.js | 47 ++- index.js | 132 ++++---- lib/assets/bootstrap.css | 7 +- lib/assets/main.css | 11 +- lib/index.html | 452 +++++++++++++++------------ 6 files changed, 393 insertions(+), 261 deletions(-) diff --git a/app/reporter.js b/app/reporter.js index de7c72b..7dd4696 100644 --- a/app/reporter.js +++ b/app/reporter.js @@ -175,6 +175,7 @@ function ScreenshotReporter(options) { this.pathBuilder = options.pathBuilder || defaultPathBuilder; this.docTitle = options.docTitle || 'Test Results'; this.docName = options.docName || 'report.html'; + this.screenshotArray = options.screenshotArray || []; this.metaDataBuilder = options.metaDataBuilder || defaultMetaDataBuilder; this.jasmine2MetaDataBuilder = options.jasmine2MetaDataBuilder || jasmine2MetaDataBuilder; this.sortFunction = options.sortFunction || sortFunction; @@ -342,7 +343,9 @@ class Jasmine2Reporter { let considerScreenshot = !(this._screenshotReporter.takeScreenShotsOnlyForFailedSpecs && result.status === 'passed') if (considerScreenshot) { - metaData.screenShotFile = path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName); + this._screenshotReporter.screenshotArray.push(path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName)); + metaData.screenShotFile = [...this._screenshotReporter.screenshotArray]; + this._screenshotReporter.screenshotArray.length = 0; } if (result.browserLogs) { diff --git a/examples/protractor.jasmine2.conf.js b/examples/protractor.jasmine2.conf.js index 7306ab7..56b8bfe 100644 --- a/examples/protractor.jasmine2.conf.js +++ b/examples/protractor.jasmine2.conf.js @@ -1,5 +1,8 @@ var HtmlReporter = require('protractor-beautiful-reporter'); -var path = require('path'); +var util = require('../app/util'), + _ = require('underscore'), + path = require('path'); + // ----- Config example for Jasmine 2 ----- @@ -84,7 +87,7 @@ exports.config = { onPrepare: function () { // Add a screenshot reporter: - jasmine.getEnv().addReporter(new HtmlReporter({ + var reporter = new HtmlReporter({ preserveDirectory: false, takeScreenShotsOnlyForFailedSpecs: true, screenshotsSubfolder: 'images', @@ -108,7 +111,45 @@ exports.config = { // capabilities.get('browserName'), validDescriptions.join('-')); } - }).getJasmine2Reporter()); + }) + jasmine.getEnv().addReporter( + reporter.getJasmine2Reporter() + ); + ExpectFailed(reporter); + function ExpectFailed(rep) { + var originalAddExpectationResult = jasmine.Spec.prototype.addExpectationResult; + jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) { + var self = rep; + + var makeScreenshotsFromEachBrowsers = false; + + if (!passed) { + makeScreenshotsFromEachBrowsers = true; + } + if (makeScreenshotsFromEachBrowsers) { + let tst = util.generateGuid(); + let screenShotFileName = path.basename(tst + '.png'); + let screenShotFilePath = path.join(path.dirname(self.baseName + '.png'), self.screenshotsSubfolder); + let screenShotPath = path.join(self.baseDirectory, screenShotFilePath, screenShotFileName); + self.screenshotArray.push(path.join(self.screenshotsSubfolder, screenShotFileName)); + try { + browser.takeScreenshot().then(png => { + util.storeScreenShot(png, screenShotPath); + }); + } + catch (ex) { + if (ex['name'] === 'NoSuchWindowError') { + console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed'); + } else { + console.error(ex); + console.error('Protractor-beautiful-reporter could not take the screenshot'); + } + metaData.screenShotFile = void 0; + } + } + return originalAddExpectationResult.apply(this, arguments); + } + } }, jasmineNodeOpts: { diff --git a/index.js b/index.js index a40fb41..045bfba 100644 --- a/index.js +++ b/index.js @@ -224,12 +224,6 @@ exports.f = __webpack_require__(7) ? Object.defineProperty : function defineProp /***/ }), /* 9 */ -/***/ (function(module, exports) { - -module.exports = require("path"); - -/***/ }), -/* 10 */ /***/ (function(module, exports, __webpack_require__) { // 7.1.13 ToObject(argument) @@ -239,6 +233,12 @@ module.exports = function (it) { }; +/***/ }), +/* 10 */ +/***/ (function(module, exports) { + +module.exports = require("path"); + /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { @@ -680,7 +680,7 @@ exports.f = __webpack_require__(7) ? gOPD : function getOwnPropertyDescriptor(O, // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) var has = __webpack_require__(17); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var IE_PROTO = __webpack_require__(91)('IE_PROTO'); var ObjectProto = Object.prototype; @@ -741,7 +741,7 @@ module.exports = function (it) { /* 23 */ /***/ (function(module, exports) { -var core = module.exports = { version: '2.6.5' }; +var core = module.exports = { version: '2.6.9' }; if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef @@ -812,7 +812,7 @@ module.exports = function (it) { // 6 -> Array#findIndex var ctx = __webpack_require__(24); var IObject = __webpack_require__(53); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var toLength = __webpack_require__(6); var asc = __webpack_require__(75); module.exports = function (TYPE, $create) { @@ -977,7 +977,7 @@ if (__webpack_require__(7)) { var has = __webpack_require__(17); var classof = __webpack_require__(48); var isObject = __webpack_require__(4); - var toObject = __webpack_require__(10); + var toObject = __webpack_require__(9); var isArrayIter = __webpack_require__(82); var create = __webpack_require__(39); var getPrototypeOf = __webpack_require__(19); @@ -2381,7 +2381,7 @@ module.exports = function (S, index, unicode) { "use strict"; // 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var toAbsoluteIndex = __webpack_require__(45); var toLength = __webpack_require__(6); module.exports = function fill(value /* , start = 0, end = @length */) { @@ -3352,7 +3352,7 @@ module.exports = function (it, msg) { "use strict"; // 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var toAbsoluteIndex = __webpack_require__(45); var toLength = __webpack_require__(6); @@ -3396,7 +3396,7 @@ module.exports = function (iter, ITERATOR) { /***/ (function(module, exports, __webpack_require__) { var aFunction = __webpack_require__(12); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var IObject = __webpack_require__(53); var toLength = __webpack_require__(6); @@ -3901,10 +3901,11 @@ module.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) "use strict"; // 19.1.2.1 Object.assign(target, source, ...) +var DESCRIPTORS = __webpack_require__(7); var getKeys = __webpack_require__(41); var gOPS = __webpack_require__(64); var pIE = __webpack_require__(54); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var IObject = __webpack_require__(53); var $assign = Object.assign; @@ -3930,7 +3931,10 @@ module.exports = !$assign || __webpack_require__(3)(function () { var length = keys.length; var j = 0; var key; - while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key]; + while (length > j) { + key = keys[j++]; + if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key]; + } } return T; } : $assign; @@ -4006,6 +4010,7 @@ module.exports = function (object, names) { /* 122 */ /***/ (function(module, exports, __webpack_require__) { +var DESCRIPTORS = __webpack_require__(7); var getKeys = __webpack_require__(41); var toIObject = __webpack_require__(20); var isEnum = __webpack_require__(54).f; @@ -4017,9 +4022,13 @@ module.exports = function (isEntries) { var i = 0; var result = []; var key; - while (length > i) if (isEnum.call(O, key = keys[i++])) { - result.push(isEntries ? [key, O[key]] : O[key]); - } return result; + while (length > i) { + key = keys[i++]; + if (!DESCRIPTORS || isEnum.call(O, key)) { + result.push(isEntries ? [key, O[key]] : O[key]); + } + } + return result; }; }; @@ -4313,7 +4322,7 @@ module.exports = { // imported from ncp (this is temporary, will rewrite) var fs = __webpack_require__(11) -var path = __webpack_require__(9) +var path = __webpack_require__(10) var utimes = __webpack_require__(370) function ncp (source, dest, options, callback) { @@ -4620,7 +4629,7 @@ exports.exists = function (filename, callback) { "use strict"; -const path = __webpack_require__(9) +const path = __webpack_require__(10) // get drive on windows function getRootPath (p) { @@ -4677,13 +4686,15 @@ module.exports = require("assert"); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var util = __webpack_require__(145), _ = __webpack_require__(375), - path = __webpack_require__(9); + path = __webpack_require__(10); /** Function: defaultPathBuilder * This function builds paths for a screenshot file. It is appended to the @@ -4855,6 +4866,7 @@ function ScreenshotReporter(options) { this.pathBuilder = options.pathBuilder || defaultPathBuilder; this.docTitle = options.docTitle || 'Test Results'; this.docName = options.docName || 'report.html'; + this.screenshotArray = options.screenshotArray || []; this.metaDataBuilder = options.metaDataBuilder || defaultMetaDataBuilder; this.jasmine2MetaDataBuilder = options.jasmine2MetaDataBuilder || jasmine2MetaDataBuilder; this.sortFunction = options.sortFunction || sortFunction; @@ -5173,7 +5185,9 @@ var Jasmine2Reporter = function () { if (considerScreenshot) { - metaData.screenShotFile = path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName); + this._screenshotReporter.screenshotArray.push(path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName)); + metaData.screenShotFile = [].concat(_toConsumableArray(this._screenshotReporter.screenshotArray)); + this._screenshotReporter.screenshotArray.length = 0; } if (result.browserLogs) { @@ -5325,7 +5339,7 @@ define(String.prototype, "padRight", "".padEnd); /***/ (function(module, exports, __webpack_require__) { const fs = __webpack_require__(72); -const path = __webpack_require__(9); +const path = __webpack_require__(10); const crypto = __webpack_require__(377); const CircularJSON = __webpack_require__(147); const fse = __webpack_require__(359); @@ -6717,7 +6731,7 @@ $export($export.P + $export.F * !STRICT, 'Array', { var ctx = __webpack_require__(24); var $export = __webpack_require__(0); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var call = __webpack_require__(113); var isArrayIter = __webpack_require__(82); var toLength = __webpack_require__(6); @@ -6970,7 +6984,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].some, true), 'Array' var $export = __webpack_require__(0); var aFunction = __webpack_require__(12); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var fails = __webpack_require__(3); var $sort = [].sort; var test = [1, 2, 3]; @@ -7030,7 +7044,7 @@ $export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'D "use strict"; var $export = __webpack_require__(0); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var toPrimitive = __webpack_require__(30); $export($export.P + $export.F * __webpack_require__(3)(function () { @@ -7812,7 +7826,7 @@ __webpack_require__(29)('getOwnPropertyNames', function () { /***/ (function(module, exports, __webpack_require__) { // 19.1.2.9 Object.getPrototypeOf(O) -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var $getPrototypeOf = __webpack_require__(19); __webpack_require__(29)('getPrototypeOf', function () { @@ -7878,7 +7892,7 @@ $export($export.S, 'Object', { is: __webpack_require__(128) }); /***/ (function(module, exports, __webpack_require__) { // 19.1.2.14 Object.keys(O) -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var $keys = __webpack_require__(41); __webpack_require__(29)('keys', function () { @@ -8697,7 +8711,7 @@ __webpack_require__(59)('match', 1, function (defined, MATCH, $match, maybeCallN var anObject = __webpack_require__(1); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var toLength = __webpack_require__(6); var toInteger = __webpack_require__(26); var advanceStringIndex = __webpack_require__(73); @@ -9421,12 +9435,14 @@ var enumKeys = __webpack_require__(152); var isArray = __webpack_require__(60); var anObject = __webpack_require__(1); var isObject = __webpack_require__(4); +var toObject = __webpack_require__(9); var toIObject = __webpack_require__(20); var toPrimitive = __webpack_require__(30); var createDesc = __webpack_require__(42); var _create = __webpack_require__(39); var gOPNExt = __webpack_require__(120); var $GOPD = __webpack_require__(18); +var $GOPS = __webpack_require__(64); var $DP = __webpack_require__(8); var $keys = __webpack_require__(41); var gOPD = $GOPD.f; @@ -9443,7 +9459,7 @@ var SymbolRegistry = shared('symbol-registry'); var AllSymbols = shared('symbols'); var OPSymbols = shared('op-symbols'); var ObjectProto = Object[PROTOTYPE]; -var USE_NATIVE = typeof $Symbol == 'function'; +var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f; var QObject = global.QObject; // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; @@ -9553,7 +9569,7 @@ if (!USE_NATIVE) { $DP.f = $defineProperty; __webpack_require__(40).f = gOPNExt.f = $getOwnPropertyNames; __webpack_require__(54).f = $propertyIsEnumerable; - __webpack_require__(64).f = $getOwnPropertySymbols; + $GOPS.f = $getOwnPropertySymbols; if (DESCRIPTORS && !__webpack_require__(34)) { redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); @@ -9604,6 +9620,16 @@ $export($export.S + $export.F * !USE_NATIVE, 'Object', { getOwnPropertySymbols: $getOwnPropertySymbols }); +// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives +// https://bugs.chromium.org/p/v8/issues/detail?id=3443 +var FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); }); + +$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return $GOPS.f(toObject(it)); + } +}); + // 24.3.2 JSON.stringify(value [, replacer [, space]]) $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { var S = $Symbol(); @@ -9830,7 +9856,7 @@ __webpack_require__(58)(WEAK_SET, function (get) { // https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap var $export = __webpack_require__(0); var flattenIntoArray = __webpack_require__(109); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var toLength = __webpack_require__(6); var aFunction = __webpack_require__(12); var arraySpeciesCreate = __webpack_require__(75); @@ -9859,7 +9885,7 @@ __webpack_require__(33)('flatMap'); // https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatten var $export = __webpack_require__(0); var flattenIntoArray = __webpack_require__(109); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var toLength = __webpack_require__(6); var toInteger = __webpack_require__(26); var arraySpeciesCreate = __webpack_require__(75); @@ -10154,7 +10180,7 @@ $export($export.S, 'Math', { "use strict"; var $export = __webpack_require__(0); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var aFunction = __webpack_require__(12); var $defineProperty = __webpack_require__(8); @@ -10173,7 +10199,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', "use strict"; var $export = __webpack_require__(0); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var aFunction = __webpack_require__(12); var $defineProperty = __webpack_require__(8); @@ -10235,7 +10261,7 @@ $export($export.S, 'Object', { "use strict"; var $export = __webpack_require__(0); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var toPrimitive = __webpack_require__(30); var getPrototypeOf = __webpack_require__(19); var getOwnPropertyDescriptor = __webpack_require__(18).f; @@ -10260,7 +10286,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', "use strict"; var $export = __webpack_require__(0); -var toObject = __webpack_require__(10); +var toObject = __webpack_require__(9); var toPrimitive = __webpack_require__(30); var getPrototypeOf = __webpack_require__(19); var getOwnPropertyDescriptor = __webpack_require__(18).f; @@ -11283,7 +11309,7 @@ module.exports = copyFileSync const fs = __webpack_require__(11) -const path = __webpack_require__(9) +const path = __webpack_require__(10) const copyFileSync = __webpack_require__(348) const mkdir = __webpack_require__(21) @@ -11352,7 +11378,7 @@ module.exports = copySync const fs = __webpack_require__(11) -const path = __webpack_require__(9) +const path = __webpack_require__(10) const ncp = __webpack_require__(138) const mkdir = __webpack_require__(21) const pathExists = __webpack_require__(36).pathExists @@ -11424,7 +11450,7 @@ module.exports = { const u = __webpack_require__(16).fromCallback const fs = __webpack_require__(72) -const path = __webpack_require__(9) +const path = __webpack_require__(10) const mkdir = __webpack_require__(21) const remove = __webpack_require__(71) @@ -11478,7 +11504,7 @@ module.exports = { const u = __webpack_require__(16).fromCallback -const path = __webpack_require__(9) +const path = __webpack_require__(10) const fs = __webpack_require__(11) const mkdir = __webpack_require__(21) const pathExists = __webpack_require__(36).pathExists @@ -11561,7 +11587,7 @@ module.exports = { const u = __webpack_require__(16).fromCallback -const path = __webpack_require__(9) +const path = __webpack_require__(10) const fs = __webpack_require__(11) const mkdir = __webpack_require__(21) const pathExists = __webpack_require__(36).pathExists @@ -11628,7 +11654,7 @@ module.exports = { "use strict"; -const path = __webpack_require__(9) +const path = __webpack_require__(10) const fs = __webpack_require__(11) const pathExists = __webpack_require__(36).pathExists @@ -11773,7 +11799,7 @@ module.exports = { const u = __webpack_require__(16).fromCallback -const path = __webpack_require__(9) +const path = __webpack_require__(10) const fs = __webpack_require__(11) const _mkdirs = __webpack_require__(21) const mkdirs = _mkdirs.mkdirs @@ -11898,7 +11924,7 @@ module.exports = jsonFile const fs = __webpack_require__(11) -const path = __webpack_require__(9) +const path = __webpack_require__(10) const mkdir = __webpack_require__(21) const jsonFile = __webpack_require__(100) @@ -11922,7 +11948,7 @@ module.exports = outputJsonSync "use strict"; -const path = __webpack_require__(9) +const path = __webpack_require__(10) const mkdir = __webpack_require__(21) const pathExists = __webpack_require__(36).pathExists const jsonFile = __webpack_require__(100) @@ -11957,7 +11983,7 @@ module.exports = outputJson const fs = __webpack_require__(11) -const path = __webpack_require__(9) +const path = __webpack_require__(10) const invalidWin32Path = __webpack_require__(140).invalidWin32Path const o777 = parseInt('0777', 8) @@ -12023,7 +12049,7 @@ module.exports = mkdirsSync const fs = __webpack_require__(11) -const path = __webpack_require__(9) +const path = __webpack_require__(10) const invalidWin32Path = __webpack_require__(140).invalidWin32Path const o777 = parseInt('0777', 8) @@ -12093,7 +12119,7 @@ module.exports = mkdirs const fs = __webpack_require__(11) -const path = __webpack_require__(9) +const path = __webpack_require__(10) const copySync = __webpack_require__(137).copySync const removeSync = __webpack_require__(71).removeSync const mkdirpSync = __webpack_require__(21).mkdirsSync @@ -12226,7 +12252,7 @@ module.exports = { const u = __webpack_require__(16).fromCallback const fs = __webpack_require__(11) const ncp = __webpack_require__(138) -const path = __webpack_require__(9) +const path = __webpack_require__(10) const remove = __webpack_require__(71).remove const mkdirp = __webpack_require__(21).mkdirs @@ -12388,7 +12414,7 @@ module.exports = { const u = __webpack_require__(16).fromCallback const fs = __webpack_require__(11) -const path = __webpack_require__(9) +const path = __webpack_require__(10) const mkdir = __webpack_require__(21) const pathExists = __webpack_require__(36).pathExists @@ -12434,7 +12460,7 @@ module.exports = { const fs = __webpack_require__(11) -const path = __webpack_require__(9) +const path = __webpack_require__(10) const assert = __webpack_require__(142) const isWindows = (process.platform === 'win32') @@ -12761,7 +12787,7 @@ module.exports = assign const fs = __webpack_require__(11) const os = __webpack_require__(378) -const path = __webpack_require__(9) +const path = __webpack_require__(10) // HFS, ext{2,3}, FAT do not, Node.js v0.10 does not function hasMillisResSync () { diff --git a/lib/assets/bootstrap.css b/lib/assets/bootstrap.css index 8787780..10c262c 100644 --- a/lib/assets/bootstrap.css +++ b/lib/assets/bootstrap.css @@ -1101,12 +1101,13 @@ textarea { line-height: inherit; } a { - color: #2196f3; + color: #666666; text-decoration: none; + text-align: center; } a:hover, a:focus { - color: #0a6ebd; + color: #666666; text-decoration: underline; } a:focus { @@ -2444,7 +2445,7 @@ table th[class*="col-"] { background-color: #f7a6a4; } .table-responsive { - overflow-x: auto; + min-height: 0.01%; } @media screen and (max-width: 767px) { diff --git a/lib/assets/main.css b/lib/assets/main.css index 8f5f36c..7a085a7 100644 --- a/lib/assets/main.css +++ b/lib/assets/main.css @@ -49,6 +49,14 @@ h2 { padding-top: 20px !important; } +.col{ + margin-right: 20%; +} + +.table-responsive{ + margin-top: 3%; +} + .spec { /*background-color: grey;*/ /*color: white;*/ @@ -121,7 +129,8 @@ table { .message { display: block; - white-space: pre-wrap; + /* white-space: pre-wrap; */ + text-align: left; } .message:not(:first-child) { diff --git a/lib/index.html b/lib/index.html index b83d577..0984ada 100644 --- a/lib/index.html +++ b/lib/index.html @@ -1,9 +1,10 @@ <!DOCTYPE html> <html lang="en" ng-app="reportingApp" ng-csp> + <head> <meta charset="UTF-8"> - <title>Protractor Screenshot Report</title> - + <title>Buglist</title> + <link rel="shortcut icon" type="image/x-icon" href="../node_modules/protractor-beautiful-reporter/lib/favicon.ico"> <link rel="stylesheet" href="assets/main.css"> <!-- Here will be CSS placed --> <script src="assets/angular.min.js"></script> @@ -13,225 +14,276 @@ <script src="assets/circular-json.js"></script> </head> + <body ng-controller="ScreenshotReportController as ctrl" class="ng-cloak"> -<!-- Header --> -<h2> - <!-- Here goes title --> - <div class="pull-right"> - <button class="btn btn-default" ng-class="{active: !ctrl.displayTime}" + <!-- Header --> + <h2> + <img src="./assets/assets/logo.svg"> <!-- Here goes title --> + <div class="pull-right"> + <button class="btn btn-default" ng-class="{active: !ctrl.displayTime}" ng-click="ctrl.displayTime = !ctrl.displayTime">TIME - </button> - <button class="btn btn-default" ng-class="{active: !ctrl.displayBrowser}" + </button> + <button class="btn btn-default" ng-class="{active: !ctrl.displayBrowser}" ng-click="ctrl.displayBrowser = !ctrl.displayBrowser">BROWSER - </button> - <button class="btn btn-default" ng-class="{active: !ctrl.displaySessionId}" + </button> + <button class="btn btn-default" ng-class="{active: !ctrl.displaySessionId}" ng-click="ctrl.displaySessionId = !ctrl.displaySessionId">SESSION ID - </button> - <button class="btn btn-default" ng-class="{active: !ctrl.displayOS}" + </button> + <button class="btn btn-default" ng-class="{active: !ctrl.displayOS}" ng-click="ctrl.displayOS = !ctrl.displayOS">OS - </button> - <button class="btn btn-default" ng-class="{active: ctrl.inlineScreenshots}" + </button> + <button class="btn btn-default" ng-class="{active: ctrl.inlineScreenshots}" ng-click="ctrl.inlineScreenshots = !ctrl.inlineScreenshots">INLINE SCREENSHOTS - </button> - </div> -</h2> + </button> + </div> + </h2> -<!-- Pass/Fail counts --> -<div class="progress progress-striped"> - <div class="progress-bar progress-bar-success" ng-if="ctrl.passCount()" data-container="body" data-toggle="tooltip" - title="Passed: {{ctrl.passCount()}} {{(ctrl.failCount() ? '' : '(no failures!)')}}" - ng-style="{'width': ctrl.passPerc() + '%'}"><div class="statusNumber">{{ctrl.passCount()}}</div></div> - <div class="progress-bar progress-bar-warning" ng-if="ctrl.pendingCount()" data-container="body" data-toggle="tooltip" data-placement="{{(ctrl.pendingPerc()<5)?'left':'top'}}" - title="Pending: {{ctrl.pendingCount()}}" - ng-style="{'width': ctrl.pendingPerc() + '%'}"><div class="statusNumber">{{ctrl.pendingCount()}}</div></div> - <div class="progress-bar progress-bar-danger" ng-if="ctrl.failCount()" data-container="body" data-toggle="tooltip" - title="Failed: {{ctrl.failCount()}}" - ng-style="{'width': ctrl.failPerc() + '%'}"><div class="statusNumber">{{ctrl.failCount()}}</div></div> -</div> + <!-- Pass/Fail counts --> + <div class="progress progress-striped"> + <div class="progress-bar progress-bar-success" ng-if="ctrl.passCount()" data-container="body" + data-toggle="tooltip" title="Passed: {{ctrl.passCount()}} {{(ctrl.failCount() ? '' : '(no failures!)')}}" + ng-style="{'width': ctrl.passPerc() + '%'}"> + <div class="statusNumber">{{ctrl.passCount()}}</div> + </div> + <div class="progress-bar progress-bar-warning" ng-if="ctrl.pendingCount()" data-container="body" + data-toggle="tooltip" data-placement="{{(ctrl.pendingPerc()<5)?'left':'top'}}" + title="Pending: {{ctrl.pendingCount()}}" ng-style="{'width': ctrl.pendingPerc() + '%'}"> + <div class="statusNumber">{{ctrl.pendingCount()}}</div> + </div> + <div class="progress-bar progress-bar-danger" ng-if="ctrl.failCount()" data-container="body" + data-toggle="tooltip" title="Failed: {{ctrl.failCount()}}" ng-style="{'width': ctrl.failPerc() + '%'}"> + <div class="statusNumber">{{ctrl.failCount()}}</div> + </div> + </div> -<label>Search: <input ng-model="searchSettings.description"></label> -<div class="pull-right"> - <button class="btn btn-default" ng-class="{active: searchSettings.allselected}" ng-click="ctrl.chooseAllTypes()">ALL</button> - <button class="btn btn-default" ng-class="{active: searchSettings.passed}" + <label>Search: <input ng-model="searchSettings.description"></label> + <div class="pull-right"> + <button class="btn btn-default" ng-class="{active: searchSettings.allselected}" + ng-click="ctrl.chooseAllTypes()">ALL</button> + <button class="btn btn-default" ng-class="{active: searchSettings.passed}" ng-click="searchSettings.passed = !searchSettings.passed">PASSED - </button> - <button class="btn btn-default" ng-class="{active: searchSettings.failed}" + </button> + <button class="btn btn-default" ng-class="{active: searchSettings.failed}" ng-click="searchSettings.failed = !searchSettings.failed">FAILED - </button> - <button class="btn btn-default" ng-class="{active: searchSettings.pending}" + </button> + <button class="btn btn-default" ng-class="{active: searchSettings.pending}" ng-click="searchSettings.pending = !searchSettings.pending">PENDING - </button> - <button class="btn btn-default" ng-class="{active: searchSettings.withLog}" + </button> + <button class="btn btn-default" ng-class="{active: searchSettings.withLog}" ng-click="searchSettings.withLog = !searchSettings.withLog">OR WITH LOG - </button> - <br><br> -</div> + </button> + <br><br> + </div> -<!-- Test Results Table --> -<table class="table"> - <thead> - <tr class="active"> - <th>Status</th> - <th ng-if="!ctrl.displayTime" ng-show="ctrl.displayTime">Time</th> - <th>Description</th> - <th ng-if="!ctrl.displayBrowser" ng-show="ctrl.displayBrowser">Browser</th> - <th ng-if="!ctrl.displaySessionId" ng-show="ctrl.displaySessionId">Session ID</th> - <th ng-if="!ctrl.displayOS" ng-show="ctrl.displayOS">OS</th> - <th>Message</th> - <th>Log</th> - <th>Stack</th> - <th>Screen</th> - </tr> - </thead> - <tbody ng-repeat="result in ctrl.results | bySearchSettings:searchSettings"> - <!-- Test Spec Header --> - <tr ng-if="result.displaySpecName"> - <th class="spec" colspan="10">{{ctrl.currentSpec = ctrl.getSpec(result.description)}}</th> - </tr> - <tr ng-if="ctrl.currentParent != ctrl.getParent(result.description) && ctrl.getParent(result.description)"> - <th class="testCase" colspan="10">{{ctrl.currentParent = ctrl.getParent(result.description)}}</th> - </tr> + <!-- Test Results Table --> + <div class="table-responsive"> + <table class="table"> + <thead> + <tr class="active"> + <th>Status</th> + <th ng-if="!ctrl.displayTime" ng-show="ctrl.displayTime">Time</th> + <th>Description</th> + <th ng-if="!ctrl.displayBrowser" ng-show="ctrl.displayBrowser">Browser</th> + <th ng-if="!ctrl.displaySessionId" ng-show="ctrl.displaySessionId">Session ID</th> + <th ng-if="!ctrl.displayOS" ng-show="ctrl.displayOS">OS</th> + <th>Message</th> + <th>Log</th> + <th>Stack</th> + <th>Screen</th> + </tr> + </thead> + <tbody ng-repeat="result in ctrl.results | bySearchSettings:searchSettings"> + <!-- Test Spec Header --> + <tr ng-if="result.displaySpecName"> + <th class="spec" colspan="10"> + {{ctrl.currentSpec = ctrl.getSpec(result.description)}} + </th> + </tr> + <tr + ng-if="ctrl.currentParent != ctrl.getParent(result.description) && ctrl.getParent(result.description)"> + <th class="testCase" colspan="10"> + {{ctrl.currentParent = ctrl.getParent(result.description)}} + </th> + </tr> - <tr ng-class="{danger: !result.passed && !result.pending, warning: result.pending}"> - <td class="smallColumn status" ng-if="result.passed && !result.pending"> - <span class="label label-success"><span class="glyphicon glyphicon-ok"></span></span> - </td> - <td class="smallColumn status" ng-if="!result.passed && !result.pending"> - <span class="label label-danger"><span class="glyphicon glyphicon-remove"></span></span> - </td> - <td class="smallColumn status" ng-if="result.pending"> - <span class="label label-warning"><span class="glyphicon glyphicon-option-horizontal"></span></span> - </td> - <td class="smallColumn" ng-if="!ctrl.displayTime" ng-show="ctrl.displayTime"> - <span class="label label-default" ng-class="{'label-warning': result.duration > ctrl.warningTime, 'label-danger': result.duration > ctrl.dangerTime}">{{ctrl.round(result.duration, 1)}} s</span> - </td> - <td class="mediumColumn">{{ctrl.getShortDescription(result.description)}}</td> - <td ng-if="!ctrl.displayBrowser" ng-show="ctrl.displayBrowser">{{result.browser.name}} {{result.browser.version}}</td> - <td ng-if="!ctrl.displaySessionId" ng-show="ctrl.displaySessionId">{{result.sessionId}}</td> - <td ng-if="!ctrl.displayOS" ng-show="ctrl.displayOS">{{result.os}}</td> - <td> - <div ng-if="ctrl.isValueAnArray(result.message)"> - <span class="message" ng-repeat="message in result.message track by $index">{{message}}</span> - </div> - <div ng-if="!ctrl.isValueAnArray(result.message)"> - {{result.message}} - </div> - </td> - <td class="logColumn"> - <!--<button class="btn btn-warning pull-right" data-toggle="modal" data-target="#modal{{$index}}" ng-if="result.logWarnings > 0">{{result.logWarnings}}</button>--> - <!--<button class="btn btn-danger pull-right" data-toggle="modal" data-target="#modal{{$index}}" ng-if="result.logErrors > 0">{{result.logErrors}}</button>--> - <span class="label label-default ng-binding label-warning pull-right consoleLogLabel" ng-if="result.logWarnings > 0" data-toggle="modal" data-target="#modal{{$index}}">{{result.logWarnings}}</span> - <span class="label label-default ng-binding label-danger pull-right consoleLogLabel" ng-if="result.logErrors > 0" data-toggle="modal" data-target="#modal{{$index}}">{{result.logErrors}}</span> - </td> - <td class="smallColumn"> - <!-- Show stacktrace if failure --> - <div ng-if="(!result.passed && !result.pending) || result.browserLogs.length > 0"> - <span class="label label-white ng-binding pull-right" data-toggle="modal" data-target="#modal{{$index}}" ng-if="result.trace.length > 0"> - <span class="glyphicon glyphicon-warning-sign red"></span> - </span> - <!-- Stacktrace Modal --> - <div class="modal" id="modal{{$index}}" tabindex="-1" role="dialog" - aria-labelledby="modalLabel{{$index}}"> - <div class="modal-dialog modal-lg" role="document"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"> - <span aria-hidden="true">×</span> - </button> - <h6 class="modal-title" id="imageModalLabel{{$index}}"> - {{ctrl.getParent(result.description)}}</h6> - <h5 class="modal-title" id="imageModalLabel{{$index}}"> - {{ctrl.getShortDescription(result.description)}}</h5> - </div> - <div class="modal-body"> - <div ng-if="result.trace.length > 0"> - <div ng-if="ctrl.isValueAnArray(result.trace)"> - <pre class="logContainer" ng-repeat="trace in result.trace track by $index"><div ng-class="ctrl.applySmartHighlight(line)" ng-repeat="line in trace.split('\n') track by $index">{{line}}</div></pre> - </div> - <div ng-if="!ctrl.isValueAnArray(result.trace)"> - <pre class="logContainer"><div ng-class="ctrl.applySmartHighlight(line)" ng-repeat="line in result.trace.split('\n') track by $index">{{line}}</div></pre> - </div> - </div> - <div ng-if="result.browserLogs.length > 0"> - <h5 class="modal-title" id="imageModalLabel{{$index}}"> - Browser logs: - </h5> + <tr ng-class="{danger: !result.passed && !result.pending, warning: result.pending}"> + <td class="smallColumn status" ng-if="result.passed && !result.pending"> + <span class="label label-success"><span class="glyphicon glyphicon-ok"></span></span> + </td> + <td class="smallColumn status" ng-if="!result.passed && !result.pending"> + <span class="label label-danger"><span class="glyphicon glyphicon-remove"></span></span> + </td> + <td class="smallColumn status" ng-if="result.pending"> + <span class="label label-warning"><span + class="glyphicon glyphicon-option-horizontal"></span></span> + </td> + <td class="smallColumn" ng-if="!ctrl.displayTime" ng-show="ctrl.displayTime"> + <span class="label label-default" + ng-class="{'label-warning': result.duration > 14, 'label-danger': result.duration > 19}">{{ctrl.round(result.duration, 1)}} + s</span> + </td> + <td class="mediumColumn">{{ctrl.getShortDescription(result.description)}}</td> + <td ng-if="!ctrl.displayBrowser" ng-show="ctrl.displayBrowser">{{result.browser.name}} + {{result.browser.version}}</td> + <td ng-if="!ctrl.displaySessionId" ng-show="ctrl.displaySessionId">{{result.sessionId}}</td> + <td ng-if="!ctrl.displayOS" ng-show="ctrl.displayOS">{{result.os}}</td> + <td> + <div ng-if="ctrl.isValueAnArray(result.message)"> + <span class="message" ng-repeat="message in result.message track by $index"> + <a href="" data-toggle="modal" + data-target="#imageModal{{($parent.$parent.$index *100) + $index}}">{{message}} </a> + </span> + </div> + <div ng-if="!ctrl.isValueAnArray(result.message)"> + {{result.message}} + </div> + </td> + <td class="logColumn"> + <!--<button class="btn btn-warning pull-right" data-toggle="modal" data-target="#modal{{$index}}" ng-if="result.logWarnings > 0">{{result.logWarnings}}</button>--> + <!--<button class="btn btn-danger pull-right" data-toggle="modal" data-target="#modal{{$index}}" ng-if="result.logErrors > 0">{{result.logErrors}}</button>--> + <span class="label label-default ng-binding label-warning pull-right consoleLogLabel" + ng-if="result.logWarnings > 0" data-toggle="modal" + data-target="#modal{{$index}}">{{result.logWarnings}}</span> + <span class="label label-default ng-binding label-danger pull-right consoleLogLabel" + ng-if="result.logErrors > 0" data-toggle="modal" + data-target="#modal{{$index}}">{{result.logErrors}}</span> + </td> + <td class="smallColumn"> + <!-- Show stacktrace if failure --> + <div ng-if="(!result.passed && !result.pending) || result.browserLogs.length > 0"> + <span class="label label-white ng-binding pull-right" data-toggle="modal" + data-target="#modal{{$index}}" ng-if="result.trace.length > 0"> + <span class="glyphicon glyphicon-warning-sign red"></span> + </span> + <!-- Stacktrace Modal --> + <div class="modal" id="modal{{$index}}" tabindex="-1" role="dialog" + aria-labelledby="modalLabel{{$index}}"> + <div class="modal-dialog modal-lg" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + <h6 class="modal-title" id="imageModalLabel{{$index}}"> + {{ctrl.getParent(result.description)}}</h6> + <h5 class="modal-title" id="imageModalLabel{{$index}}"> + {{ctrl.getShortDescription(result.description)}}</h5> + </div> + <div class="modal-body"> + <div ng-if="result.trace.length > 0"> + <div ng-if="ctrl.isValueAnArray(result.trace)"> + <pre class="logContainer" + ng-repeat="trace in result.trace track by $index"><div ng-class="ctrl.applySmartHighlight(line)" ng-repeat="line in trace.split('\n') track by $index">{{line}}</div></pre> + </div> + <div ng-if="!ctrl.isValueAnArray(result.trace)"> + <pre + class="logContainer"><div ng-class="ctrl.applySmartHighlight(line)" ng-repeat="line in result.trace.split('\n') track by $index">{{line}}</div></pre> + </div> + </div> + <div ng-if="result.browserLogs.length > 0"> + <h5 class="modal-title" id="imageModalLabel{{$index}}"> + Browser logs: + </h5> - <pre class="logContainer"><div class="browserLogItem" ng-repeat="logError in result.browserLogs track by $index"><div><span class="label browserLogLabel label-default" ng-class="{'label-danger': logError.level==='SEVERE', 'label-warning': logError.level==='WARNING'}">{{logError.level}}</span><span class="label label-default">{{ctrl.convertTimestamp(logError.timestamp)}}</span><div ng-repeat="messageLine in logError.message.split('\\n') track by $index">{{ messageLine }}</div></div></div></pre> + <pre + class="logContainer"><div class="browserLogItem" ng-repeat="logError in result.browserLogs track by $index"><div><span class="label browserLogLabel label-default" ng-class="{'label-danger': logError.level==='SEVERE', 'label-warning': logError.level==='WARNING'}">{{logError.level}}</span><span class="label label-default">{{ctrl.convertTimestamp(logError.timestamp)}}</span><div ng-repeat="messageLine in logError.message.split('\\n') track by $index">{{ messageLine }}</div></div></div></pre> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-default" + ng-class="{active: ctrl.showSmartStackTraceHighlight}" + ng-click="ctrl.showSmartStackTraceHighlight = !ctrl.showSmartStackTraceHighlight"> + <span class="glyphicon glyphicon-education black"></span> Smart Stack + Trace + </button> + <button type="button" class="btn btn-default" + data-dismiss="modal">Close</button> + </div> + </div> </div> </div> - <div class="modal-footer"> - <button class="btn btn-default" - ng-class="{active: ctrl.showSmartStackTraceHighlight}" - ng-click="ctrl.showSmartStackTraceHighlight = !ctrl.showSmartStackTraceHighlight"> - <span class="glyphicon glyphicon-education black"></span> Smart Stack Trace - </button> - <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> - </div> </div> - </div> - </div> - </div> - </td> - <td ng-class="{'mediumColumn': ctrl.inlineScreenshots && result.screenShotFile}"> - <div ng-if="!result.pending"> - <span ng-if="!ctrl.inlineScreenshots && result.screenShotFile" - class="label label-white ng-binding pull-right" - data-toggle="modal" - data-target="#imageModal{{$index}}"> - <span class="glyphicon glyphicon-picture black"></span> - </span> - <a href="" ng-if="ctrl.inlineScreenshots && result.screenShotFile" data-toggle="modal" data-target="#imageModal{{$index}}"> - <img ng-src="{{result.screenShotFile}}" class="screenshotLink"/></a> - <!-- Screenshot Modal --> - <div class="modal" id="imageModal{{$index}}" tabindex="-1" role="dialog" - aria-labelledby="imageModalLabel{{$index}}"> - <div class="modal-dialog modal-lg" role="document"> - <div class="modal-content"> - <div class="modal-header"> - <button type="button" class="close" data-dismiss="modal" aria-label="Close"> - <span aria-hidden="true">×</span> - </button> - <h6 class="modal-title" id="imageModalLabel{{$index}}"> - {{ctrl.getParent(result.description)}}</h6> - <h5 class="modal-title" id="imageModalLabel{{$index}}"> - {{ctrl.getShortDescription(result.description)}}</h5> - </div> - <div class="modal-body"> - <img class="screenshotImage" ng-src="{{result.screenShotFile}}"> - </div> - <div class="modal-footer"> - <div class="pull-left"> - <button ng-disabled="!($index > 0)" class="btn btn-default" data-dismiss="modal" - data-toggle="modal" data-target="#imageModal{{$index - 1}}"> - Prev - </button> - <button ng-disabled="!($index < ctrl.results.length - 1)" class="btn btn-default" - data-dismiss="modal" data-toggle="modal" - data-target="#imageModal{{$index + 1}}"> - Next - </button> + </td> + <td> + <div class="row"> + <div class="col" ng-repeat="screenShotFile in result.screenShotFile track by $index" + ng-class="{'mediumColumn': ctrl.inlineScreenshots && screenShotFile}"> + <div ng-if="!result.pending"> + <span ng-if="!ctrl.inlineScreenshots && screenShotFile && result.screenShotFile.length - 1 > $index" + class="label label-white ng-binding pull-left" data-toggle="modal" + data-target="#imageModal{{($parent.$parent.$parent.$index *100) + $index}}"> + <span class="glyphicon glyphicon-picture black"></span> + </span> + <span + ng-if="!ctrl.inlineScreenshots && screenShotFile && result.screenShotFile.length - 1 == $index" + class="label label-white ng-binding pull-left" data-toggle="modal" + data-target="#imageModal{{($parent.$parent.$parent.$index *100) + $index}}"> + <span class="glyphicon glyphicon-time black"></span> + </span> + <a href="" ng-if="ctrl.inlineScreenshots && screenShotFile" data-toggle="modal" + data-target="#imageModal{{($parent.$parent.$parent.$index *100) + $index}}"> + <img ng-src="{{screenShotFile}}" class="screenshotLink" /></a> + <!-- Screenshot Modal --> + <div class="modal" id="imageModal{{($parent.$parent.$index *100) + $index}}" + tabindex="-1" role="dialog" aria-labelledby="imageModalLabel{{$index}}"> + <div class="modal-dialog modal-lg" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" + aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + <h6 class="modal-title" id="imageModalLabel{{$index}}"> + {{ctrl.getParent(result.description)}}</h6> + <h5 class="modal-title" id="imageModalLabel{{$index}}"> + {{ctrl.getShortDescription(result.description)}}</h5> + </div> + <div class="modal-body"> + <img class="screenshotImage" ng-src="{{screenShotFile}}"> + </div> + <div class="modal-footer"> + <div class="pull-left"> + <button ng-disabled="!($index > 0)" class="btn btn-default" + data-dismiss="modal" data-toggle="modal" + data-target="#imageModal{{($parent.$parent.$index *100) + $index - 1}}"> + Prev + </button> + <button + ng-disabled="!($index < result.screenShotFile.length - 1)" + class="btn btn-default" data-dismiss="modal" + data-toggle="modal" + data-target="#imageModal{{($parent.$parent.$index *100) + $index + 1}}"> + Next + </button> + </div> + <a class="btn btn-primary" href="{{screenShotFile}}" + target="_blank"> + Open Image in New Tab + <span class="glyphicon glyphicon-new-window" + aria-hidden="true"></span> + </a> + <button type="button" class="btn btn-default" + data-dismiss="modal">Close</button> + </div> + </div> + </div> + </div> </div> - <a class="btn btn-primary" href="{{result.screenShotFile}}" target="_blank"> - Open Image in New Tab - <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span> - </a> - <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> </div> </div> - </div> - </div> - </div> - </td> - </tr> - </tbody> -</table> -<div class="center"> - <a class="github-button" href="https://github.com/Evilweed/protractor-beautiful-reporter" data-size="large" data-show-count="true" aria-label="Star Evilweed/protractor-beautiful-reporter on GitHub">Star</a> -</div> -{{ctrl.currentParent = "";""}} -<script src="assets/main.js"></script> -<script async defer src="assets/buttons.js"></script> + </td> + </tr> + </tbody> + </table> + </div> + <div class="center"> + <a class="github-button" href="https://github.com/Evilweed/protractor-beautiful-reporter" data-size="large" + data-show-count="true" aria-label="Star Evilweed/protractor-beautiful-reporter on GitHub">Star</a> + </div> + {{ctrl.currentParent = "";""}} + <script src="assets/main.js"></script> + <script async defer src="assets/buttons.js"></script> </body> + </html> \ No newline at end of file From 1fefc4da4a64a52a7785c23a6ca3ee30dac66d32 Mon Sep 17 00:00:00 2001 From: Maurice Matuschek <maurice.matuschek@hec.de> Date: Wed, 12 Jun 2019 16:41:47 +0200 Subject: [PATCH 06/12] changed so it doesn't break everything, kinda breaks pathbuilder --- app/reporter.js | 61 ++++-- examples/protractor.jasmine2.conf.js | 267 ++++++++++++--------------- index.js | 41 +++- lib/index.html | 4 +- 4 files changed, 202 insertions(+), 171 deletions(-) diff --git a/app/reporter.js b/app/reporter.js index 7dd4696..52f7b2e 100644 --- a/app/reporter.js +++ b/app/reporter.js @@ -55,7 +55,7 @@ function defaultMetaDataBuilder(spec, descriptions, results, capabilities) { if (results.items_.length > 0) { var result = results.items_[0]; if (!results.passed()) { - var failedItem = _.where(results.items_, {passed_: false})[0]; + var failedItem = _.where(results.items_, { passed_: false })[0]; if (failedItem) { metaData.message = failedItem.message || 'Failed'; metaData.trace = failedItem.trace ? (failedItem.trace.stack || 'No Stack trace information') : 'No Stack trace information'; @@ -217,14 +217,49 @@ function ScreenshotReporter(options) { } } +function expectFailed(rep) { + var originalAddExpectationResult = jasmine.Spec.prototype.addExpectationResult; + jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) { + var self = rep; + + if (!passed) { + let baseName = self._screenshotReporter.pathBuilder( + null, + [expectation.message], + null, + null + ); + let tst = util.generateGuid(); + let screenShotFileName = path.basename(tst + '.png'); + let screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder); + let screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName); + self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName)); + try { + browser.takeScreenshot().then(png => { + util.storeScreenShot(png, screenShotPath); + }); + } + catch (ex) { + if (ex['name'] === 'NoSuchWindowError') { + console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed'); + } else { + console.error(ex); + console.error('Protractor-beautiful-reporter could not take the screenshot'); + } + metaData.screenShotFile = void 0; + } + } + return originalAddExpectationResult.apply(this, arguments); + } +}; class Jasmine2Reporter { - constructor({screenshotReporter}) { + constructor({ screenshotReporter }) { /* `_asyncFlow` is a promise. - * It is a "flow" that we create in `specDone`. - * `suiteDone`, `suiteStarted` and `specStarted` will then add their steps to the flow and the `_awaitAsyncFlow` - * function will wait for the flow to finish before running the next spec. */ + * It is a "flow" that we create in `specDone`. + * `suiteDone`, `suiteStarted` and `specStarted` will then add their steps to the flow and the `_awaitAsyncFlow` + * function will wait for the flow to finish before running the next spec. */ this._asyncFlow = null; this._screenshotReporter = screenshotReporter; @@ -305,7 +340,7 @@ class Jasmine2Reporter { result.browserLogs = await browser.manage().logs().get('browser'); } - + async _takeScreenShotAndAddMetaData(result) { const capabilities = await browser.getCapabilities(); @@ -355,16 +390,16 @@ class Jasmine2Reporter { metaData.timestamp = new Date(result.started).getTime(); metaData.duration = new Date(result.stopped) - new Date(result.started); - let testWasExecuted = ! (['pending','disabled','excluded'].includes(result.status)); + let testWasExecuted = !(['pending', 'disabled', 'excluded'].includes(result.status)); if (testWasExecuted && considerScreenshot) { try { const png = await browser.takeScreenshot(); util.storeScreenShot(png, screenShotPath); } - catch(ex) { - if(ex['name'] === 'NoSuchWindowError') { + catch (ex) { + if (ex['name'] === 'NoSuchWindowError') { console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed'); - }else { + } else { console.error(ex); console.error('Protractor-beautiful-reporter could not take the screenshot'); } @@ -402,9 +437,9 @@ class Jasmine2Reporter { * http://jasmine.github.io/2.1/custom_reporter.html */ ScreenshotReporter.prototype.getJasmine2Reporter = function () { - - return new Jasmine2Reporter({screenshotReporter: this}); - + let reporter = new Jasmine2Reporter({ screenshotReporter: this }); + expectFailed(reporter); + return reporter; }; diff --git a/examples/protractor.jasmine2.conf.js b/examples/protractor.jasmine2.conf.js index 56b8bfe..2902913 100644 --- a/examples/protractor.jasmine2.conf.js +++ b/examples/protractor.jasmine2.conf.js @@ -1,162 +1,127 @@ var HtmlReporter = require('protractor-beautiful-reporter'); var util = require('../app/util'), _ = require('underscore'), - path = require('path'); + path = require('path'); // ----- Config example for Jasmine 2 ----- exports.config = { - // ----- How to setup Selenium ----- - // - // There are three ways to specify how to use Selenium. Specify one of the - // following: - // - // 1. seleniumServerJar - to start Selenium Standalone locally. - // 2. seleniumAddress - to connect to a Selenium server which is already - // running. - // 3. sauceUser/sauceKey - to use remote Selenium servers via SauceLabs. - - // The location of the selenium standalone server .jar file. - //seleniumServerJar: 'node_modules/protractor/selenium/selenium-server-standalone-2.37.0.jar', - - // Address of selenium server (before running protractor, run "webdriver-manager start" to start the Selenium server) - seleniumAddress: process.env.SELENIUMSERVER ? process.env.SELENIUMSERVER : 'http://localhost:4444/wd/hub', - - // The port to start the selenium server on, or null if the server should - // find its own unused port. - seleniumPort: null, - - // Chromedriver location is used to help the selenium standalone server - // find chromedriver. This will be passed to the selenium jar as - // the system property webdriver.chrome.driver. If null, selenium will - // attempt to find chromedriver using PATH. - //chromeDriver: 'node_modules/protractor/selenium/chromedriver', - - // Additional command line options to pass to selenium. For example, - // if you need to change the browser timeout, use - // seleniumArgs: ['-browserTimeout=60'], - seleniumArgs: [], - - // If sauceUser and sauceKey are specified, seleniumServerJar will be ignored. - // The tests will be run remotely using SauceLabs. - sauceUser: null, - sauceKey: null, - - // ----- What tests to run ----- - // - // Spec patterns are relative to the location of this config. - specs: [ - './specs/*.js' - ], - - // ----- Capabilities to be passed to the webdriver instance ---- - // - // For a full list of available capabilities, see - // https://code.google.com/p/selenium/wiki/DesiredCapabilities - // and - // https://code.google.com/p/selenium/source/browse/javascript/webdriver/capabilities.js - capabilities: { - browserName: 'chrome', - logName: 'Chrome - English', - version: '', - platform: 'ANY', - shardTestFiles: false, - maxInstances: 2, - - chromeOptions: { - args: ["--window-size=1680,1000"] - // commented out but needed to keep it for local testing - //, binary: process.env.CHROMIUM_BIN - // - // args:["--headless","--disable-gpu","--window-size=1680,1680"] - // args:["--headless","--disable-gpu","--force-device-scale-factor=1.75","--high-dpi-support=1.75","--window-size=1400,1680"] - } - }, - - // A base URL for your application under test. Calls to protractor.get() - // with relative paths will be prepended with this. - baseUrl: 'http://localhost:9999', - - // Set the framework - framework: 'jasmine', - - // Selector for the element housing the angular app - this defaults to - // body, but is necessary if ng-app is on a descendant of <body> - rootElement: 'body', - - onPrepare: function () { - // Add a screenshot reporter: - var reporter = new HtmlReporter({ - preserveDirectory: false, - takeScreenShotsOnlyForFailedSpecs: true, - screenshotsSubfolder: 'images', - jsonsSubfolder: 'jsons', - baseDirectory: 'reports-tmp', - - pathBuilder: function pathBuilder(spec, descriptions, results, capabilities) { - // Return '<30-12-2016>/<browser>/<specname>' as path for screenshots: - // Example: '30-12-2016/firefox/list-should work'. - var currentDate = new Date(), - day = currentDate.getDate(), - month = currentDate.getMonth() + 1, - year = currentDate.getFullYear(); - - var validDescriptions = descriptions.map(function (description) { - return description.replace('/', '@'); - }); - - return path.join( - day + "-" + month + "-" + year, - // capabilities.get('browserName'), - validDescriptions.join('-')); - } - }) - jasmine.getEnv().addReporter( - reporter.getJasmine2Reporter() - ); - ExpectFailed(reporter); - function ExpectFailed(rep) { - var originalAddExpectationResult = jasmine.Spec.prototype.addExpectationResult; - jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) { - var self = rep; - - var makeScreenshotsFromEachBrowsers = false; - - if (!passed) { - makeScreenshotsFromEachBrowsers = true; - } - if (makeScreenshotsFromEachBrowsers) { - let tst = util.generateGuid(); - let screenShotFileName = path.basename(tst + '.png'); - let screenShotFilePath = path.join(path.dirname(self.baseName + '.png'), self.screenshotsSubfolder); - let screenShotPath = path.join(self.baseDirectory, screenShotFilePath, screenShotFileName); - self.screenshotArray.push(path.join(self.screenshotsSubfolder, screenShotFileName)); - try { - browser.takeScreenshot().then(png => { - util.storeScreenShot(png, screenShotPath); - }); - } - catch (ex) { - if (ex['name'] === 'NoSuchWindowError') { - console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed'); - } else { - console.error(ex); - console.error('Protractor-beautiful-reporter could not take the screenshot'); - } - metaData.screenShotFile = void 0; - } - } - return originalAddExpectationResult.apply(this, arguments); - } - } - }, - - jasmineNodeOpts: { - // If true, print colors to the terminal. - showColors: true, - // Default time to wait in ms before a test fails. - defaultTimeoutInterval: 30000, + // ----- How to setup Selenium ----- + // + // There are three ways to specify how to use Selenium. Specify one of the + // following: + // + // 1. seleniumServerJar - to start Selenium Standalone locally. + // 2. seleniumAddress - to connect to a Selenium server which is already + // running. + // 3. sauceUser/sauceKey - to use remote Selenium servers via SauceLabs. + + // The location of the selenium standalone server .jar file. + //seleniumServerJar: 'node_modules/protractor/selenium/selenium-server-standalone-2.37.0.jar', + + // Address of selenium server (before running protractor, run "webdriver-manager start" to start the Selenium server) + seleniumAddress: process.env.SELENIUMSERVER ? process.env.SELENIUMSERVER : 'http://localhost:4444/wd/hub', + + // The port to start the selenium server on, or null if the server should + // find its own unused port. + seleniumPort: null, + + // Chromedriver location is used to help the selenium standalone server + // find chromedriver. This will be passed to the selenium jar as + // the system property webdriver.chrome.driver. If null, selenium will + // attempt to find chromedriver using PATH. + //chromeDriver: 'node_modules/protractor/selenium/chromedriver', + + // Additional command line options to pass to selenium. For example, + // if you need to change the browser timeout, use + // seleniumArgs: ['-browserTimeout=60'], + seleniumArgs: [], + + // If sauceUser and sauceKey are specified, seleniumServerJar will be ignored. + // The tests will be run remotely using SauceLabs. + sauceUser: null, + sauceKey: null, + + // ----- What tests to run ----- + // + // Spec patterns are relative to the location of this config. + specs: [ + './specs/*.js' + ], + + // ----- Capabilities to be passed to the webdriver instance ---- + // + // For a full list of available capabilities, see + // https://code.google.com/p/selenium/wiki/DesiredCapabilities + // and + // https://code.google.com/p/selenium/source/browse/javascript/webdriver/capabilities.js + capabilities: { + browserName: 'chrome', + logName: 'Chrome - English', + version: '', + platform: 'ANY', + shardTestFiles: false, + maxInstances: 2, + + chromeOptions: { + args: ["--window-size=1680,1000"] + // commented out but needed to keep it for local testing + //, binary: process.env.CHROMIUM_BIN + // + // args:["--headless","--disable-gpu","--window-size=1680,1680"] + // args:["--headless","--disable-gpu","--force-device-scale-factor=1.75","--high-dpi-support=1.75","--window-size=1400,1680"] } + }, + + // A base URL for your application under test. Calls to protractor.get() + // with relative paths will be prepended with this. + baseUrl: 'http://localhost:9999', + + // Set the framework + framework: 'jasmine', + + // Selector for the element housing the angular app - this defaults to + // body, but is necessary if ng-app is on a descendant of <body> + rootElement: 'body', + + onPrepare: function () { + // Add a screenshot reporter: + + jasmine.getEnv().addReporter( + new HtmlReporter({ + preserveDirectory: false, + takeScreenShotsOnlyForFailedSpecs: true, + screenshotsSubfolder: 'images', + jsonsSubfolder: 'jsons', + baseDirectory: 'reports-tmp', + + pathBuilder: function pathBuilder(spec, descriptions, results, capabilities) { + // Return '<30-12-2016>/<browser>/<specname>' as path for screenshots: + // Example: '30-12-2016/firefox/list-should work'. + var currentDate = new Date(), + day = currentDate.getDate(), + month = currentDate.getMonth() + 1, + year = currentDate.getFullYear(); + + var validDescriptions = descriptions.map(function (description) { + return description.replace('/', '@'); + }); + + return path.join( + day + "-" + month + "-" + year, + // capabilities.get('browserName'), + validDescriptions.join('-')); + } + }).getJasmine2Reporter() + ); + }, + + jasmineNodeOpts: { + // If true, print colors to the terminal. + showColors: true, + // Default time to wait in ms before a test fails. + defaultTimeoutInterval: 30000, + } }; diff --git a/index.js b/index.js index 045bfba..fe642e0 100644 --- a/index.js +++ b/index.js @@ -4906,6 +4906,36 @@ function ScreenshotReporter(options) { } } +function expectFailed(rep) { + var originalAddExpectationResult = jasmine.Spec.prototype.addExpectationResult; + jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) { + var self = rep; + + if (!passed) { + var baseName = self._screenshotReporter.pathBuilder(null, [expectation.message], null, null); + var tst = util.generateGuid(); + var screenShotFileName = path.basename(tst + '.png'); + var screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder); + var screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName); + self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName)); + try { + browser.takeScreenshot().then(function (png) { + util.storeScreenShot(png, screenShotPath); + }); + } catch (ex) { + if (ex['name'] === 'NoSuchWindowError') { + console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed'); + } else { + console.error(ex); + console.error('Protractor-beautiful-reporter could not take the screenshot'); + } + metaData.screenShotFile = void 0; + } + } + return originalAddExpectationResult.apply(this, arguments); + }; +}; + var Jasmine2Reporter = function () { function Jasmine2Reporter(_ref) { var screenshotReporter = _ref.screenshotReporter; @@ -4913,9 +4943,9 @@ var Jasmine2Reporter = function () { _classCallCheck(this, Jasmine2Reporter); /* `_asyncFlow` is a promise. - * It is a "flow" that we create in `specDone`. - * `suiteDone`, `suiteStarted` and `specStarted` will then add their steps to the flow and the `_awaitAsyncFlow` - * function will wait for the flow to finish before running the next spec. */ + * It is a "flow" that we create in `specDone`. + * `suiteDone`, `suiteStarted` and `specStarted` will then add their steps to the flow and the `_awaitAsyncFlow` + * function will wait for the flow to finish before running the next spec. */ this._asyncFlow = null; this._screenshotReporter = screenshotReporter; @@ -5278,8 +5308,9 @@ var Jasmine2Reporter = function () { ScreenshotReporter.prototype.getJasmine2Reporter = function () { - - return new Jasmine2Reporter({ screenshotReporter: this }); + var reporter = new Jasmine2Reporter({ screenshotReporter: this }); + expectFailed(reporter); + return reporter; }; /** Function: reportSpecResults diff --git a/lib/index.html b/lib/index.html index 0984ada..590b935 100644 --- a/lib/index.html +++ b/lib/index.html @@ -3,7 +3,7 @@ <head> <meta charset="UTF-8"> - <title>Buglist</title> + <title>Protractor Screenshot Report</title> <link rel="shortcut icon" type="image/x-icon" href="../node_modules/protractor-beautiful-reporter/lib/favicon.ico"> <link rel="stylesheet" href="assets/main.css"> <!-- Here will be CSS placed --> @@ -19,7 +19,7 @@ <!-- Header --> <h2> - <img src="./assets/assets/logo.svg"> <!-- Here goes title --> + <!-- Here goes title --> <div class="pull-right"> <button class="btn btn-default" ng-class="{active: !ctrl.displayTime}" ng-click="ctrl.displayTime = !ctrl.displayTime">TIME From fc301e57632c633de8861aec6e12e689cd90afa7 Mon Sep 17 00:00:00 2001 From: Maurice Matuschek <maurice.matuschek@hec.de> Date: Thu, 13 Jun 2019 09:03:35 +0200 Subject: [PATCH 07/12] removed some unnecessary things --- app/reporter.js | 4 ++-- examples/protractor.jasmine2.conf.js | 10 +++------- lib/index.html | 4 ++-- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/app/reporter.js b/app/reporter.js index 52f7b2e..97ffd0e 100644 --- a/app/reporter.js +++ b/app/reporter.js @@ -229,8 +229,8 @@ function expectFailed(rep) { null, null ); - let tst = util.generateGuid(); - let screenShotFileName = path.basename(tst + '.png'); + let gUid = util.generateGuid(); + let screenShotFileName = path.basename(gUid + '.png'); let screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder); let screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName); self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName)); diff --git a/examples/protractor.jasmine2.conf.js b/examples/protractor.jasmine2.conf.js index 2902913..5f2269e 100644 --- a/examples/protractor.jasmine2.conf.js +++ b/examples/protractor.jasmine2.conf.js @@ -1,7 +1,5 @@ var HtmlReporter = require('protractor-beautiful-reporter'); -var util = require('../app/util'), - _ = require('underscore'), - path = require('path'); +var path = require('path'); // ----- Config example for Jasmine 2 ----- @@ -88,8 +86,7 @@ exports.config = { onPrepare: function () { // Add a screenshot reporter: - jasmine.getEnv().addReporter( - new HtmlReporter({ + jasmine.getEnv().addReporter(new HtmlReporter({ preserveDirectory: false, takeScreenShotsOnlyForFailedSpecs: true, screenshotsSubfolder: 'images', @@ -113,8 +110,7 @@ exports.config = { // capabilities.get('browserName'), validDescriptions.join('-')); } - }).getJasmine2Reporter() - ); + }).getJasmine2Reporter()); }, jasmineNodeOpts: { diff --git a/lib/index.html b/lib/index.html index 590b935..dfdebb6 100644 --- a/lib/index.html +++ b/lib/index.html @@ -4,7 +4,6 @@ <head> <meta charset="UTF-8"> <title>Protractor Screenshot Report</title> - <link rel="shortcut icon" type="image/x-icon" href="../node_modules/protractor-beautiful-reporter/lib/favicon.ico"> <link rel="stylesheet" href="assets/main.css"> <!-- Here will be CSS placed --> <script src="assets/angular.min.js"></script> @@ -210,7 +209,8 @@ <h5 class="modal-title" id="imageModalLabel{{$index}}"> <div class="col" ng-repeat="screenShotFile in result.screenShotFile track by $index" ng-class="{'mediumColumn': ctrl.inlineScreenshots && screenShotFile}"> <div ng-if="!result.pending"> - <span ng-if="!ctrl.inlineScreenshots && screenShotFile && result.screenShotFile.length - 1 > $index" + <span + ng-if="!ctrl.inlineScreenshots && screenShotFile && result.screenShotFile.length - 1 > $index" class="label label-white ng-binding pull-left" data-toggle="modal" data-target="#imageModal{{($parent.$parent.$parent.$index *100) + $index}}"> <span class="glyphicon glyphicon-picture black"></span> From 32b68fa3a60e89c9646eec322decc3d6dfe86219 Mon Sep 17 00:00:00 2001 From: Maurice Matuschek <maurice.matuschek@hec.de> Date: Thu, 13 Jun 2019 09:15:14 +0200 Subject: [PATCH 08/12] reverted some style changes --- app/reporter.js | 12 ++++++------ examples/protractor.jasmine2.conf.js | 2 -- lib/index.html | 3 --- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/app/reporter.js b/app/reporter.js index 97ffd0e..1641a98 100644 --- a/app/reporter.js +++ b/app/reporter.js @@ -55,7 +55,7 @@ function defaultMetaDataBuilder(spec, descriptions, results, capabilities) { if (results.items_.length > 0) { var result = results.items_[0]; if (!results.passed()) { - var failedItem = _.where(results.items_, { passed_: false })[0]; + var failedItem = _.where(results.items_, {passed_: false})[0]; if (failedItem) { metaData.message = failedItem.message || 'Failed'; metaData.trace = failedItem.trace ? (failedItem.trace.stack || 'No Stack trace information') : 'No Stack trace information'; @@ -254,7 +254,7 @@ function expectFailed(rep) { }; class Jasmine2Reporter { - constructor({ screenshotReporter }) { + constructor({screenshotReporter}) { /* `_asyncFlow` is a promise. * It is a "flow" that we create in `specDone`. @@ -390,16 +390,16 @@ class Jasmine2Reporter { metaData.timestamp = new Date(result.started).getTime(); metaData.duration = new Date(result.stopped) - new Date(result.started); - let testWasExecuted = !(['pending', 'disabled', 'excluded'].includes(result.status)); + let testWasExecuted = ! (['pending', 'disabled', 'excluded'].includes(result.status)); if (testWasExecuted && considerScreenshot) { try { const png = await browser.takeScreenshot(); util.storeScreenShot(png, screenShotPath); } - catch (ex) { - if (ex['name'] === 'NoSuchWindowError') { + catch(ex) { + if(ex['name'] === 'NoSuchWindowError') { console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed'); - } else { + }else { console.error(ex); console.error('Protractor-beautiful-reporter could not take the screenshot'); } diff --git a/examples/protractor.jasmine2.conf.js b/examples/protractor.jasmine2.conf.js index 5f2269e..e92764f 100644 --- a/examples/protractor.jasmine2.conf.js +++ b/examples/protractor.jasmine2.conf.js @@ -1,7 +1,6 @@ var HtmlReporter = require('protractor-beautiful-reporter'); var path = require('path'); - // ----- Config example for Jasmine 2 ----- exports.config = { @@ -85,7 +84,6 @@ exports.config = { onPrepare: function () { // Add a screenshot reporter: - jasmine.getEnv().addReporter(new HtmlReporter({ preserveDirectory: false, takeScreenShotsOnlyForFailedSpecs: true, diff --git a/lib/index.html b/lib/index.html index dfdebb6..148c440 100644 --- a/lib/index.html +++ b/lib/index.html @@ -1,6 +1,5 @@ <!DOCTYPE html> <html lang="en" ng-app="reportingApp" ng-csp> - <head> <meta charset="UTF-8"> <title>Protractor Screenshot Report</title> @@ -13,7 +12,6 @@ <script src="assets/circular-json.js"></script> </head> - <body ng-controller="ScreenshotReportController as ctrl" class="ng-cloak"> <!-- Header --> @@ -285,5 +283,4 @@ <h5 class="modal-title" id="imageModalLabel{{$index}}"> <script src="assets/main.js"></script> <script async defer src="assets/buttons.js"></script> </body> - </html> \ No newline at end of file From c2c6c6719ebd1e68208634b26eafd52be77efc3f Mon Sep 17 00:00:00 2001 From: Maurice Matuschek <maurice.matuschek@hec.de> Date: Thu, 13 Jun 2019 09:16:44 +0200 Subject: [PATCH 09/12] new compiled index.js --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index fe642e0..fec004d 100644 --- a/index.js +++ b/index.js @@ -4913,8 +4913,8 @@ function expectFailed(rep) { if (!passed) { var baseName = self._screenshotReporter.pathBuilder(null, [expectation.message], null, null); - var tst = util.generateGuid(); - var screenShotFileName = path.basename(tst + '.png'); + var gUid = util.generateGuid(); + var screenShotFileName = path.basename(gUid + '.png'); var screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder); var screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName); self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName)); From ac26901a11a1086fe76031b86a449a3bc6c15599 Mon Sep 17 00:00:00 2001 From: Maurice Matuschek <maurice.matuschek@hec.de> Date: Wed, 3 Jul 2019 12:40:12 +0200 Subject: [PATCH 10/12] made inline screenshots bigger and added space between them --- lib/assets/bootstrap.css | 4 +--- lib/assets/main.css | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/assets/bootstrap.css b/lib/assets/bootstrap.css index 10c262c..a36b148 100644 --- a/lib/assets/bootstrap.css +++ b/lib/assets/bootstrap.css @@ -1117,9 +1117,7 @@ a:focus { figure { margin: 0; } -img { - vertical-align: middle; -} + .img-responsive, .thumbnail > img, .thumbnail a > img, diff --git a/lib/assets/main.css b/lib/assets/main.css index 7a085a7..e97d688 100644 --- a/lib/assets/main.css +++ b/lib/assets/main.css @@ -112,7 +112,7 @@ table { } .screenshotLink { - max-width: 100%; + max-width: 300%; } .screenshotImage { From 262ba89c31ba1f69ea5534cc84231a405dca97d2 Mon Sep 17 00:00:00 2001 From: Maurice Matuschek <maurice.matuschek@hec.de> Date: Wed, 14 Aug 2019 10:17:00 +0200 Subject: [PATCH 11/12] made the screenshot on failed expect optional --- app/reporter.js | 5 +++-- index.js | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/reporter.js b/app/reporter.js index 1641a98..9d18c60 100644 --- a/app/reporter.js +++ b/app/reporter.js @@ -175,7 +175,7 @@ function ScreenshotReporter(options) { this.pathBuilder = options.pathBuilder || defaultPathBuilder; this.docTitle = options.docTitle || 'Test Results'; this.docName = options.docName || 'report.html'; - this.screenshotArray = options.screenshotArray || []; + this.screenshotOnFailure = typeof options.screenshotOnFailure !== 'undefined' ? options.screenshotOnFailure : false; this.metaDataBuilder = options.metaDataBuilder || defaultMetaDataBuilder; this.jasmine2MetaDataBuilder = options.jasmine2MetaDataBuilder || jasmine2MetaDataBuilder; this.sortFunction = options.sortFunction || sortFunction; @@ -215,6 +215,7 @@ function ScreenshotReporter(options) { if (!this.preserveDirectory) { util.removeDirectory(this.finalOptions.baseDirectory); } + this.screenshotArray = []; } function expectFailed(rep) { @@ -222,7 +223,7 @@ function expectFailed(rep) { jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) { var self = rep; - if (!passed) { + if (!passed && self._screenshotReporter.screenshotOnFailure) { let baseName = self._screenshotReporter.pathBuilder( null, [expectation.message], diff --git a/index.js b/index.js index fec004d..94269ae 100644 --- a/index.js +++ b/index.js @@ -4866,7 +4866,7 @@ function ScreenshotReporter(options) { this.pathBuilder = options.pathBuilder || defaultPathBuilder; this.docTitle = options.docTitle || 'Test Results'; this.docName = options.docName || 'report.html'; - this.screenshotArray = options.screenshotArray || []; + this.screenshotOnFailure = typeof options.screenshotOnFailure !== 'undefined' ? options.screenshotOnFailure : false; this.metaDataBuilder = options.metaDataBuilder || defaultMetaDataBuilder; this.jasmine2MetaDataBuilder = options.jasmine2MetaDataBuilder || jasmine2MetaDataBuilder; this.sortFunction = options.sortFunction || sortFunction; @@ -4904,6 +4904,7 @@ function ScreenshotReporter(options) { if (!this.preserveDirectory) { util.removeDirectory(this.finalOptions.baseDirectory); } + this.screenshotArray = []; } function expectFailed(rep) { @@ -4911,7 +4912,7 @@ function expectFailed(rep) { jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) { var self = rep; - if (!passed) { + if (!passed && self._screenshotReporter.screenshotOnFailure) { var baseName = self._screenshotReporter.pathBuilder(null, [expectation.message], null, null); var gUid = util.generateGuid(); var screenShotFileName = path.basename(gUid + '.png'); From 85d40940fd88ab1a420810c011719838ccb62d55 Mon Sep 17 00:00:00 2001 From: Maurice Matuschek <maurice.matuschek@hec.de> Date: Thu, 29 Aug 2019 09:50:40 +0200 Subject: [PATCH 12/12] fixed pathbuilding issue --- app/reporter.js | 36 +- index.js | 1029 ++++++++++++++++++++++++----------------------- 2 files changed, 549 insertions(+), 516 deletions(-) diff --git a/app/reporter.js b/app/reporter.js index 9d18c60..42daefc 100644 --- a/app/reporter.js +++ b/app/reporter.js @@ -1,6 +1,9 @@ var util = require('./util'), _ = require('underscore'), path = require('path'); +const os = require('os'); +var fs = require('fs'); +const fse = require('fs-extra'); /** Function: defaultPathBuilder * This function builds paths for a screenshot file. It is appended to the @@ -224,17 +227,12 @@ function expectFailed(rep) { var self = rep; if (!passed && self._screenshotReporter.screenshotOnFailure) { - let baseName = self._screenshotReporter.pathBuilder( - null, - [expectation.message], - null, - null - ); + let baseName = os.tmpdir(); let gUid = util.generateGuid(); let screenShotFileName = path.basename(gUid + '.png'); - let screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder); - let screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName); - self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName)); + let screenShotFilePath = path.join(baseName, self._screenshotReporter.screenshotsSubfolder); + let screenShotPath = path.join(screenShotFilePath, screenShotFileName); + self._screenshotReporter.screenshotArray.push(screenShotPath); try { browser.takeScreenshot().then(png => { util.storeScreenShot(png, screenShotPath); @@ -379,9 +377,23 @@ class Jasmine2Reporter { let considerScreenshot = !(this._screenshotReporter.takeScreenShotsOnlyForFailedSpecs && result.status === 'passed') if (considerScreenshot) { - this._screenshotReporter.screenshotArray.push(path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName)); - metaData.screenShotFile = [...this._screenshotReporter.screenshotArray]; - this._screenshotReporter.screenshotArray.length = 0; + fse.ensureDir(path.join(this._screenshotReporter.baseDirectory, screenShotFilePath)).then(()=>{ + for(let i = 0; i<this._screenshotReporter.screenshotArray.length;i++){ + let tmpFilePath = this._screenshotReporter.screenshotArray.pop(); + let fileName = tmpFilePath.replace(/^.*[\\\/]/, ''); + let newScreenshotFilePath = path.join(this._screenshotReporter.baseDirectory, screenShotFilePath, fileName); + let newFilePath = path.join(this._screenshotReporter.screenshotsSubfolder, fileName); + fs.rename(tmpFilePath,newScreenshotFilePath, err => { + if(err){throw err}; + }); + this._screenshotReporter.screenshotArray.unshift(newFilePath); + } + this._screenshotReporter.screenshotArray.push(path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName)); + metaData.screenShotFile = [...this._screenshotReporter.screenshotArray]; + this._screenshotReporter.screenshotArray.length = 0; + }).catch(err=>{ + console.log(err); + }); } if (result.browserLogs) { diff --git a/index.js b/index.js index 94269ae..222d1c5 100644 --- a/index.js +++ b/index.js @@ -243,10 +243,10 @@ module.exports = require("path"); /* 11 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(72) -var polyfills = __webpack_require__(373) -var legacy = __webpack_require__(372) -var clone = __webpack_require__(371) +var fs = __webpack_require__(57) +var polyfills = __webpack_require__(374) +var legacy = __webpack_require__(373) +var clone = __webpack_require__(372) var queue = [] @@ -267,7 +267,7 @@ else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { process.on('exit', function() { debug(queue) - __webpack_require__(142).equal(queue.length, 0) + __webpack_require__(143).equal(queue.length, 0) }) } @@ -556,7 +556,7 @@ var global = __webpack_require__(2); var hide = __webpack_require__(13); var has = __webpack_require__(17); var SRC = __webpack_require__(46)('src'); -var $toString = __webpack_require__(153); +var $toString = __webpack_require__(155); var TO_STRING = 'toString'; var TPL = ('' + $toString).split(TO_STRING); @@ -712,8 +712,8 @@ module.exports = function (it) { "use strict"; const u = __webpack_require__(16).fromCallback -const mkdirs = u(__webpack_require__(364)) -const mkdirsSync = __webpack_require__(363) +const mkdirs = u(__webpack_require__(365)) +const mkdirsSync = __webpack_require__(364) module.exports = { mkdirs: mkdirs, @@ -962,7 +962,7 @@ if (__webpack_require__(7)) { var global = __webpack_require__(2); var fails = __webpack_require__(3); var $export = __webpack_require__(0); - var $typed = __webpack_require__(69); + var $typed = __webpack_require__(70); var $buffer = __webpack_require__(96); var ctx = __webpack_require__(24); var anInstance = __webpack_require__(37); @@ -986,11 +986,11 @@ if (__webpack_require__(7)) { var uid = __webpack_require__(46); var wks = __webpack_require__(5); var createArrayMethod = __webpack_require__(27); - var createArrayIncludes = __webpack_require__(57); + var createArrayIncludes = __webpack_require__(58); var speciesConstructor = __webpack_require__(56); var ArrayIterators = __webpack_require__(99); var Iterators = __webpack_require__(49); - var $iterDetect = __webpack_require__(62); + var $iterDetect = __webpack_require__(63); var setSpecies = __webpack_require__(44); var arrayFill = __webpack_require__(74); var arrayCopyWithin = __webpack_require__(102); @@ -1890,6 +1890,12 @@ module.exports = function (O, D) { /***/ }), /* 57 */ +/***/ (function(module, exports) { + +module.exports = require("fs"); + +/***/ }), +/* 58 */ /***/ (function(module, exports, __webpack_require__) { // false -> Array#indexOf @@ -1918,7 +1924,7 @@ module.exports = function (IS_INCLUDES) { /***/ }), -/* 58 */ +/* 59 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1932,7 +1938,7 @@ var forOf = __webpack_require__(38); var anInstance = __webpack_require__(37); var isObject = __webpack_require__(4); var fails = __webpack_require__(3); -var $iterDetect = __webpack_require__(62); +var $iterDetect = __webpack_require__(63); var setToStringTag = __webpack_require__(50); var inheritIfRequired = __webpack_require__(81); @@ -2010,7 +2016,7 @@ module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { /***/ }), -/* 59 */ +/* 60 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2113,7 +2119,7 @@ module.exports = function (KEY, length, exec) { /***/ }), -/* 60 */ +/* 61 */ /***/ (function(module, exports, __webpack_require__) { // 7.2.2 IsArray(argument) @@ -2124,7 +2130,7 @@ module.exports = Array.isArray || function isArray(arg) { /***/ }), -/* 61 */ +/* 62 */ /***/ (function(module, exports, __webpack_require__) { // 7.2.8 IsRegExp(argument) @@ -2138,7 +2144,7 @@ module.exports = function (it) { /***/ }), -/* 62 */ +/* 63 */ /***/ (function(module, exports, __webpack_require__) { var ITERATOR = __webpack_require__(5)('iterator'); @@ -2166,7 +2172,7 @@ module.exports = function (exec, skipClosing) { /***/ }), -/* 63 */ +/* 64 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2182,14 +2188,14 @@ module.exports = __webpack_require__(34) || !__webpack_require__(3)(function () /***/ }), -/* 64 */ +/* 65 */ /***/ (function(module, exports) { exports.f = Object.getOwnPropertySymbols; /***/ }), -/* 65 */ +/* 66 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2217,7 +2223,7 @@ module.exports = function (R, S) { /***/ }), -/* 66 */ +/* 67 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2252,7 +2258,7 @@ module.exports = function (COLLECTION) { /***/ }), -/* 67 */ +/* 68 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2271,7 +2277,7 @@ module.exports = function (COLLECTION) { /***/ }), -/* 68 */ +/* 69 */ /***/ (function(module, exports, __webpack_require__) { var toInteger = __webpack_require__(26); @@ -2294,7 +2300,7 @@ module.exports = function (TO_STRING) { /***/ }), -/* 69 */ +/* 70 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(2); @@ -2328,7 +2334,7 @@ module.exports = { /***/ }), -/* 70 */ +/* 71 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(2); @@ -2338,14 +2344,14 @@ module.exports = navigator && navigator.userAgent || ''; /***/ }), -/* 71 */ +/* 72 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const u = __webpack_require__(16).fromCallback -const rimraf = __webpack_require__(368) +const rimraf = __webpack_require__(369) module.exports = { remove: u(rimraf), @@ -2353,19 +2359,13 @@ module.exports = { } -/***/ }), -/* 72 */ -/***/ (function(module, exports) { - -module.exports = require("fs"); - /***/ }), /* 73 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var at = __webpack_require__(68)(true); +var at = __webpack_require__(69)(true); // `AdvanceStringIndex` abstract operation // https://tc39.github.io/ecma262/#sec-advancestringindex @@ -2401,7 +2401,7 @@ module.exports = function fill(value /* , start = 0, end = @length */) { /***/ (function(module, exports, __webpack_require__) { // 9.4.2.3 ArraySpeciesCreate(originalArray, length) -var speciesConstructor = __webpack_require__(149); +var speciesConstructor = __webpack_require__(151); module.exports = function (original, length) { return new (speciesConstructor(original))(length); @@ -2836,7 +2836,7 @@ module.exports = function (key) { /***/ (function(module, exports, __webpack_require__) { // helper for String#{startsWith, endsWith, includes} -var isRegExp = __webpack_require__(61); +var isRegExp = __webpack_require__(62); var defined = __webpack_require__(28); module.exports = function (that, searchString, NAME) { @@ -2971,7 +2971,7 @@ module.exports = { var global = __webpack_require__(2); var DESCRIPTORS = __webpack_require__(7); var LIBRARY = __webpack_require__(34); -var $typed = __webpack_require__(69); +var $typed = __webpack_require__(70); var hide = __webpack_require__(13); var redefineAll = __webpack_require__(43); var fails = __webpack_require__(3); @@ -3323,7 +3323,7 @@ addToUnscopables('entries'); const u = __webpack_require__(16).fromCallback -const jsonFile = __webpack_require__(374) +const jsonFile = __webpack_require__(375) module.exports = { // jsonfile exports @@ -3722,7 +3722,7 @@ module.exports = { "use strict"; // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray -var isArray = __webpack_require__(60); +var isArray = __webpack_require__(61); var isObject = __webpack_require__(4); var toLength = __webpack_require__(6); var ctx = __webpack_require__(24); @@ -3903,7 +3903,7 @@ module.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) // 19.1.2.1 Object.assign(target, source, ...) var DESCRIPTORS = __webpack_require__(7); var getKeys = __webpack_require__(41); -var gOPS = __webpack_require__(64); +var gOPS = __webpack_require__(65); var pIE = __webpack_require__(54); var toObject = __webpack_require__(9); var IObject = __webpack_require__(53); @@ -3989,7 +3989,7 @@ module.exports.f = function getOwnPropertyNames(it) { var has = __webpack_require__(17); var toIObject = __webpack_require__(20); -var arrayIndexOf = __webpack_require__(57)(false); +var arrayIndexOf = __webpack_require__(58)(false); var IE_PROTO = __webpack_require__(91)('IE_PROTO'); module.exports = function (object, names) { @@ -4039,7 +4039,7 @@ module.exports = function (isEntries) { // all object keys, includes non-enumerable and symbols var gOPN = __webpack_require__(40); -var gOPS = __webpack_require__(64); +var gOPS = __webpack_require__(65); var anObject = __webpack_require__(1); var Reflect = __webpack_require__(2).Reflect; module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) { @@ -4176,7 +4176,7 @@ var validate = __webpack_require__(47); var MAP = 'Map'; // 23.1 Map Objects -module.exports = __webpack_require__(58)(MAP, function (get) { +module.exports = __webpack_require__(59)(MAP, function (get) { return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; }, { // 23.1.3.6 Map.prototype.get(key) @@ -4229,7 +4229,7 @@ var validate = __webpack_require__(47); var SET = 'Set'; // 23.2 Set Objects -module.exports = __webpack_require__(58)(SET, function (get) { +module.exports = __webpack_require__(59)(SET, function (get) { return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; }, { // 23.2.3.1 Set.prototype.add(value) @@ -4283,7 +4283,7 @@ var methods = { }; // 23.3 WeakMap Objects -var $WeakMap = module.exports = __webpack_require__(58)(WEAK_MAP, wrapper, methods, weak, true, true); +var $WeakMap = module.exports = __webpack_require__(59)(WEAK_MAP, wrapper, methods, weak, true, true); // IE11 WeakMap frozen keys fix if (NATIVE_WEAK_MAP && IS_IE11) { @@ -4311,7 +4311,7 @@ if (NATIVE_WEAK_MAP && IS_IE11) { /***/ (function(module, exports, __webpack_require__) { module.exports = { - copySync: __webpack_require__(349) + copySync: __webpack_require__(351) } @@ -4323,7 +4323,7 @@ module.exports = { var fs = __webpack_require__(11) var path = __webpack_require__(10) -var utimes = __webpack_require__(370) +var utimes = __webpack_require__(371) function ncp (source, dest, options, callback) { if (!callback) { @@ -4629,6 +4629,35 @@ exports.exists = function (filename, callback) { "use strict"; +const assign = __webpack_require__(370) + +const fs = {} + +// Export graceful-fs: +assign(fs, __webpack_require__(139)) +// Export extra methods: +assign(fs, __webpack_require__(353)) +assign(fs, __webpack_require__(137)) +assign(fs, __webpack_require__(21)) +assign(fs, __webpack_require__(72)) +assign(fs, __webpack_require__(361)) +assign(fs, __webpack_require__(367)) +assign(fs, __webpack_require__(366)) +assign(fs, __webpack_require__(354)) +assign(fs, __webpack_require__(356)) +assign(fs, __webpack_require__(368)) +assign(fs, __webpack_require__(36)) + +module.exports = fs + + +/***/ }), +/* 141 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + const path = __webpack_require__(10) // get drive on windows @@ -4655,7 +4684,7 @@ module.exports = { /***/ }), -/* 141 */ +/* 142 */ /***/ (function(module, exports) { /* eslint-disable node/no-deprecated-api */ @@ -4672,13 +4701,19 @@ module.exports = function (size) { /***/ }), -/* 142 */ +/* 143 */ /***/ (function(module, exports) { module.exports = require("assert"); /***/ }), -/* 143 */ +/* 144 */ +/***/ (function(module, exports) { + +module.exports = require("os"); + +/***/ }), +/* 145 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4692,9 +4727,12 @@ function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, a function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var util = __webpack_require__(145), - _ = __webpack_require__(375), +var util = __webpack_require__(147), + _ = __webpack_require__(376), path = __webpack_require__(10); +var os = __webpack_require__(144); +var fs = __webpack_require__(57); +var fse = __webpack_require__(140); /** Function: defaultPathBuilder * This function builds paths for a screenshot file. It is appended to the @@ -4913,12 +4951,12 @@ function expectFailed(rep) { var self = rep; if (!passed && self._screenshotReporter.screenshotOnFailure) { - var baseName = self._screenshotReporter.pathBuilder(null, [expectation.message], null, null); + var baseName = os.tmpdir(); var gUid = util.generateGuid(); var screenShotFileName = path.basename(gUid + '.png'); - var screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder); - var screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName); - self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName)); + var screenShotFilePath = path.join(baseName, self._screenshotReporter.screenshotsSubfolder); + var screenShotPath = path.join(screenShotFilePath, screenShotFileName); + self._screenshotReporter.screenshotArray.push(screenShotPath); try { browser.takeScreenshot().then(function (png) { util.storeScreenShot(png, screenShotPath); @@ -5188,6 +5226,8 @@ var Jasmine2Reporter = function () { key: '_takeScreenShotAndAddMetaData', value: function () { var _ref9 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8(result) { + var _this6 = this; + var capabilities, suite, descriptions, baseName, metaData, screenShotFileName, screenShotFilePath, metaFile, screenShotPath, metaDataPath, jsonPartsPath, considerScreenshot, testWasExecuted, png; return regeneratorRuntime.wrap(function _callee8$(_context8) { while (1) { @@ -5216,9 +5256,25 @@ var Jasmine2Reporter = function () { if (considerScreenshot) { - this._screenshotReporter.screenshotArray.push(path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName)); - metaData.screenShotFile = [].concat(_toConsumableArray(this._screenshotReporter.screenshotArray)); - this._screenshotReporter.screenshotArray.length = 0; + fse.ensureDir(path.join(this._screenshotReporter.baseDirectory, screenShotFilePath)).then(function () { + for (var i = 0; i < _this6._screenshotReporter.screenshotArray.length; i++) { + var tmpFilePath = _this6._screenshotReporter.screenshotArray.pop(); + var fileName = tmpFilePath.replace(/^.*[\\\/]/, ''); + var newScreenshotFilePath = path.join(_this6._screenshotReporter.baseDirectory, screenShotFilePath, fileName); + var newFilePath = path.join(_this6._screenshotReporter.screenshotsSubfolder, fileName); + fs.rename(tmpFilePath, newScreenshotFilePath, function (err) { + if (err) { + throw err; + }; + }); + _this6._screenshotReporter.screenshotArray.unshift(newFilePath); + } + _this6._screenshotReporter.screenshotArray.push(path.join(_this6._screenshotReporter.screenshotsSubfolder, screenShotFileName)); + metaData.screenShotFile = [].concat(_toConsumableArray(_this6._screenshotReporter.screenshotArray)); + _this6._screenshotReporter.screenshotArray.length = 0; + }).catch(function (err) { + console.log(err); + }); } if (result.browserLogs) { @@ -5329,18 +5385,18 @@ function nowString() { module.exports = ScreenshotReporter; /***/ }), -/* 144 */ +/* 146 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__(347); - -__webpack_require__(146); +__webpack_require__(349); __webpack_require__(148); +__webpack_require__(150); + /* eslint max-len: 0 */ if (global._babelPolyfill) { @@ -5367,14 +5423,14 @@ define(String.prototype, "padRight", "".padEnd); }); /***/ }), -/* 145 */ +/* 147 */ /***/ (function(module, exports, __webpack_require__) { -const fs = __webpack_require__(72); +const fs = __webpack_require__(57); const path = __webpack_require__(10); -const crypto = __webpack_require__(377); -const CircularJSON = __webpack_require__(147); -const fse = __webpack_require__(359); +const crypto = __webpack_require__(378); +const CircularJSON = __webpack_require__(149); +const fse = __webpack_require__(140); /** Function: storeScreenShot @@ -5641,7 +5697,7 @@ module.exports = { /***/ }), -/* 146 */ +/* 148 */ /***/ (function(module, exports) { /** @@ -6316,7 +6372,7 @@ module.exports = { /***/ }), -/* 147 */ +/* 149 */ /***/ (function(module, exports) { /*! @@ -6506,19 +6562,19 @@ this.stringify = stringifyRecursion; this.parse = parseRecursion; /***/ }), -/* 148 */ +/* 150 */ /***/ (function(module, exports, __webpack_require__) { -__webpack_require__(155); +__webpack_require__(157); module.exports = __webpack_require__(23).RegExp.escape; /***/ }), -/* 149 */ +/* 151 */ /***/ (function(module, exports, __webpack_require__) { var isObject = __webpack_require__(4); -var isArray = __webpack_require__(60); +var isArray = __webpack_require__(61); var SPECIES = __webpack_require__(5)('species'); module.exports = function (original) { @@ -6536,7 +6592,7 @@ module.exports = function (original) { /***/ }), -/* 150 */ +/* 152 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6569,7 +6625,7 @@ module.exports = (fails(function () { /***/ }), -/* 151 */ +/* 153 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6585,12 +6641,12 @@ module.exports = function (hint) { /***/ }), -/* 152 */ +/* 154 */ /***/ (function(module, exports, __webpack_require__) { // all enumerable object keys, includes symbols var getKeys = __webpack_require__(41); -var gOPS = __webpack_require__(64); +var gOPS = __webpack_require__(65); var pIE = __webpack_require__(54); module.exports = function (it) { var result = getKeys(it); @@ -6606,14 +6662,14 @@ module.exports = function (it) { /***/ }), -/* 153 */ +/* 155 */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(55)('native-function-to-string', Function.toString); /***/ }), -/* 154 */ +/* 156 */ /***/ (function(module, exports) { module.exports = function (regExp, replace) { @@ -6627,18 +6683,18 @@ module.exports = function (regExp, replace) { /***/ }), -/* 155 */ +/* 157 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/benjamingr/RexExp.escape var $export = __webpack_require__(0); -var $re = __webpack_require__(154)(/[\\^$*+?.()|[\]{}]/g, '\\$&'); +var $re = __webpack_require__(156)(/[\\^$*+?.()|[\]{}]/g, '\\$&'); $export($export.S, 'RegExp', { escape: function escape(it) { return $re(it); } }); /***/ }), -/* 156 */ +/* 158 */ /***/ (function(module, exports, __webpack_require__) { // 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length) @@ -6650,7 +6706,7 @@ __webpack_require__(33)('copyWithin'); /***/ }), -/* 157 */ +/* 159 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6667,7 +6723,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].every, true), 'Array /***/ }), -/* 158 */ +/* 160 */ /***/ (function(module, exports, __webpack_require__) { // 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length) @@ -6679,7 +6735,7 @@ __webpack_require__(33)('fill'); /***/ }), -/* 159 */ +/* 161 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6696,7 +6752,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].filter, true), 'Arra /***/ }), -/* 160 */ +/* 162 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6717,7 +6773,7 @@ __webpack_require__(33)(KEY); /***/ }), -/* 161 */ +/* 163 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6738,7 +6794,7 @@ __webpack_require__(33)(KEY); /***/ }), -/* 162 */ +/* 164 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6756,7 +6812,7 @@ $export($export.P + $export.F * !STRICT, 'Array', { /***/ }), -/* 163 */ +/* 165 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6770,7 +6826,7 @@ var toLength = __webpack_require__(6); var createProperty = __webpack_require__(76); var getIterFn = __webpack_require__(98); -$export($export.S + $export.F * !__webpack_require__(62)(function (iter) { Array.from(iter); }), 'Array', { +$export($export.S + $export.F * !__webpack_require__(63)(function (iter) { Array.from(iter); }), 'Array', { // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { var O = toObject(arrayLike); @@ -6800,13 +6856,13 @@ $export($export.S + $export.F * !__webpack_require__(62)(function (iter) { Array /***/ }), -/* 164 */ +/* 166 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); -var $indexOf = __webpack_require__(57)(false); +var $indexOf = __webpack_require__(58)(false); var $native = [].indexOf; var NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0; @@ -6822,17 +6878,17 @@ $export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(25)($nati /***/ }), -/* 165 */ +/* 167 */ /***/ (function(module, exports, __webpack_require__) { // 22.1.2.2 / 15.4.3.2 Array.isArray(arg) var $export = __webpack_require__(0); -$export($export.S, 'Array', { isArray: __webpack_require__(60) }); +$export($export.S, 'Array', { isArray: __webpack_require__(61) }); /***/ }), -/* 166 */ +/* 168 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6851,7 +6907,7 @@ $export($export.P + $export.F * (__webpack_require__(53) != Object || !__webpack /***/ }), -/* 167 */ +/* 169 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6880,7 +6936,7 @@ $export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(25)($nati /***/ }), -/* 168 */ +/* 170 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6897,7 +6953,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].map, true), 'Array', /***/ }), -/* 169 */ +/* 171 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6923,7 +6979,7 @@ $export($export.S + $export.F * __webpack_require__(3)(function () { /***/ }), -/* 170 */ +/* 172 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6940,7 +6996,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].reduceRight, true), /***/ }), -/* 171 */ +/* 173 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6957,7 +7013,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].reduce, true), 'Arra /***/ }), -/* 172 */ +/* 174 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -6992,7 +7048,7 @@ $export($export.P + $export.F * __webpack_require__(3)(function () { /***/ }), -/* 173 */ +/* 175 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7009,7 +7065,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].some, true), 'Array' /***/ }), -/* 174 */ +/* 176 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7039,14 +7095,14 @@ $export($export.P + $export.F * (fails(function () { /***/ }), -/* 175 */ +/* 177 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(44)('Array'); /***/ }), -/* 176 */ +/* 178 */ /***/ (function(module, exports, __webpack_require__) { // 20.3.3.1 / 15.9.4.4 Date.now() @@ -7056,12 +7112,12 @@ $export($export.S, 'Date', { now: function () { return new Date().getTime(); } } /***/ }), -/* 177 */ +/* 179 */ /***/ (function(module, exports, __webpack_require__) { // 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString() var $export = __webpack_require__(0); -var toISOString = __webpack_require__(150); +var toISOString = __webpack_require__(152); // PhantomJS / old WebKit has a broken implementations $export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', { @@ -7070,7 +7126,7 @@ $export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'D /***/ }), -/* 178 */ +/* 180 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7093,17 +7149,17 @@ $export($export.P + $export.F * __webpack_require__(3)(function () { /***/ }), -/* 179 */ +/* 181 */ /***/ (function(module, exports, __webpack_require__) { var TO_PRIMITIVE = __webpack_require__(5)('toPrimitive'); var proto = Date.prototype; -if (!(TO_PRIMITIVE in proto)) __webpack_require__(13)(proto, TO_PRIMITIVE, __webpack_require__(151)); +if (!(TO_PRIMITIVE in proto)) __webpack_require__(13)(proto, TO_PRIMITIVE, __webpack_require__(153)); /***/ }), -/* 180 */ +/* 182 */ /***/ (function(module, exports, __webpack_require__) { var DateProto = Date.prototype; @@ -7121,7 +7177,7 @@ if (new Date(NaN) + '' != INVALID_DATE) { /***/ }), -/* 181 */ +/* 183 */ /***/ (function(module, exports, __webpack_require__) { // 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...) @@ -7131,7 +7187,7 @@ $export($export.P, 'Function', { bind: __webpack_require__(105) }); /***/ }), -/* 182 */ +/* 184 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7151,7 +7207,7 @@ if (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(8).f(FunctionProto, HA /***/ }), -/* 183 */ +/* 185 */ /***/ (function(module, exports, __webpack_require__) { var dP = __webpack_require__(8).f; @@ -7173,7 +7229,7 @@ NAME in FProto || __webpack_require__(7) && dP(FProto, NAME, { /***/ }), -/* 184 */ +/* 186 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.3 Math.acosh(x) @@ -7197,7 +7253,7 @@ $export($export.S + $export.F * !($acosh /***/ }), -/* 185 */ +/* 187 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.5 Math.asinh(x) @@ -7213,7 +7269,7 @@ $export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: /***/ }), -/* 186 */ +/* 188 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.7 Math.atanh(x) @@ -7229,7 +7285,7 @@ $export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', { /***/ }), -/* 187 */ +/* 189 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.9 Math.cbrt(x) @@ -7244,7 +7300,7 @@ $export($export.S, 'Math', { /***/ }), -/* 188 */ +/* 190 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.11 Math.clz32(x) @@ -7258,7 +7314,7 @@ $export($export.S, 'Math', { /***/ }), -/* 189 */ +/* 191 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.12 Math.cosh(x) @@ -7273,7 +7329,7 @@ $export($export.S, 'Math', { /***/ }), -/* 190 */ +/* 192 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.14 Math.expm1(x) @@ -7284,7 +7340,7 @@ $export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 /***/ }), -/* 191 */ +/* 193 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.16 Math.fround(x) @@ -7294,7 +7350,7 @@ $export($export.S, 'Math', { fround: __webpack_require__(115) }); /***/ }), -/* 192 */ +/* 194 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.17 Math.hypot([value1[, value2[, … ]]]) @@ -7325,7 +7381,7 @@ $export($export.S, 'Math', { /***/ }), -/* 193 */ +/* 195 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.18 Math.imul(x, y) @@ -7348,7 +7404,7 @@ $export($export.S + $export.F * __webpack_require__(3)(function () { /***/ }), -/* 194 */ +/* 196 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.21 Math.log10(x) @@ -7362,7 +7418,7 @@ $export($export.S, 'Math', { /***/ }), -/* 195 */ +/* 197 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.20 Math.log1p(x) @@ -7372,7 +7428,7 @@ $export($export.S, 'Math', { log1p: __webpack_require__(116) }); /***/ }), -/* 196 */ +/* 198 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.22 Math.log2(x) @@ -7386,7 +7442,7 @@ $export($export.S, 'Math', { /***/ }), -/* 197 */ +/* 199 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.28 Math.sign(x) @@ -7396,7 +7452,7 @@ $export($export.S, 'Math', { sign: __webpack_require__(86) }); /***/ }), -/* 198 */ +/* 200 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.30 Math.sinh(x) @@ -7417,7 +7473,7 @@ $export($export.S + $export.F * __webpack_require__(3)(function () { /***/ }), -/* 199 */ +/* 201 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.33 Math.tanh(x) @@ -7435,7 +7491,7 @@ $export($export.S, 'Math', { /***/ }), -/* 200 */ +/* 202 */ /***/ (function(module, exports, __webpack_require__) { // 20.2.2.34 Math.trunc(x) @@ -7449,7 +7505,7 @@ $export($export.S, 'Math', { /***/ }), -/* 201 */ +/* 203 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7525,7 +7581,7 @@ if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) { /***/ }), -/* 202 */ +/* 204 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.1 Number.EPSILON @@ -7535,7 +7591,7 @@ $export($export.S, 'Number', { EPSILON: Math.pow(2, -52) }); /***/ }), -/* 203 */ +/* 205 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.2 Number.isFinite(number) @@ -7550,7 +7606,7 @@ $export($export.S, 'Number', { /***/ }), -/* 204 */ +/* 206 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.3 Number.isInteger(number) @@ -7560,7 +7616,7 @@ $export($export.S, 'Number', { isInteger: __webpack_require__(112) }); /***/ }), -/* 205 */ +/* 207 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.4 Number.isNaN(number) @@ -7575,7 +7631,7 @@ $export($export.S, 'Number', { /***/ }), -/* 206 */ +/* 208 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.5 Number.isSafeInteger(number) @@ -7591,7 +7647,7 @@ $export($export.S, 'Number', { /***/ }), -/* 207 */ +/* 209 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.6 Number.MAX_SAFE_INTEGER @@ -7601,7 +7657,7 @@ $export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff }); /***/ }), -/* 208 */ +/* 210 */ /***/ (function(module, exports, __webpack_require__) { // 20.1.2.10 Number.MIN_SAFE_INTEGER @@ -7611,7 +7667,7 @@ $export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff }); /***/ }), -/* 209 */ +/* 211 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); @@ -7621,7 +7677,7 @@ $export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { /***/ }), -/* 210 */ +/* 212 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); @@ -7631,7 +7687,7 @@ $export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { pars /***/ }), -/* 211 */ +/* 213 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7752,7 +7808,7 @@ $export($export.P + $export.F * (!!$toFixed && ( /***/ }), -/* 212 */ +/* 214 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7777,7 +7833,7 @@ $export($export.P + $export.F * ($fails(function () { /***/ }), -/* 213 */ +/* 215 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.3.1 Object.assign(target, source) @@ -7787,7 +7843,7 @@ $export($export.S + $export.F, 'Object', { assign: __webpack_require__(118) }); /***/ }), -/* 214 */ +/* 216 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); @@ -7796,7 +7852,7 @@ $export($export.S, 'Object', { create: __webpack_require__(39) }); /***/ }), -/* 215 */ +/* 217 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); @@ -7805,7 +7861,7 @@ $export($export.S + $export.F * !__webpack_require__(7), 'Object', { definePrope /***/ }), -/* 216 */ +/* 218 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); @@ -7814,7 +7870,7 @@ $export($export.S + $export.F * !__webpack_require__(7), 'Object', { definePrope /***/ }), -/* 217 */ +/* 219 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.5 Object.freeze(O) @@ -7829,7 +7885,7 @@ __webpack_require__(29)('freeze', function ($freeze) { /***/ }), -/* 218 */ +/* 220 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) @@ -7844,7 +7900,7 @@ __webpack_require__(29)('getOwnPropertyDescriptor', function () { /***/ }), -/* 219 */ +/* 221 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.7 Object.getOwnPropertyNames(O) @@ -7854,7 +7910,7 @@ __webpack_require__(29)('getOwnPropertyNames', function () { /***/ }), -/* 220 */ +/* 222 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.9 Object.getPrototypeOf(O) @@ -7869,7 +7925,7 @@ __webpack_require__(29)('getPrototypeOf', function () { /***/ }), -/* 221 */ +/* 223 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.11 Object.isExtensible(O) @@ -7883,7 +7939,7 @@ __webpack_require__(29)('isExtensible', function ($isExtensible) { /***/ }), -/* 222 */ +/* 224 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.12 Object.isFrozen(O) @@ -7897,7 +7953,7 @@ __webpack_require__(29)('isFrozen', function ($isFrozen) { /***/ }), -/* 223 */ +/* 225 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.13 Object.isSealed(O) @@ -7911,7 +7967,7 @@ __webpack_require__(29)('isSealed', function ($isSealed) { /***/ }), -/* 224 */ +/* 226 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.3.10 Object.is(value1, value2) @@ -7920,7 +7976,7 @@ $export($export.S, 'Object', { is: __webpack_require__(128) }); /***/ }), -/* 225 */ +/* 227 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.14 Object.keys(O) @@ -7935,7 +7991,7 @@ __webpack_require__(29)('keys', function () { /***/ }), -/* 226 */ +/* 228 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.15 Object.preventExtensions(O) @@ -7950,7 +8006,7 @@ __webpack_require__(29)('preventExtensions', function ($preventExtensions) { /***/ }), -/* 227 */ +/* 229 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.2.17 Object.seal(O) @@ -7965,7 +8021,7 @@ __webpack_require__(29)('seal', function ($seal) { /***/ }), -/* 228 */ +/* 230 */ /***/ (function(module, exports, __webpack_require__) { // 19.1.3.19 Object.setPrototypeOf(O, proto) @@ -7974,7 +8030,7 @@ $export($export.S, 'Object', { setPrototypeOf: __webpack_require__(90).set }); /***/ }), -/* 229 */ +/* 231 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -7991,7 +8047,7 @@ if (test + '' != '[object z]') { /***/ }), -/* 230 */ +/* 232 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); @@ -8001,7 +8057,7 @@ $export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $pars /***/ }), -/* 231 */ +/* 233 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); @@ -8011,7 +8067,7 @@ $export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt } /***/ }), -/* 232 */ +/* 234 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8030,7 +8086,7 @@ var task = __webpack_require__(95).set; var microtask = __webpack_require__(87)(); var newPromiseCapabilityModule = __webpack_require__(88); var perform = __webpack_require__(126); -var userAgent = __webpack_require__(70); +var userAgent = __webpack_require__(71); var promiseResolve = __webpack_require__(127); var PROMISE = 'Promise'; var TypeError = global.TypeError; @@ -8257,7 +8313,7 @@ $export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x); } }); -$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(62)(function (iter) { +$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(63)(function (iter) { $Promise.all(iter)['catch'](empty); })), PROMISE, { // 25.4.4.1 Promise.all(iterable) @@ -8304,7 +8360,7 @@ $export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(62)(function /***/ }), -/* 233 */ +/* 235 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.1 Reflect.apply(target, thisArgument, argumentsList) @@ -8326,7 +8382,7 @@ $export($export.S + $export.F * !__webpack_require__(3)(function () { /***/ }), -/* 234 */ +/* 236 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.2 Reflect.construct(target, argumentsList [, newTarget]) @@ -8379,7 +8435,7 @@ $export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', { /***/ }), -/* 235 */ +/* 237 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.3 Reflect.defineProperty(target, propertyKey, attributes) @@ -8408,7 +8464,7 @@ $export($export.S + $export.F * __webpack_require__(3)(function () { /***/ }), -/* 236 */ +/* 238 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.4 Reflect.deleteProperty(target, propertyKey) @@ -8425,7 +8481,7 @@ $export($export.S, 'Reflect', { /***/ }), -/* 237 */ +/* 239 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8458,7 +8514,7 @@ $export($export.S, 'Reflect', { /***/ }), -/* 238 */ +/* 240 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey) @@ -8474,7 +8530,7 @@ $export($export.S, 'Reflect', { /***/ }), -/* 239 */ +/* 241 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.8 Reflect.getPrototypeOf(target) @@ -8490,7 +8546,7 @@ $export($export.S, 'Reflect', { /***/ }), -/* 240 */ +/* 242 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.6 Reflect.get(target, propertyKey [, receiver]) @@ -8517,7 +8573,7 @@ $export($export.S, 'Reflect', { get: get }); /***/ }), -/* 241 */ +/* 243 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.9 Reflect.has(target, propertyKey) @@ -8531,7 +8587,7 @@ $export($export.S, 'Reflect', { /***/ }), -/* 242 */ +/* 244 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.10 Reflect.isExtensible(target) @@ -8548,7 +8604,7 @@ $export($export.S, 'Reflect', { /***/ }), -/* 243 */ +/* 245 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.11 Reflect.ownKeys(target) @@ -8558,7 +8614,7 @@ $export($export.S, 'Reflect', { ownKeys: __webpack_require__(123) }); /***/ }), -/* 244 */ +/* 246 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.12 Reflect.preventExtensions(target) @@ -8580,7 +8636,7 @@ $export($export.S, 'Reflect', { /***/ }), -/* 245 */ +/* 247 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.14 Reflect.setPrototypeOf(target, proto) @@ -8601,7 +8657,7 @@ if (setProto) $export($export.S, 'Reflect', { /***/ }), -/* 246 */ +/* 248 */ /***/ (function(module, exports, __webpack_require__) { // 26.1.13 Reflect.set(target, propertyKey, V [, receiver]) @@ -8640,14 +8696,14 @@ $export($export.S, 'Reflect', { set: set }); /***/ }), -/* 247 */ +/* 249 */ /***/ (function(module, exports, __webpack_require__) { var global = __webpack_require__(2); var inheritIfRequired = __webpack_require__(81); var dP = __webpack_require__(8).f; var gOPN = __webpack_require__(40).f; -var isRegExp = __webpack_require__(61); +var isRegExp = __webpack_require__(62); var $flags = __webpack_require__(52); var $RegExp = global.RegExp; var Base = $RegExp; @@ -8689,7 +8745,7 @@ __webpack_require__(44)('RegExp'); /***/ }), -/* 248 */ +/* 250 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8698,10 +8754,10 @@ __webpack_require__(44)('RegExp'); var anObject = __webpack_require__(1); var toLength = __webpack_require__(6); var advanceStringIndex = __webpack_require__(73); -var regExpExec = __webpack_require__(65); +var regExpExec = __webpack_require__(66); // @@match logic -__webpack_require__(59)('match', 1, function (defined, MATCH, $match, maybeCallNative) { +__webpack_require__(60)('match', 1, function (defined, MATCH, $match, maybeCallNative) { return [ // `String.prototype.match` method // https://tc39.github.io/ecma262/#sec-string.prototype.match @@ -8736,7 +8792,7 @@ __webpack_require__(59)('match', 1, function (defined, MATCH, $match, maybeCallN /***/ }), -/* 249 */ +/* 251 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8747,7 +8803,7 @@ var toObject = __webpack_require__(9); var toLength = __webpack_require__(6); var toInteger = __webpack_require__(26); var advanceStringIndex = __webpack_require__(73); -var regExpExec = __webpack_require__(65); +var regExpExec = __webpack_require__(66); var max = Math.max; var min = Math.min; var floor = Math.floor; @@ -8759,7 +8815,7 @@ var maybeToString = function (it) { }; // @@replace logic -__webpack_require__(59)('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) { +__webpack_require__(60)('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) { return [ // `String.prototype.replace` method // https://tc39.github.io/ecma262/#sec-string.prototype.replace @@ -8861,7 +8917,7 @@ __webpack_require__(59)('replace', 2, function (defined, REPLACE, $replace, mayb /***/ }), -/* 250 */ +/* 252 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8869,10 +8925,10 @@ __webpack_require__(59)('replace', 2, function (defined, REPLACE, $replace, mayb var anObject = __webpack_require__(1); var sameValue = __webpack_require__(128); -var regExpExec = __webpack_require__(65); +var regExpExec = __webpack_require__(66); // @@search logic -__webpack_require__(59)('search', 1, function (defined, SEARCH, $search, maybeCallNative) { +__webpack_require__(60)('search', 1, function (defined, SEARCH, $search, maybeCallNative) { return [ // `String.prototype.search` method // https://tc39.github.io/ecma262/#sec-string.prototype.search @@ -8899,18 +8955,18 @@ __webpack_require__(59)('search', 1, function (defined, SEARCH, $search, maybeCa /***/ }), -/* 251 */ +/* 253 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isRegExp = __webpack_require__(61); +var isRegExp = __webpack_require__(62); var anObject = __webpack_require__(1); var speciesConstructor = __webpack_require__(56); var advanceStringIndex = __webpack_require__(73); var toLength = __webpack_require__(6); -var callRegExpExec = __webpack_require__(65); +var callRegExpExec = __webpack_require__(66); var regexpExec = __webpack_require__(89); var fails = __webpack_require__(3); var $min = Math.min; @@ -8924,7 +8980,7 @@ var MAX_UINT32 = 0xffffffff; var SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); }); // @@split logic -__webpack_require__(59)('split', 2, function (defined, SPLIT, $split, maybeCallNative) { +__webpack_require__(60)('split', 2, function (defined, SPLIT, $split, maybeCallNative) { var internalSplit; if ( 'abbc'[$SPLIT](/(b)*/)[1] == 'c' || @@ -9040,7 +9096,7 @@ __webpack_require__(59)('split', 2, function (defined, SPLIT, $split, maybeCallN /***/ }), -/* 252 */ +/* 254 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9072,7 +9128,7 @@ if (__webpack_require__(3)(function () { return $toString.call({ source: 'a', fl /***/ }), -/* 253 */ +/* 255 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9086,7 +9142,7 @@ __webpack_require__(15)('anchor', function (createHTML) { /***/ }), -/* 254 */ +/* 256 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9100,7 +9156,7 @@ __webpack_require__(15)('big', function (createHTML) { /***/ }), -/* 255 */ +/* 257 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9114,7 +9170,7 @@ __webpack_require__(15)('blink', function (createHTML) { /***/ }), -/* 256 */ +/* 258 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9128,13 +9184,13 @@ __webpack_require__(15)('bold', function (createHTML) { /***/ }), -/* 257 */ +/* 259 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); -var $at = __webpack_require__(68)(false); +var $at = __webpack_require__(69)(false); $export($export.P, 'String', { // 21.1.3.3 String.prototype.codePointAt(pos) codePointAt: function codePointAt(pos) { @@ -9144,7 +9200,7 @@ $export($export.P, 'String', { /***/ }), -/* 258 */ +/* 260 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9171,7 +9227,7 @@ $export($export.P + $export.F * __webpack_require__(79)(ENDS_WITH), 'String', { /***/ }), -/* 259 */ +/* 261 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9185,7 +9241,7 @@ __webpack_require__(15)('fixed', function (createHTML) { /***/ }), -/* 260 */ +/* 262 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9199,7 +9255,7 @@ __webpack_require__(15)('fontcolor', function (createHTML) { /***/ }), -/* 261 */ +/* 263 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9213,7 +9269,7 @@ __webpack_require__(15)('fontsize', function (createHTML) { /***/ }), -/* 262 */ +/* 264 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); @@ -9242,7 +9298,7 @@ $export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1) /***/ }), -/* 263 */ +/* 265 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9261,7 +9317,7 @@ $export($export.P + $export.F * __webpack_require__(79)(INCLUDES), 'String', { /***/ }), -/* 264 */ +/* 266 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9275,12 +9331,12 @@ __webpack_require__(15)('italics', function (createHTML) { /***/ }), -/* 265 */ +/* 267 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var $at = __webpack_require__(68)(true); +var $at = __webpack_require__(69)(true); // 21.1.3.27 String.prototype[@@iterator]() __webpack_require__(84)(String, 'String', function (iterated) { @@ -9299,7 +9355,7 @@ __webpack_require__(84)(String, 'String', function (iterated) { /***/ }), -/* 266 */ +/* 268 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9313,7 +9369,7 @@ __webpack_require__(15)('link', function (createHTML) { /***/ }), -/* 267 */ +/* 269 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); @@ -9337,7 +9393,7 @@ $export($export.S, 'String', { /***/ }), -/* 268 */ +/* 270 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); @@ -9349,7 +9405,7 @@ $export($export.P, 'String', { /***/ }), -/* 269 */ +/* 271 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9363,7 +9419,7 @@ __webpack_require__(15)('small', function (createHTML) { /***/ }), -/* 270 */ +/* 272 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9388,7 +9444,7 @@ $export($export.P + $export.F * __webpack_require__(79)(STARTS_WITH), 'String', /***/ }), -/* 271 */ +/* 273 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9402,7 +9458,7 @@ __webpack_require__(15)('strike', function (createHTML) { /***/ }), -/* 272 */ +/* 274 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9416,7 +9472,7 @@ __webpack_require__(15)('sub', function (createHTML) { /***/ }), -/* 273 */ +/* 275 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9430,7 +9486,7 @@ __webpack_require__(15)('sup', function (createHTML) { /***/ }), -/* 274 */ +/* 276 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9444,7 +9500,7 @@ __webpack_require__(51)('trim', function ($trim) { /***/ }), -/* 275 */ +/* 277 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9463,8 +9519,8 @@ var uid = __webpack_require__(46); var wks = __webpack_require__(5); var wksExt = __webpack_require__(131); var wksDefine = __webpack_require__(97); -var enumKeys = __webpack_require__(152); -var isArray = __webpack_require__(60); +var enumKeys = __webpack_require__(154); +var isArray = __webpack_require__(61); var anObject = __webpack_require__(1); var isObject = __webpack_require__(4); var toObject = __webpack_require__(9); @@ -9474,7 +9530,7 @@ var createDesc = __webpack_require__(42); var _create = __webpack_require__(39); var gOPNExt = __webpack_require__(120); var $GOPD = __webpack_require__(18); -var $GOPS = __webpack_require__(64); +var $GOPS = __webpack_require__(65); var $DP = __webpack_require__(8); var $keys = __webpack_require__(41); var gOPD = $GOPD.f; @@ -9697,13 +9753,13 @@ setToStringTag(global.JSON, 'JSON', true); /***/ }), -/* 276 */ +/* 278 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var $export = __webpack_require__(0); -var $typed = __webpack_require__(69); +var $typed = __webpack_require__(70); var buffer = __webpack_require__(96); var anObject = __webpack_require__(1); var toAbsoluteIndex = __webpack_require__(45); @@ -9750,17 +9806,17 @@ __webpack_require__(44)(ARRAY_BUFFER); /***/ }), -/* 277 */ +/* 279 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); -$export($export.G + $export.W + $export.F * !__webpack_require__(69).ABV, { +$export($export.G + $export.W + $export.F * !__webpack_require__(70).ABV, { DataView: __webpack_require__(96).DataView }); /***/ }), -/* 278 */ +/* 280 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(32)('Float32', 4, function (init) { @@ -9771,7 +9827,7 @@ __webpack_require__(32)('Float32', 4, function (init) { /***/ }), -/* 279 */ +/* 281 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(32)('Float64', 8, function (init) { @@ -9782,7 +9838,7 @@ __webpack_require__(32)('Float64', 8, function (init) { /***/ }), -/* 280 */ +/* 282 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(32)('Int16', 2, function (init) { @@ -9793,7 +9849,7 @@ __webpack_require__(32)('Int16', 2, function (init) { /***/ }), -/* 281 */ +/* 283 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(32)('Int32', 4, function (init) { @@ -9804,7 +9860,7 @@ __webpack_require__(32)('Int32', 4, function (init) { /***/ }), -/* 282 */ +/* 284 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(32)('Int8', 1, function (init) { @@ -9815,7 +9871,7 @@ __webpack_require__(32)('Int8', 1, function (init) { /***/ }), -/* 283 */ +/* 285 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(32)('Uint16', 2, function (init) { @@ -9826,7 +9882,7 @@ __webpack_require__(32)('Uint16', 2, function (init) { /***/ }), -/* 284 */ +/* 286 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(32)('Uint32', 4, function (init) { @@ -9837,7 +9893,7 @@ __webpack_require__(32)('Uint32', 4, function (init) { /***/ }), -/* 285 */ +/* 287 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(32)('Uint8', 1, function (init) { @@ -9848,7 +9904,7 @@ __webpack_require__(32)('Uint8', 1, function (init) { /***/ }), -/* 286 */ +/* 288 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(32)('Uint8', 1, function (init) { @@ -9859,7 +9915,7 @@ __webpack_require__(32)('Uint8', 1, function (init) { /***/ }), -/* 287 */ +/* 289 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9869,7 +9925,7 @@ var validate = __webpack_require__(47); var WEAK_SET = 'WeakSet'; // 23.4 WeakSet Objects -__webpack_require__(58)(WEAK_SET, function (get) { +__webpack_require__(59)(WEAK_SET, function (get) { return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; }, { // 23.4.3.1 WeakSet.prototype.add(value) @@ -9880,7 +9936,7 @@ __webpack_require__(58)(WEAK_SET, function (get) { /***/ }), -/* 288 */ +/* 290 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9909,7 +9965,7 @@ __webpack_require__(33)('flatMap'); /***/ }), -/* 289 */ +/* 291 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -9937,14 +9993,14 @@ __webpack_require__(33)('flatten'); /***/ }), -/* 290 */ +/* 292 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/tc39/Array.prototype.includes var $export = __webpack_require__(0); -var $includes = __webpack_require__(57)(true); +var $includes = __webpack_require__(58)(true); $export($export.P, 'Array', { includes: function includes(el /* , fromIndex = 0 */) { @@ -9956,7 +10012,7 @@ __webpack_require__(33)('includes'); /***/ }), -/* 291 */ +/* 293 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask @@ -9974,7 +10030,7 @@ $export($export.G, { /***/ }), -/* 292 */ +/* 294 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/ljharb/proposal-is-error @@ -9989,7 +10045,7 @@ $export($export.S, 'Error', { /***/ }), -/* 293 */ +/* 295 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/tc39/proposal-global @@ -9999,23 +10055,23 @@ $export($export.G, { global: __webpack_require__(2) }); /***/ }), -/* 294 */ +/* 296 */ /***/ (function(module, exports, __webpack_require__) { // https://tc39.github.io/proposal-setmap-offrom/#sec-map.from -__webpack_require__(66)('Map'); +__webpack_require__(67)('Map'); /***/ }), -/* 295 */ +/* 297 */ /***/ (function(module, exports, __webpack_require__) { // https://tc39.github.io/proposal-setmap-offrom/#sec-map.of -__webpack_require__(67)('Map'); +__webpack_require__(68)('Map'); /***/ }), -/* 296 */ +/* 298 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/DavidBruant/Map-Set.prototype.toJSON @@ -10025,7 +10081,7 @@ $export($export.P + $export.R, 'Map', { toJSON: __webpack_require__(107)('Map') /***/ }), -/* 297 */ +/* 299 */ /***/ (function(module, exports, __webpack_require__) { // https://rwaldron.github.io/proposal-math-extensions/ @@ -10039,7 +10095,7 @@ $export($export.S, 'Math', { /***/ }), -/* 298 */ +/* 300 */ /***/ (function(module, exports, __webpack_require__) { // https://rwaldron.github.io/proposal-math-extensions/ @@ -10049,7 +10105,7 @@ $export($export.S, 'Math', { DEG_PER_RAD: Math.PI / 180 }); /***/ }), -/* 299 */ +/* 301 */ /***/ (function(module, exports, __webpack_require__) { // https://rwaldron.github.io/proposal-math-extensions/ @@ -10064,7 +10120,7 @@ $export($export.S, 'Math', { /***/ }), -/* 300 */ +/* 302 */ /***/ (function(module, exports, __webpack_require__) { // https://rwaldron.github.io/proposal-math-extensions/ @@ -10080,7 +10136,7 @@ $export($export.S, 'Math', { /***/ }), -/* 301 */ +/* 303 */ /***/ (function(module, exports, __webpack_require__) { // https://gist.github.com/BrendanEich/4294d5c212a6d2254703 @@ -10097,7 +10153,7 @@ $export($export.S, 'Math', { /***/ }), -/* 302 */ +/* 304 */ /***/ (function(module, exports, __webpack_require__) { // https://gist.github.com/BrendanEich/4294d5c212a6d2254703 @@ -10119,7 +10175,7 @@ $export($export.S, 'Math', { /***/ }), -/* 303 */ +/* 305 */ /***/ (function(module, exports, __webpack_require__) { // https://gist.github.com/BrendanEich/4294d5c212a6d2254703 @@ -10136,7 +10192,7 @@ $export($export.S, 'Math', { /***/ }), -/* 304 */ +/* 306 */ /***/ (function(module, exports, __webpack_require__) { // https://rwaldron.github.io/proposal-math-extensions/ @@ -10146,7 +10202,7 @@ $export($export.S, 'Math', { RAD_PER_DEG: 180 / Math.PI }); /***/ }), -/* 305 */ +/* 307 */ /***/ (function(module, exports, __webpack_require__) { // https://rwaldron.github.io/proposal-math-extensions/ @@ -10161,7 +10217,7 @@ $export($export.S, 'Math', { /***/ }), -/* 306 */ +/* 308 */ /***/ (function(module, exports, __webpack_require__) { // https://rwaldron.github.io/proposal-math-extensions/ @@ -10171,7 +10227,7 @@ $export($export.S, 'Math', { scale: __webpack_require__(117) }); /***/ }), -/* 307 */ +/* 309 */ /***/ (function(module, exports, __webpack_require__) { // http://jfbastien.github.io/papers/Math.signbit.html @@ -10184,7 +10240,7 @@ $export($export.S, 'Math', { signbit: function signbit(x) { /***/ }), -/* 308 */ +/* 310 */ /***/ (function(module, exports, __webpack_require__) { // https://gist.github.com/BrendanEich/4294d5c212a6d2254703 @@ -10206,7 +10262,7 @@ $export($export.S, 'Math', { /***/ }), -/* 309 */ +/* 311 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10217,7 +10273,7 @@ var aFunction = __webpack_require__(12); var $defineProperty = __webpack_require__(8); // B.2.2.2 Object.prototype.__defineGetter__(P, getter) -__webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', { +__webpack_require__(7) && $export($export.P + __webpack_require__(64), 'Object', { __defineGetter__: function __defineGetter__(P, getter) { $defineProperty.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true }); } @@ -10225,7 +10281,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', /***/ }), -/* 310 */ +/* 312 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10236,7 +10292,7 @@ var aFunction = __webpack_require__(12); var $defineProperty = __webpack_require__(8); // B.2.2.3 Object.prototype.__defineSetter__(P, setter) -__webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', { +__webpack_require__(7) && $export($export.P + __webpack_require__(64), 'Object', { __defineSetter__: function __defineSetter__(P, setter) { $defineProperty.f(toObject(this), P, { set: aFunction(setter), enumerable: true, configurable: true }); } @@ -10244,7 +10300,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', /***/ }), -/* 311 */ +/* 313 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/tc39/proposal-object-values-entries @@ -10259,7 +10315,7 @@ $export($export.S, 'Object', { /***/ }), -/* 312 */ +/* 314 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/tc39/proposal-object-getownpropertydescriptors @@ -10287,7 +10343,7 @@ $export($export.S, 'Object', { /***/ }), -/* 313 */ +/* 315 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10299,7 +10355,7 @@ var getPrototypeOf = __webpack_require__(19); var getOwnPropertyDescriptor = __webpack_require__(18).f; // B.2.2.4 Object.prototype.__lookupGetter__(P) -__webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', { +__webpack_require__(7) && $export($export.P + __webpack_require__(64), 'Object', { __lookupGetter__: function __lookupGetter__(P) { var O = toObject(this); var K = toPrimitive(P, true); @@ -10312,7 +10368,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', /***/ }), -/* 314 */ +/* 316 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10324,7 +10380,7 @@ var getPrototypeOf = __webpack_require__(19); var getOwnPropertyDescriptor = __webpack_require__(18).f; // B.2.2.5 Object.prototype.__lookupSetter__(P) -__webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', { +__webpack_require__(7) && $export($export.P + __webpack_require__(64), 'Object', { __lookupSetter__: function __lookupSetter__(P) { var O = toObject(this); var K = toPrimitive(P, true); @@ -10337,7 +10393,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', /***/ }), -/* 315 */ +/* 317 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/tc39/proposal-object-values-entries @@ -10352,7 +10408,7 @@ $export($export.S, 'Object', { /***/ }), -/* 316 */ +/* 318 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10558,7 +10614,7 @@ __webpack_require__(44)('Observable'); /***/ }), -/* 317 */ +/* 319 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10585,7 +10641,7 @@ $export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) { /***/ }), -/* 318 */ +/* 320 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10604,7 +10660,7 @@ $export($export.S, 'Promise', { 'try': function (callbackfn) { /***/ }), -/* 319 */ +/* 321 */ /***/ (function(module, exports, __webpack_require__) { var metadata = __webpack_require__(31); @@ -10618,7 +10674,7 @@ metadata.exp({ defineMetadata: function defineMetadata(metadataKey, metadataValu /***/ }), -/* 320 */ +/* 322 */ /***/ (function(module, exports, __webpack_require__) { var metadata = __webpack_require__(31); @@ -10639,7 +10695,7 @@ metadata.exp({ deleteMetadata: function deleteMetadata(metadataKey, target /* , /***/ }), -/* 321 */ +/* 323 */ /***/ (function(module, exports, __webpack_require__) { var Set = __webpack_require__(135); @@ -10664,7 +10720,7 @@ metadata.exp({ getMetadataKeys: function getMetadataKeys(target /* , targetKey * /***/ }), -/* 322 */ +/* 324 */ /***/ (function(module, exports, __webpack_require__) { var metadata = __webpack_require__(31); @@ -10687,7 +10743,7 @@ metadata.exp({ getMetadata: function getMetadata(metadataKey, target /* , target /***/ }), -/* 323 */ +/* 325 */ /***/ (function(module, exports, __webpack_require__) { var metadata = __webpack_require__(31); @@ -10701,7 +10757,7 @@ metadata.exp({ getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targe /***/ }), -/* 324 */ +/* 326 */ /***/ (function(module, exports, __webpack_require__) { var metadata = __webpack_require__(31); @@ -10716,7 +10772,7 @@ metadata.exp({ getOwnMetadata: function getOwnMetadata(metadataKey, target /* , /***/ }), -/* 325 */ +/* 327 */ /***/ (function(module, exports, __webpack_require__) { var metadata = __webpack_require__(31); @@ -10738,7 +10794,7 @@ metadata.exp({ hasMetadata: function hasMetadata(metadataKey, target /* , target /***/ }), -/* 326 */ +/* 328 */ /***/ (function(module, exports, __webpack_require__) { var metadata = __webpack_require__(31); @@ -10753,7 +10809,7 @@ metadata.exp({ hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , /***/ }), -/* 327 */ +/* 329 */ /***/ (function(module, exports, __webpack_require__) { var $metadata = __webpack_require__(31); @@ -10774,23 +10830,23 @@ $metadata.exp({ metadata: function metadata(metadataKey, metadataValue) { /***/ }), -/* 328 */ +/* 330 */ /***/ (function(module, exports, __webpack_require__) { // https://tc39.github.io/proposal-setmap-offrom/#sec-set.from -__webpack_require__(66)('Set'); +__webpack_require__(67)('Set'); /***/ }), -/* 329 */ +/* 331 */ /***/ (function(module, exports, __webpack_require__) { // https://tc39.github.io/proposal-setmap-offrom/#sec-set.of -__webpack_require__(67)('Set'); +__webpack_require__(68)('Set'); /***/ }), -/* 330 */ +/* 332 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/DavidBruant/Map-Set.prototype.toJSON @@ -10800,14 +10856,14 @@ $export($export.P + $export.R, 'Set', { toJSON: __webpack_require__(107)('Set') /***/ }), -/* 331 */ +/* 333 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // https://github.com/mathiasbynens/String.prototype.at var $export = __webpack_require__(0); -var $at = __webpack_require__(68)(true); +var $at = __webpack_require__(69)(true); $export($export.P, 'String', { at: function at(pos) { @@ -10817,7 +10873,7 @@ $export($export.P, 'String', { /***/ }), -/* 332 */ +/* 334 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10826,7 +10882,7 @@ $export($export.P, 'String', { var $export = __webpack_require__(0); var defined = __webpack_require__(28); var toLength = __webpack_require__(6); -var isRegExp = __webpack_require__(61); +var isRegExp = __webpack_require__(62); var getFlags = __webpack_require__(52); var RegExpProto = RegExp.prototype; @@ -10854,7 +10910,7 @@ $export($export.P, 'String', { /***/ }), -/* 333 */ +/* 335 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10862,7 +10918,7 @@ $export($export.P, 'String', { // https://github.com/tc39/proposal-string-pad-start-end var $export = __webpack_require__(0); var $pad = __webpack_require__(129); -var userAgent = __webpack_require__(70); +var userAgent = __webpack_require__(71); // https://github.com/zloirock/core-js/issues/280 var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent); @@ -10875,7 +10931,7 @@ $export($export.P + $export.F * WEBKIT_BUG, 'String', { /***/ }), -/* 334 */ +/* 336 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10883,7 +10939,7 @@ $export($export.P + $export.F * WEBKIT_BUG, 'String', { // https://github.com/tc39/proposal-string-pad-start-end var $export = __webpack_require__(0); var $pad = __webpack_require__(129); -var userAgent = __webpack_require__(70); +var userAgent = __webpack_require__(71); // https://github.com/zloirock/core-js/issues/280 var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent); @@ -10896,7 +10952,7 @@ $export($export.P + $export.F * WEBKIT_BUG, 'String', { /***/ }), -/* 335 */ +/* 337 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10910,7 +10966,7 @@ __webpack_require__(51)('trimLeft', function ($trim) { /***/ }), -/* 336 */ +/* 338 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10924,21 +10980,21 @@ __webpack_require__(51)('trimRight', function ($trim) { /***/ }), -/* 337 */ +/* 339 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(97)('asyncIterator'); /***/ }), -/* 338 */ +/* 340 */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(97)('observable'); /***/ }), -/* 339 */ +/* 341 */ /***/ (function(module, exports, __webpack_require__) { // https://github.com/tc39/proposal-global @@ -10948,39 +11004,39 @@ $export($export.S, 'System', { global: __webpack_require__(2) }); /***/ }), -/* 340 */ +/* 342 */ /***/ (function(module, exports, __webpack_require__) { // https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from -__webpack_require__(66)('WeakMap'); +__webpack_require__(67)('WeakMap'); /***/ }), -/* 341 */ +/* 343 */ /***/ (function(module, exports, __webpack_require__) { // https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of -__webpack_require__(67)('WeakMap'); +__webpack_require__(68)('WeakMap'); /***/ }), -/* 342 */ +/* 344 */ /***/ (function(module, exports, __webpack_require__) { // https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from -__webpack_require__(66)('WeakSet'); +__webpack_require__(67)('WeakSet'); /***/ }), -/* 343 */ +/* 345 */ /***/ (function(module, exports, __webpack_require__) { // https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of -__webpack_require__(67)('WeakSet'); +__webpack_require__(68)('WeakSet'); /***/ }), -/* 344 */ +/* 346 */ /***/ (function(module, exports, __webpack_require__) { var $iterators = __webpack_require__(99); @@ -11044,7 +11100,7 @@ for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++ /***/ }), -/* 345 */ +/* 347 */ /***/ (function(module, exports, __webpack_require__) { var $export = __webpack_require__(0); @@ -11056,13 +11112,13 @@ $export($export.G + $export.B, { /***/ }), -/* 346 */ +/* 348 */ /***/ (function(module, exports, __webpack_require__) { // ie9- setTimeout & setInterval additional parameters fix var global = __webpack_require__(2); var $export = __webpack_require__(0); -var userAgent = __webpack_require__(70); +var userAgent = __webpack_require__(71); var slice = [].slice; var MSIE = /MSIE .\./.test(userAgent); // <- dirty ie9- check var wrap = function (set) { @@ -11082,37 +11138,35 @@ $export($export.G + $export.B + $export.F * MSIE, { /***/ }), -/* 347 */ +/* 349 */ /***/ (function(module, exports, __webpack_require__) { -__webpack_require__(275); -__webpack_require__(214); +__webpack_require__(277); __webpack_require__(216); -__webpack_require__(215); __webpack_require__(218); -__webpack_require__(220); -__webpack_require__(225); -__webpack_require__(219); __webpack_require__(217); -__webpack_require__(227); -__webpack_require__(226); +__webpack_require__(220); __webpack_require__(222); -__webpack_require__(223); +__webpack_require__(227); __webpack_require__(221); -__webpack_require__(213); -__webpack_require__(224); -__webpack_require__(228); +__webpack_require__(219); __webpack_require__(229); -__webpack_require__(181); -__webpack_require__(183); -__webpack_require__(182); -__webpack_require__(231); -__webpack_require__(230); -__webpack_require__(201); -__webpack_require__(211); -__webpack_require__(212); -__webpack_require__(202); +__webpack_require__(228); +__webpack_require__(224); +__webpack_require__(225); +__webpack_require__(223); +__webpack_require__(215); +__webpack_require__(226); +__webpack_require__(230); +__webpack_require__(231); +__webpack_require__(183); +__webpack_require__(185); +__webpack_require__(184); +__webpack_require__(233); +__webpack_require__(232); __webpack_require__(203); +__webpack_require__(213); +__webpack_require__(214); __webpack_require__(204); __webpack_require__(205); __webpack_require__(206); @@ -11120,8 +11174,8 @@ __webpack_require__(207); __webpack_require__(208); __webpack_require__(209); __webpack_require__(210); -__webpack_require__(184); -__webpack_require__(185); +__webpack_require__(211); +__webpack_require__(212); __webpack_require__(186); __webpack_require__(187); __webpack_require__(188); @@ -11137,156 +11191,158 @@ __webpack_require__(197); __webpack_require__(198); __webpack_require__(199); __webpack_require__(200); -__webpack_require__(262); +__webpack_require__(201); +__webpack_require__(202); +__webpack_require__(264); +__webpack_require__(269); +__webpack_require__(276); __webpack_require__(267); -__webpack_require__(274); +__webpack_require__(259); +__webpack_require__(260); __webpack_require__(265); -__webpack_require__(257); -__webpack_require__(258); -__webpack_require__(263); -__webpack_require__(268); __webpack_require__(270); -__webpack_require__(253); -__webpack_require__(254); +__webpack_require__(272); __webpack_require__(255); __webpack_require__(256); -__webpack_require__(259); -__webpack_require__(260); +__webpack_require__(257); +__webpack_require__(258); __webpack_require__(261); -__webpack_require__(264); +__webpack_require__(262); +__webpack_require__(263); __webpack_require__(266); -__webpack_require__(269); +__webpack_require__(268); __webpack_require__(271); -__webpack_require__(272); __webpack_require__(273); -__webpack_require__(176); +__webpack_require__(274); +__webpack_require__(275); __webpack_require__(178); -__webpack_require__(177); __webpack_require__(180); __webpack_require__(179); +__webpack_require__(182); +__webpack_require__(181); +__webpack_require__(167); __webpack_require__(165); -__webpack_require__(163); -__webpack_require__(169); -__webpack_require__(166); -__webpack_require__(172); -__webpack_require__(174); -__webpack_require__(162); +__webpack_require__(171); __webpack_require__(168); +__webpack_require__(174); +__webpack_require__(176); +__webpack_require__(164); +__webpack_require__(170); +__webpack_require__(161); +__webpack_require__(175); __webpack_require__(159); __webpack_require__(173); -__webpack_require__(157); -__webpack_require__(171); -__webpack_require__(170); -__webpack_require__(164); -__webpack_require__(167); -__webpack_require__(156); +__webpack_require__(172); +__webpack_require__(166); +__webpack_require__(169); __webpack_require__(158); -__webpack_require__(161); __webpack_require__(160); -__webpack_require__(175); +__webpack_require__(163); +__webpack_require__(162); +__webpack_require__(177); __webpack_require__(99); -__webpack_require__(247); +__webpack_require__(249); __webpack_require__(133); -__webpack_require__(252); +__webpack_require__(254); __webpack_require__(134); -__webpack_require__(248); -__webpack_require__(249); __webpack_require__(250); __webpack_require__(251); -__webpack_require__(232); +__webpack_require__(252); +__webpack_require__(253); +__webpack_require__(234); __webpack_require__(132); __webpack_require__(135); __webpack_require__(136); +__webpack_require__(289); +__webpack_require__(278); +__webpack_require__(279); +__webpack_require__(284); __webpack_require__(287); -__webpack_require__(276); -__webpack_require__(277); +__webpack_require__(288); __webpack_require__(282); __webpack_require__(285); +__webpack_require__(283); __webpack_require__(286); __webpack_require__(280); -__webpack_require__(283); __webpack_require__(281); -__webpack_require__(284); -__webpack_require__(278); -__webpack_require__(279); -__webpack_require__(233); -__webpack_require__(234); __webpack_require__(235); __webpack_require__(236); __webpack_require__(237); -__webpack_require__(240); __webpack_require__(238); __webpack_require__(239); -__webpack_require__(241); __webpack_require__(242); +__webpack_require__(240); +__webpack_require__(241); __webpack_require__(243); __webpack_require__(244); -__webpack_require__(246); __webpack_require__(245); +__webpack_require__(246); +__webpack_require__(248); +__webpack_require__(247); +__webpack_require__(292); __webpack_require__(290); -__webpack_require__(288); -__webpack_require__(289); -__webpack_require__(331); -__webpack_require__(334); +__webpack_require__(291); __webpack_require__(333); -__webpack_require__(335); __webpack_require__(336); -__webpack_require__(332); +__webpack_require__(335); __webpack_require__(337); __webpack_require__(338); +__webpack_require__(334); +__webpack_require__(339); +__webpack_require__(340); +__webpack_require__(314); +__webpack_require__(317); +__webpack_require__(313); +__webpack_require__(311); __webpack_require__(312); __webpack_require__(315); -__webpack_require__(311); -__webpack_require__(309); -__webpack_require__(310); -__webpack_require__(313); -__webpack_require__(314); +__webpack_require__(316); +__webpack_require__(298); +__webpack_require__(332); +__webpack_require__(297); +__webpack_require__(331); +__webpack_require__(343); +__webpack_require__(345); __webpack_require__(296); __webpack_require__(330); +__webpack_require__(342); +__webpack_require__(344); __webpack_require__(295); -__webpack_require__(329); __webpack_require__(341); -__webpack_require__(343); __webpack_require__(294); -__webpack_require__(328); -__webpack_require__(340); -__webpack_require__(342); -__webpack_require__(293); -__webpack_require__(339); -__webpack_require__(292); -__webpack_require__(297); -__webpack_require__(298); __webpack_require__(299); __webpack_require__(300); __webpack_require__(301); -__webpack_require__(303); __webpack_require__(302); -__webpack_require__(304); +__webpack_require__(303); __webpack_require__(305); +__webpack_require__(304); __webpack_require__(306); -__webpack_require__(308); __webpack_require__(307); -__webpack_require__(317); -__webpack_require__(318); +__webpack_require__(308); +__webpack_require__(310); +__webpack_require__(309); __webpack_require__(319); __webpack_require__(320); -__webpack_require__(322); __webpack_require__(321); +__webpack_require__(322); __webpack_require__(324); __webpack_require__(323); -__webpack_require__(325); __webpack_require__(326); +__webpack_require__(325); __webpack_require__(327); -__webpack_require__(291); -__webpack_require__(316); +__webpack_require__(328); +__webpack_require__(329); +__webpack_require__(293); +__webpack_require__(318); +__webpack_require__(348); +__webpack_require__(347); __webpack_require__(346); -__webpack_require__(345); -__webpack_require__(344); module.exports = __webpack_require__(23); /***/ }), -/* 348 */ +/* 350 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11295,7 +11351,7 @@ module.exports = __webpack_require__(23); const fs = __webpack_require__(11) const BUF_LENGTH = 64 * 1024 -const _buff = __webpack_require__(141)(BUF_LENGTH) +const _buff = __webpack_require__(142)(BUF_LENGTH) function copyFileSync (srcFile, destFile, options) { const overwrite = options.overwrite @@ -11334,7 +11390,7 @@ module.exports = copyFileSync /***/ }), -/* 349 */ +/* 351 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11342,7 +11398,7 @@ module.exports = copyFileSync const fs = __webpack_require__(11) const path = __webpack_require__(10) -const copyFileSync = __webpack_require__(348) +const copyFileSync = __webpack_require__(350) const mkdir = __webpack_require__(21) function copySync (src, dest, options) { @@ -11403,7 +11459,7 @@ module.exports = copySync /***/ }), -/* 350 */ +/* 352 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11464,27 +11520,27 @@ module.exports = copy /***/ }), -/* 351 */ +/* 353 */ /***/ (function(module, exports, __webpack_require__) { const u = __webpack_require__(16).fromCallback module.exports = { - copy: u(__webpack_require__(350)) + copy: u(__webpack_require__(352)) } /***/ }), -/* 352 */ +/* 354 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const u = __webpack_require__(16).fromCallback -const fs = __webpack_require__(72) +const fs = __webpack_require__(57) const path = __webpack_require__(10) const mkdir = __webpack_require__(21) -const remove = __webpack_require__(71) +const remove = __webpack_require__(72) const emptyDir = u(function emptyDir (dir, callback) { callback = callback || function () {} @@ -11529,7 +11585,7 @@ module.exports = { /***/ }), -/* 353 */ +/* 355 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11582,15 +11638,15 @@ module.exports = { /***/ }), -/* 354 */ +/* 356 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const file = __webpack_require__(353) -const link = __webpack_require__(355) -const symlink = __webpack_require__(358) +const file = __webpack_require__(355) +const link = __webpack_require__(357) +const symlink = __webpack_require__(360) module.exports = { // file @@ -11612,7 +11668,7 @@ module.exports = { /***/ }), -/* 355 */ +/* 357 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11680,7 +11736,7 @@ module.exports = { /***/ }), -/* 356 */ +/* 358 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11786,7 +11842,7 @@ module.exports = { /***/ }), -/* 357 */ +/* 359 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11824,7 +11880,7 @@ module.exports = { /***/ }), -/* 358 */ +/* 360 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11837,11 +11893,11 @@ const _mkdirs = __webpack_require__(21) const mkdirs = _mkdirs.mkdirs const mkdirsSync = _mkdirs.mkdirsSync -const _symlinkPaths = __webpack_require__(356) +const _symlinkPaths = __webpack_require__(358) const symlinkPaths = _symlinkPaths.symlinkPaths const symlinkPathsSync = _symlinkPaths.symlinkPathsSync -const _symlinkType = __webpack_require__(357) +const _symlinkType = __webpack_require__(359) const symlinkType = _symlinkType.symlinkType const symlinkTypeSync = _symlinkType.symlinkTypeSync @@ -11897,36 +11953,7 @@ module.exports = { /***/ }), -/* 359 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const assign = __webpack_require__(369) - -const fs = {} - -// Export graceful-fs: -assign(fs, __webpack_require__(139)) -// Export extra methods: -assign(fs, __webpack_require__(351)) -assign(fs, __webpack_require__(137)) -assign(fs, __webpack_require__(21)) -assign(fs, __webpack_require__(71)) -assign(fs, __webpack_require__(360)) -assign(fs, __webpack_require__(366)) -assign(fs, __webpack_require__(365)) -assign(fs, __webpack_require__(352)) -assign(fs, __webpack_require__(354)) -assign(fs, __webpack_require__(367)) -assign(fs, __webpack_require__(36)) - -module.exports = fs - - -/***/ }), -/* 360 */ +/* 361 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11935,8 +11962,8 @@ module.exports = fs const u = __webpack_require__(16).fromCallback const jsonFile = __webpack_require__(100) -jsonFile.outputJsonSync = __webpack_require__(361) -jsonFile.outputJson = u(__webpack_require__(362)) +jsonFile.outputJsonSync = __webpack_require__(362) +jsonFile.outputJson = u(__webpack_require__(363)) // aliases jsonFile.outputJSONSync = jsonFile.outputJSONSync jsonFile.outputJSON = jsonFile.outputJson @@ -11949,7 +11976,7 @@ module.exports = jsonFile /***/ }), -/* 361 */ +/* 362 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -11974,7 +12001,7 @@ module.exports = outputJsonSync /***/ }), -/* 362 */ +/* 363 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12008,7 +12035,7 @@ module.exports = outputJson /***/ }), -/* 363 */ +/* 364 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12016,7 +12043,7 @@ module.exports = outputJson const fs = __webpack_require__(11) const path = __webpack_require__(10) -const invalidWin32Path = __webpack_require__(140).invalidWin32Path +const invalidWin32Path = __webpack_require__(141).invalidWin32Path const o777 = parseInt('0777', 8) @@ -12074,7 +12101,7 @@ module.exports = mkdirsSync /***/ }), -/* 364 */ +/* 365 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12082,7 +12109,7 @@ module.exports = mkdirsSync const fs = __webpack_require__(11) const path = __webpack_require__(10) -const invalidWin32Path = __webpack_require__(140).invalidWin32Path +const invalidWin32Path = __webpack_require__(141).invalidWin32Path const o777 = parseInt('0777', 8) @@ -12144,7 +12171,7 @@ module.exports = mkdirs /***/ }), -/* 365 */ +/* 366 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12153,9 +12180,9 @@ module.exports = mkdirs const fs = __webpack_require__(11) const path = __webpack_require__(10) const copySync = __webpack_require__(137).copySync -const removeSync = __webpack_require__(71).removeSync +const removeSync = __webpack_require__(72).removeSync const mkdirpSync = __webpack_require__(21).mkdirsSync -const buffer = __webpack_require__(141) +const buffer = __webpack_require__(142) function moveSync (src, dest, options) { options = options || {} @@ -12269,7 +12296,7 @@ module.exports = { /***/ }), -/* 366 */ +/* 367 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12285,7 +12312,7 @@ const u = __webpack_require__(16).fromCallback const fs = __webpack_require__(11) const ncp = __webpack_require__(138) const path = __webpack_require__(10) -const remove = __webpack_require__(71).remove +const remove = __webpack_require__(72).remove const mkdirp = __webpack_require__(21).mkdirs function move (source, dest, options, callback) { @@ -12438,7 +12465,7 @@ module.exports = { /***/ }), -/* 367 */ +/* 368 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12485,7 +12512,7 @@ module.exports = { /***/ }), -/* 368 */ +/* 369 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12493,7 +12520,7 @@ module.exports = { const fs = __webpack_require__(11) const path = __webpack_require__(10) -const assert = __webpack_require__(142) +const assert = __webpack_require__(143) const isWindows = (process.platform === 'win32') @@ -12788,7 +12815,7 @@ rimraf.sync = rimrafSync /***/ }), -/* 369 */ +/* 370 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12811,14 +12838,14 @@ module.exports = assign /***/ }), -/* 370 */ +/* 371 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(11) -const os = __webpack_require__(378) +const os = __webpack_require__(144) const path = __webpack_require__(10) // HFS, ext{2,3}, FAT do not, Node.js v0.10 does not @@ -12890,7 +12917,7 @@ module.exports = { /***/ }), -/* 371 */ +/* 372 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -12916,7 +12943,7 @@ function clone (obj) { /***/ }), -/* 372 */ +/* 373 */ /***/ (function(module, exports, __webpack_require__) { var Stream = __webpack_require__(379).Stream @@ -13040,10 +13067,10 @@ function legacy (fs) { /***/ }), -/* 373 */ +/* 374 */ /***/ (function(module, exports, __webpack_require__) { -var constants = __webpack_require__(376) +var constants = __webpack_require__(377) var origCwd = process.cwd var cwd = null @@ -13375,14 +13402,14 @@ function patch (fs) { /***/ }), -/* 374 */ +/* 375 */ /***/ (function(module, exports, __webpack_require__) { var _fs try { _fs = __webpack_require__(11) } catch (_) { - _fs = __webpack_require__(72) + _fs = __webpack_require__(57) } function readFile (file, options, callback) { @@ -13515,7 +13542,7 @@ module.exports = jsonfile /***/ }), -/* 375 */ +/* 376 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Underscore.js 1.6.0 @@ -14864,23 +14891,17 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Underscor }).call(this); -/***/ }), -/* 376 */ -/***/ (function(module, exports) { - -module.exports = require("constants"); - /***/ }), /* 377 */ /***/ (function(module, exports) { -module.exports = require("crypto"); +module.exports = require("constants"); /***/ }), /* 378 */ /***/ (function(module, exports) { -module.exports = require("os"); +module.exports = require("crypto"); /***/ }), /* 379 */ @@ -14898,8 +14919,8 @@ module.exports = require("util"); /* 381 */ /***/ (function(module, exports, __webpack_require__) { -__webpack_require__(144); -module.exports = __webpack_require__(143); +__webpack_require__(146); +module.exports = __webpack_require__(145); /***/ })