jest-html-reporter 3.9.0 → 3.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/style/defaultTheme.css +28 -0
package/README.md
CHANGED
|
@@ -73,6 +73,7 @@ Please note that all configuration properties are optional.
|
|
|
73
73
|
| ------------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- |
|
|
74
74
|
| `append` | `BOOLEAN` | If set to true, new test results will be appended to the existing test report | `false` |
|
|
75
75
|
| `boilerplate` | `STRING` | The path to a boilerplate file that should be used to render the body of the test results into. `{jesthtmlreporter-content}` within the boilerplate will be replaced with the test results | `null` |
|
|
76
|
+
| `collapseSuitesByDefault` | `BOOLEAN` | Whether to collapse test suites by default or not | `false` |
|
|
76
77
|
| `customScriptPath` | `STRING` | Path to a javascript file that should be injected into the test report | `null` |
|
|
77
78
|
| `dateFormat` | `STRING` | The format in which date/time should be formatted in the test report. Have a look in the [documentation](https://github.com/Hargne/jest-html-reporter/wiki/Date-Format) for the available date format variables. | `"yyyy-mm-dd HH:MM:ss"` |
|
|
78
79
|
| `executionTimeWarningThreshold` | `NUMBER` | The threshold for test execution time (in seconds) in each test suite that will render a warning on the report page. 5 seconds is the default timeout in Jest. | `5` |
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("dateformat"),t=require("fs"),s=require("mkdirp"),i=require("path"),a=require("strip-ansi"),l=require("xmlbuilder");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=n(e),r=n(t),u=n(s),c=n(i),d=n(a),h=n(l);const g=e=>{const t=[],s=[],i=[];return e.forEach((e=>{const a=[],l=[],n=[];e.testResults.forEach((e=>{"pending"===e.status?a.push(e):"failed"===e.status?l.push(e):n.push(e)})),a.length>0&&t.push({...e,testResults:a}),l.length>0&&s.push({...e,testResults:l}),n.length>0&&i.push({...e,testResults:n})})),[].concat(t,s,i)},f=e=>(e&&e.sort(((e,t)=>t.perfStats.end-t.perfStats.start-(e.perfStats.end-e.perfStats.start))),e),m=e=>(e&&e.sort(((e,t)=>e.perfStats.end-e.perfStats.start-(t.perfStats.end-t.perfStats.start))),e),p=e=>{if(e){const t=e.sort(((e,t)=>S(e.testFilePath,t.testFilePath,!0)));return t.forEach((e=>{e.testResults.sort(((e,t)=>S(e.ancestorTitles.join(" "),t.ancestorTitles.join(" "),!0))),e.testResults.sort(((e,t)=>S(e.title,t.title,!0)))})),t}return e},T=e=>{if(e){const t=e.sort(((e,t)=>S(e.testFilePath,t.testFilePath)));return t.forEach((e=>{e.testResults.sort(((e,t)=>S(e.ancestorTitles.join(" "),t.ancestorTitles.join(" ")))),e.testResults.sort(((e,t)=>S(e.title,t.title)))})),t}return e},S=(e,t,s=!1)=>!s&&e<t||s&&e>t?-1:!s&&e>t||s&&e<t?1:0;class E{constructor(e){this.testData=e.testData,this.jestConfig=e.jestConfig,this.consoleLogList=e.consoleLogs,this.setupConfig(e.options)}async generate(){try{const e=await this.renderTestReport(),t=this.replaceRootDirInPath(this.jestConfig?this.jestConfig.rootDir:"",this.getConfigValue("outputPath"));await u.default(c.default.dirname(t));let s=!0;if(this.getConfigValue("append")){r.default.existsSync(t)&&(await this.appendToFile(t,e.content.toString()),s=!1)}return s&&r.default.writeFileSync(t,e.fullHtml.toString()),this.logMessage("success",`Report generated (${t})`),e.fullHtml}catch(e){this.logMessage("error",e)}}async renderTestReport(){const e=await this.renderTestReportContent();if(this.getConfigValue("boilerplate")){const t=this.replaceRootDirInPath(this.jestConfig?this.jestConfig.rootDir:"",this.getConfigValue("boilerplate")),s=r.default.readFileSync(t,"utf8");return{content:e.toString(),fullHtml:s.replace("{jesthtmlreporter-content}",e&&e.toString())}}const t=h.default.create({html:{}}),s=t.ele("head");s.ele("meta",{charset:"utf-8"}),s.ele("title",{},this.getConfigValue("pageTitle"));let i=c.default.join(__dirname,`../style/${this.getConfigValue("theme")}.css`);this.getConfigValue("styleOverridePath")&&(i=this.getConfigValue("styleOverridePath"));if(!this.getConfigValue("useCssFile")&&!this.getConfigValue("styleOverridePath")){const e=r.default.readFileSync(i,"utf8");s.raw(`<style type="text/css">${e}</style>`)}else s.ele("link",{rel:"stylesheet",type:"text/css",href:i});const a=t.ele("body");return e&&a.raw(e.toString()),this.getConfigValue("customScriptPath")&&a.raw(`<script src="${this.getConfigValue("customScriptPath")}"><\/script>`),{fullHtml:t.toString(),content:e.toString()}}renderTestSuiteInfo(e,t){const s=e.ele("div",{class:"suite-info"});s.ele("div",{class:"suite-path"},t.testFilePath);const i=(t.perfStats.end-t.perfStats.start)/1e3;s.ele("div",{class:"suite-time"+(i>this.getConfigValue("executionTimeWarningThreshold")?" warn":"")},`${i}s`)}renderSuiteFailure(e,t,s){const i=e.ele("div",{id:`suite-${s+1}`,class:"suite-container"});this.renderTestSuiteInfo(i,t);i.ele("div",{class:"suite-tests"}).ele("div",{class:"test-result failed"}).ele("div",{class:"failureMessages suiteFailure"}," ").ele("pre",{class:"failureMsg"},this.sanitizeOutput(t.failureMessage))}async renderTestReportContent(){try{if(!this.testData||0===Object.entries(this.testData).length)throw Error("No test data provided");const e=h.default.begin().element("div",{class:"jesthtml-content"}),t=e.ele("header");t.ele("h1",{id:"title"},this.getConfigValue("pageTitle"));const s=this.getConfigValue("logo");s&&t.ele("img",{id:"logo",src:s});const i=e.ele("div",{id:"metadata-container"});if(this.testData.startTime&&!isNaN(this.testData.startTime)){const e=new Date(this.testData.startTime);if(e){const t=o.default(e,this.getConfigValue("dateFormat"));i.ele("div",{id:"timestamp"},`Started: ${t}`)}}const a=i.ele("div",{id:"summary"}),l=a.ele("div",{id:"suite-summary"});l.ele("div",{class:"summary-total"},`Suites (${this.testData.numTotalTestSuites})`),l.ele("div",{class:"summary-passed"+(0===this.testData.numPassedTestSuites?" summary-empty":"")},`${this.testData.numPassedTestSuites} passed`),l.ele("div",{class:"summary-failed"+(0===this.testData.numFailedTestSuites?" summary-empty":"")},`${this.testData.numFailedTestSuites} failed`),l.ele("div",{class:"summary-pending"+(0===this.testData.numPendingTestSuites?" summary-empty":"")},`${this.testData.numPendingTestSuites} pending`),this.testData.snapshot&&this.testData.snapshot.unchecked>0&&this.getConfigValue("includeObsoleteSnapshots")&&l.ele("div",{class:"summary-obsolete-snapshots"},`${this.testData.snapshot.unchecked} obsolete snapshots`);const n=a.ele("div",{id:"test-summary"});n.ele("div",{class:"summary-total"},`Tests (${this.testData.numTotalTests})`),n.ele("div",{class:"summary-passed"+(0===this.testData.numPassedTests?" summary-empty":"")},`${this.testData.numPassedTests} passed`),n.ele("div",{class:"summary-failed"+(0===this.testData.numFailedTests?" summary-empty":"")},`${this.testData.numFailedTests} failed`),n.ele("div",{class:"summary-pending"+(0===this.testData.numPendingTests?" summary-empty":"")},`${this.testData.numPendingTests} pending`);const r=((e,t)=>{switch(t&&t.toLowerCase()){case"status":return g(e);case"executiondesc":return f(e);case"executionasc":return m(e);case"titledesc":return p(e);case"titleasc":return T(e);default:return e}})(this.testData.testResults,this.getConfigValue("sort")),u=this.getConfigValue("statusIgnoreFilter");let c=[];return u&&(c=u.replace(/\s/g,"").toLowerCase().split(",")),r&&r.forEach(((t,s)=>{if(!t.testResults||t.testResults.length<=0)return void(t.failureMessage&&this.getConfigValue("includeSuiteFailure")&&this.renderSuiteFailure(e,t,s));const i=e.ele("div",{id:`suite-${s+1}`,class:"suite-container"});this.renderTestSuiteInfo(i,t);const a=i.ele("div",{class:"suite-tests"});t.testResults.filter((e=>!c.includes(e.status))).forEach((async e=>{const t=a.ele("div",{class:`test-result ${e.status}`}),s=t.ele("div",{class:"test-info"});if(s.ele("div",{class:"test-suitename"},e.ancestorTitles&&e.ancestorTitles.length>0?e.ancestorTitles.join(" > "):" "),s.ele("div",{class:"test-title"},e.title),s.ele("div",{class:"test-status"},e.status),s.ele("div",{class:"test-duration"},e.duration/1e3+"s"),e.failureMessages&&e.failureMessages.length>0&&this.getConfigValue("includeFailureMsg")){const s=t.ele("div",{class:"failureMessages"}," ");e.failureMessages.map((e=>this.getConfigValue("includeStackTrace")?e:e.split(/\n\s+at/)[0].trim().replace(/\n+$/,""))).forEach((e=>{s.ele("pre",{class:"failureMsg"},this.sanitizeOutput(e))}))}})),this.consoleLogList&&this.consoleLogList.length>0&&this.getConfigValue("includeConsoleLog")&&this.renderSuiteConsoleLogs(t,i),t.snapshot&&t.snapshot.unchecked>0&&this.getConfigValue("includeObsoleteSnapshots")&&this.renderSuiteObsoleteSnapshots(i,t)})),e}catch(e){this.logMessage("error",e)}}renderSuiteConsoleLogs(e,t){const s=this.consoleLogList.find((t=>t.filePath===e.testFilePath));if(s&&s.logs.length>0){const e=t.ele("div",{class:"suite-consolelog"});e.ele("div",{class:"suite-consolelog-header"},"Console Log"),s.logs.forEach((t=>{const s=e.ele("div",{class:"suite-consolelog-item"});s.ele("pre",{class:"suite-consolelog-item-origin"},this.sanitizeOutput(t.origin)),s.ele("pre",{class:"suite-consolelog-item-message"},this.sanitizeOutput(t.message))}))}}renderSuiteObsoleteSnapshots(e,t){const s=e.ele("div",{class:"suite-obsolete-snapshots"});s.ele("div",{class:"suite-obsolete-snapshots-header"},"Obsolete snapshots");s.ele("div",{class:"suite-obsolete-snapshots-item"}).ele("pre",{class:"suite-obsolete-snapshots-item-message"},t.snapshot.uncheckedKeys.join("\n"))}setupConfig(e){const{append:t,boilerplate:s,customScriptPath:i,dateFormat:a,executionTimeWarningThreshold:l,logo:n,includeConsoleLog:o,includeFailureMsg:u,includeStackTrace:d,includeSuiteFailure:h,includeObsoleteSnapshots:g,outputPath:f,pageTitle:m,theme:p,sort:T,statusIgnoreFilter:S,styleOverridePath:E,useCssFile:R}=e||{};this.config={append:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_APPEND",configValue:t},boilerplate:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_BOILERPLATE",configValue:s},customScriptPath:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_CUSTOM_SCRIPT_PATH",configValue:i},dateFormat:{defaultValue:"yyyy-mm-dd HH:MM:ss",environmentVariable:"JEST_HTML_REPORTER_DATE_FORMAT",configValue:a},executionTimeWarningThreshold:{defaultValue:5,environmentVariable:"JEST_HTML_REPORTER_EXECUTION_TIME_WARNING_THRESHOLD",configValue:l},logo:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_LOGO",configValue:n},includeFailureMsg:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_INCLUDE_FAILURE_MSG",configValue:u},includeStackTrace:{defaultValue:!0,environmentVariable:"JEST_HTML_REPORTER_INCLUDE_STACK_TRACE",configValue:d},includeSuiteFailure:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_INCLUDE_SUITE_FAILURE",configValue:h},includeObsoleteSnapshots:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_INCLUDE_OBSOLETE_SNAPSHOTS",configValue:g},includeConsoleLog:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_INCLUDE_CONSOLE_LOG",configValue:o},outputPath:{defaultValue:c.default.join(process.cwd(),"test-report.html"),environmentVariable:"JEST_HTML_REPORTER_OUTPUT_PATH",configValue:f},pageTitle:{defaultValue:"Test Report",environmentVariable:"JEST_HTML_REPORTER_PAGE_TITLE",configValue:m},theme:{defaultValue:"defaultTheme",environmentVariable:"JEST_HTML_REPORTER_THEME",configValue:p},sort:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_SORT",configValue:T},statusIgnoreFilter:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_STATUS_FILTER",configValue:S},styleOverridePath:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_STYLE_OVERRIDE_PATH",configValue:E},useCssFile:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_USE_CSS_FILE",configValue:R}};try{const e=r.default.readFileSync(c.default.join(process.cwd(),"jesthtmlreporter.config.json"),"utf8");if(e){const t=JSON.parse(e);for(const e of Object.keys(t))e in this.config&&(this.config[e].configValue=t[e]);return this.config}}catch(e){}try{const e=r.default.readFileSync(c.default.join(process.cwd(),"package.json"),"utf8");if(e){const t=JSON.parse(e)["jest-html-reporter"];for(const e of Object.keys(t))e in this.config&&(this.config[e].configValue=t[e]);return this.config}}catch(e){}}getConfigValue(e){const t=this.config[e];if(t)return process.env[t.environmentVariable]?process.env[t.environmentVariable]:t.configValue??t.defaultValue}async appendToFile(e,t){let s=t;const i=r.default.readFileSync(e,"utf8"),a=/<body>(.*?)<\/body>/gm.exec(t);if(a){const[e]=a;s=e}let l=i;const n=/<\/body>/gm.exec(i),o=n?n.index:0;return l=[i.slice(0,o),s,i.slice(o)].join(""),r.default.writeFileSync(e,l)}replaceRootDirInPath(e,t){return/^<rootDir>/.test(t)?c.default.resolve(e,c.default.normalize("./"+t.substring(9))):t}logMessage(e,t){const s={default:"[37m%s[0m",success:"[32m%s[0m",error:"[31m%s[0m"},i=s[e]?s[e]:s.default,a=`jest-html-reporter >> ${t}`;return void 0===process.env.JEST_WORKER_ID&&console.log(i,a),{logColor:i,logMsg:a}}sanitizeOutput(e){return d.default(e.replace(/([^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFC\u{10000}-\u{10FFFF}])/gu,""))}}const R=e=>new E(e).generate();module.exports=function(e,t){const s=[];if(Object.prototype.hasOwnProperty.call(e,"testResults")){const s=e;return R({testData:s,options:t}),s}this.onTestResult=(e,t)=>{t.console&&s.push({filePath:t.testFilePath,logs:t.console})},this.onRunComplete=(i,a)=>R({testData:a,options:t,jestConfig:e,consoleLogs:s})};
|
|
1
|
+
"use strict";var e=require("dateformat"),t=require("fs"),s=require("mkdirp"),a=require("path"),i=require("strip-ansi"),l=require("xmlbuilder");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=n(e),r=n(t),u=n(s),c=n(a),d=n(i),g=n(l);const h=e=>{const t=[],s=[],a=[];return e.forEach((e=>{const i=[],l=[],n=[];e.testResults.forEach((e=>{"pending"===e.status?i.push(e):"failed"===e.status?l.push(e):n.push(e)})),i.length>0&&t.push({...e,testResults:i}),l.length>0&&s.push({...e,testResults:l}),n.length>0&&a.push({...e,testResults:n})})),[].concat(t,s,a)},f=e=>(e&&e.sort(((e,t)=>t.perfStats.end-t.perfStats.start-(e.perfStats.end-e.perfStats.start))),e),p=e=>(e&&e.sort(((e,t)=>e.perfStats.end-e.perfStats.start-(t.perfStats.end-t.perfStats.start))),e),T=e=>{if(e){const t=e.sort(((e,t)=>E(e.testFilePath,t.testFilePath,!0)));return t.forEach((e=>{e.testResults.sort(((e,t)=>E(e.ancestorTitles.join(" "),t.ancestorTitles.join(" "),!0))),e.testResults.sort(((e,t)=>E(e.title,t.title,!0)))})),t}return e},m=e=>{if(e){const t=e.sort(((e,t)=>E(e.testFilePath,t.testFilePath)));return t.forEach((e=>{e.testResults.sort(((e,t)=>E(e.ancestorTitles.join(" "),t.ancestorTitles.join(" ")))),e.testResults.sort(((e,t)=>E(e.title,t.title)))})),t}return e},E=(e,t,s=!1)=>!s&&e<t||s&&e>t?-1:!s&&e>t||s&&e<t?1:0;class S{constructor(e){this.testData=e.testData,this.jestConfig=e.jestConfig,this.consoleLogList=e.consoleLogs,this.setupConfig(e.options)}async generate(){try{const e=await this.renderTestReport(),t=this.replaceRootDirInPath(this.jestConfig?this.jestConfig.rootDir:"",this.getConfigValue("outputPath"));await u.default(c.default.dirname(t));let s=!0;if(this.getConfigValue("append")){r.default.existsSync(t)&&(await this.appendToFile(t,e.content.toString()),s=!1)}return s&&r.default.writeFileSync(t,e.fullHtml.toString()),this.logMessage("success",`Report generated (${t})`),e.fullHtml}catch(e){this.logMessage("error",e)}}async renderTestReport(){const e=await this.renderTestReportContent();if(this.getConfigValue("boilerplate")){const t=this.replaceRootDirInPath(this.jestConfig?this.jestConfig.rootDir:"",this.getConfigValue("boilerplate")),s=r.default.readFileSync(t,"utf8");return{content:e.toString(),fullHtml:s.replace("{jesthtmlreporter-content}",e&&e.toString())}}const t=g.default.create({html:{}}),s=t.ele("head");s.ele("meta",{charset:"utf-8"}),s.ele("title",{},this.getConfigValue("pageTitle"));let a=c.default.join(__dirname,`../style/${this.getConfigValue("theme")}.css`);this.getConfigValue("styleOverridePath")&&(a=this.getConfigValue("styleOverridePath"));if(!this.getConfigValue("useCssFile")&&!this.getConfigValue("styleOverridePath")){const e=r.default.readFileSync(a,"utf8");s.raw(`<style type="text/css">${e}</style>`)}else s.ele("link",{rel:"stylesheet",type:"text/css",href:a});const i=t.ele("body");return e&&i.raw(e.toString()),this.getConfigValue("customScriptPath")&&i.raw(`<script src="${this.getConfigValue("customScriptPath")}"><\/script>`),{fullHtml:t.toString(),content:e.toString()}}renderTestSuiteHeader(e,t,s){const a=`collapsible-${s}`;e.ele("input",{id:a,type:"checkbox",class:"toggle",checked:this.getConfigValue("collapseSuitesByDefault")?null:"checked"});const i=e.ele("label",{for:a}).ele("div",{class:"suite-info"});i.ele("div",{class:"suite-path"},t.testFilePath);const l=(t.perfStats.end-t.perfStats.start)/1e3,n=["suite-time"];l>this.getConfigValue("executionTimeWarningThreshold")&&n.push("warn"),i.ele("div",{class:n.join(" ")},`${l}s`)}async renderTestReportContent(){try{if(!this.testData||0===Object.entries(this.testData).length)throw Error("No test data provided");const e=g.default.begin().element("div",{class:"jesthtml-content"}),t=e.ele("header");t.ele("h1",{id:"title"},this.getConfigValue("pageTitle"));const s=this.getConfigValue("logo");s&&t.ele("img",{id:"logo",src:s});const a=e.ele("div",{id:"metadata-container"});if(this.testData.startTime&&!isNaN(this.testData.startTime)){const e=new Date(this.testData.startTime);if(e){const t=o.default(e,this.getConfigValue("dateFormat"));a.ele("div",{id:"timestamp"},`Started: ${t}`)}}const i=a.ele("div",{id:"summary"}),l=i.ele("div",{id:"suite-summary"}),n=(e,t)=>[`summary-${e}`,t>0?"":" summary-empty"].join(" ");l.ele("div",{class:"summary-total"},`Suites (${this.testData.numTotalTestSuites})`),l.ele("div",{class:n("passed",this.testData.numPassedTestSuites)},`${this.testData.numPassedTestSuites} passed`),l.ele("div",{class:n("failed",this.testData.numFailedTestSuites)},`${this.testData.numFailedTestSuites} failed`),l.ele("div",{class:n("pending",this.testData.numPendingTestSuites)},`${this.testData.numPendingTestSuites} pending`),this.testData.snapshot&&this.testData.snapshot.unchecked>0&&this.getConfigValue("includeObsoleteSnapshots")&&l.ele("div",{class:"summary-obsolete-snapshots"},`${this.testData.snapshot.unchecked} obsolete snapshots`);const r=i.ele("div",{id:"test-summary"});r.ele("div",{class:"summary-total"},`Tests (${this.testData.numTotalTests})`),r.ele("div",{class:n("passed",this.testData.numPassedTests)},`${this.testData.numPassedTests} passed`),r.ele("div",{class:n("failed",this.testData.numFailedTests)},`${this.testData.numFailedTests} failed`),r.ele("div",{class:n("pending",this.testData.numPendingTests)},`${this.testData.numPendingTests} pending`);const u=((e,t)=>{switch(t&&t.toLowerCase()){case"status":return h(e);case"executiondesc":return f(e);case"executionasc":return p(e);case"titledesc":return T(e);case"titleasc":return m(e);default:return e}})(this.testData.testResults,this.getConfigValue("sort")),c=this.getConfigValue("statusIgnoreFilter");let d=[];return c&&(d=c.replace(/\s/g,"").toLowerCase().split(",")),u&&u.forEach(((t,s)=>{const a=e.ele("div",{id:`suite-${s+1}`,class:"suite-container"});this.renderTestSuiteHeader(a,t,s);const i=a.ele("div",{class:"suite-tests"});if(!t.testResults||t.testResults.length<=0){if(t.failureMessage&&this.getConfigValue("includeSuiteFailure")){i.ele("div",{class:"test-result failed"}).ele("div",{class:"failureMessages suiteFailure"}," ").ele("pre",{class:"failureMsg"},this.sanitizeOutput(t.failureMessage))}}else t.testResults.filter((e=>!d.includes(e.status))).forEach((async e=>{const t=i.ele("div",{class:`test-result ${e.status}`}),s=t.ele("div",{class:"test-info"});if(s.ele("div",{class:"test-suitename"},e.ancestorTitles&&e.ancestorTitles.length>0?e.ancestorTitles.join(" > "):" "),s.ele("div",{class:"test-title"},e.title),s.ele("div",{class:"test-status"},e.status),s.ele("div",{class:"test-duration"},e.duration/1e3+"s"),e.failureMessages&&e.failureMessages.length>0&&this.getConfigValue("includeFailureMsg")){const s=t.ele("div",{class:"failureMessages"}," ");e.failureMessages.map((e=>this.getConfigValue("includeStackTrace")?e:e.split(/\n\s+at/)[0].trim().replace(/\n+$/,""))).forEach((e=>{s.ele("pre",{class:"failureMsg"},this.sanitizeOutput(e))}))}})),this.consoleLogList&&this.consoleLogList.length>0&&this.getConfigValue("includeConsoleLog")&&this.renderSuiteConsoleLogs(t,a),t.snapshot&&t.snapshot.unchecked>0&&this.getConfigValue("includeObsoleteSnapshots")&&this.renderSuiteObsoleteSnapshots(a,t)})),e}catch(e){this.logMessage("error",e)}}renderSuiteConsoleLogs(e,t){const s=this.consoleLogList.find((t=>t.filePath===e.testFilePath));if(s&&s.logs.length>0){const e=t.ele("div",{class:"suite-consolelog"});e.ele("div",{class:"suite-consolelog-header"},"Console Log"),s.logs.forEach((t=>{const s=e.ele("div",{class:"suite-consolelog-item"});s.ele("pre",{class:"suite-consolelog-item-origin"},this.sanitizeOutput(t.origin)),s.ele("pre",{class:"suite-consolelog-item-message"},this.sanitizeOutput(t.message))}))}}renderSuiteObsoleteSnapshots(e,t){const s=e.ele("div",{class:"suite-obsolete-snapshots"});s.ele("div",{class:"suite-obsolete-snapshots-header"},"Obsolete snapshots");s.ele("div",{class:"suite-obsolete-snapshots-item"}).ele("pre",{class:"suite-obsolete-snapshots-item-message"},t.snapshot.uncheckedKeys.join("\n"))}setupConfig(e){const{append:t,boilerplate:s,collapseSuitesByDefault:a,customScriptPath:i,dateFormat:l,executionTimeWarningThreshold:n,logo:o,includeConsoleLog:u,includeFailureMsg:d,includeStackTrace:g,includeSuiteFailure:h,includeObsoleteSnapshots:f,outputPath:p,pageTitle:T,theme:m,sort:E,statusIgnoreFilter:S,styleOverridePath:R,useCssFile:V}=e||{};this.config={append:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_APPEND",configValue:t},boilerplate:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_BOILERPLATE",configValue:s},collapseSuitesByDefault:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_COLLAPSE_SUITES_BY_DEFAULT",configValue:a},customScriptPath:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_CUSTOM_SCRIPT_PATH",configValue:i},dateFormat:{defaultValue:"yyyy-mm-dd HH:MM:ss",environmentVariable:"JEST_HTML_REPORTER_DATE_FORMAT",configValue:l},executionTimeWarningThreshold:{defaultValue:5,environmentVariable:"JEST_HTML_REPORTER_EXECUTION_TIME_WARNING_THRESHOLD",configValue:n},logo:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_LOGO",configValue:o},includeFailureMsg:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_INCLUDE_FAILURE_MSG",configValue:d},includeStackTrace:{defaultValue:!0,environmentVariable:"JEST_HTML_REPORTER_INCLUDE_STACK_TRACE",configValue:g},includeSuiteFailure:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_INCLUDE_SUITE_FAILURE",configValue:h},includeObsoleteSnapshots:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_INCLUDE_OBSOLETE_SNAPSHOTS",configValue:f},includeConsoleLog:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_INCLUDE_CONSOLE_LOG",configValue:u},outputPath:{defaultValue:c.default.join(process.cwd(),"test-report.html"),environmentVariable:"JEST_HTML_REPORTER_OUTPUT_PATH",configValue:p},pageTitle:{defaultValue:"Test Report",environmentVariable:"JEST_HTML_REPORTER_PAGE_TITLE",configValue:T},theme:{defaultValue:"defaultTheme",environmentVariable:"JEST_HTML_REPORTER_THEME",configValue:m},sort:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_SORT",configValue:E},statusIgnoreFilter:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_STATUS_FILTER",configValue:S},styleOverridePath:{defaultValue:null,environmentVariable:"JEST_HTML_REPORTER_STYLE_OVERRIDE_PATH",configValue:R},useCssFile:{defaultValue:!1,environmentVariable:"JEST_HTML_REPORTER_USE_CSS_FILE",configValue:V}};try{const e=r.default.readFileSync(c.default.join(process.cwd(),"jesthtmlreporter.config.json"),"utf8");if(e){const t=JSON.parse(e);for(const e of Object.keys(t))e in this.config&&(this.config[e].configValue=t[e]);return this.config}}catch(e){}try{const e=r.default.readFileSync(c.default.join(process.cwd(),"package.json"),"utf8");if(e){const t=JSON.parse(e)["jest-html-reporter"];for(const e of Object.keys(t))e in this.config&&(this.config[e].configValue=t[e]);return this.config}}catch(e){}}getConfigValue(e){const t=this.config[e];if(t)return process.env[t.environmentVariable]?process.env[t.environmentVariable]:t.configValue??t.defaultValue}async appendToFile(e,t){let s=t;const a=r.default.readFileSync(e,"utf8"),i=/<body>(.*?)<\/body>/gm.exec(t);if(i){const[e]=i;s=e}let l=a;const n=/<\/body>/gm.exec(a),o=n?n.index:0;return l=[a.slice(0,o),s,a.slice(o)].join(""),r.default.writeFileSync(e,l)}replaceRootDirInPath(e,t){return/^<rootDir>/.test(t)?c.default.resolve(e,c.default.normalize("./"+t.substring(9))):t}logMessage(e,t){const s={default:"[37m%s[0m",success:"[32m%s[0m",error:"[31m%s[0m"},a=s[e]?s[e]:s.default,i=`jest-html-reporter >> ${t}`;return void 0===process.env.JEST_WORKER_ID&&console.log(a,i),{logColor:a,logMsg:i}}sanitizeOutput(e){return d.default(e.replace(/(\x1b\[\d*m)/g,"").replace(/([^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFC\u{10000}-\u{10FFFF}])/gu,""))}}const R=e=>new S(e).generate();module.exports=function(e,t){const s=[];if(Object.prototype.hasOwnProperty.call(e,"testResults")){const s=e;return R({testData:s,options:t}),s}this.onTestResult=(e,t)=>{t.console&&s.push({filePath:t.testFilePath,logs:t.console})},this.onRunComplete=(a,i)=>R({testData:i,options:t,jestConfig:e,consoleLogs:s})};
|
package/package.json
CHANGED
package/style/defaultTheme.css
CHANGED
|
@@ -149,6 +149,21 @@ header {
|
|
|
149
149
|
.suite-container {
|
|
150
150
|
margin-bottom: 2rem;
|
|
151
151
|
}
|
|
152
|
+
.suite-container > input[type="checkbox"] {
|
|
153
|
+
position: absolute;
|
|
154
|
+
left: -100vw;
|
|
155
|
+
}
|
|
156
|
+
.suite-container label {
|
|
157
|
+
display: block;
|
|
158
|
+
}
|
|
159
|
+
.suite-container .suite-tests {
|
|
160
|
+
overflow-y: hidden;
|
|
161
|
+
height: 0;
|
|
162
|
+
}
|
|
163
|
+
.suite-container > input[type="checkbox"]:checked ~ .suite-tests {
|
|
164
|
+
height: auto;
|
|
165
|
+
overflow: visible;
|
|
166
|
+
}
|
|
152
167
|
.suite-info {
|
|
153
168
|
padding: 1rem;
|
|
154
169
|
background-color: #eee;
|
|
@@ -157,6 +172,10 @@ header {
|
|
|
157
172
|
align-items: center;
|
|
158
173
|
margin-bottom: 0.25rem;
|
|
159
174
|
}
|
|
175
|
+
.suite-info:hover {
|
|
176
|
+
background-color: #ddd;
|
|
177
|
+
cursor: pointer;
|
|
178
|
+
}
|
|
160
179
|
.suite-info .suite-path {
|
|
161
180
|
word-break: break-all;
|
|
162
181
|
flex-grow: 1;
|
|
@@ -172,6 +191,15 @@ header {
|
|
|
172
191
|
background-color: #d8000c;
|
|
173
192
|
color: #fff;
|
|
174
193
|
}
|
|
194
|
+
.suite-info:before {
|
|
195
|
+
content: "\2303";
|
|
196
|
+
display: inline-block;
|
|
197
|
+
margin-right: 0.5rem;
|
|
198
|
+
transform: rotate(0deg);
|
|
199
|
+
}
|
|
200
|
+
.suite-container > input[type="checkbox"]:checked ~ label .suite-info:before {
|
|
201
|
+
transform: rotate(180deg);
|
|
202
|
+
}
|
|
175
203
|
|
|
176
204
|
/* CONSOLE LOGS */
|
|
177
205
|
.suite-consolelog {
|