├── .eslintrc ├── .github └── workflows │ └── npm-publish.yml ├── .gitignore ├── .npmrc ├── .travis.yml ├── .yarn ├── cache │ ├── @babel-polyfill-npm-7.12.1-a393b8d870-3f59a9d85a.zip │ ├── @babel-runtime-npm-7.21.5-7d058028a3-358f2779d3.zip │ ├── @colors-colors-npm-1.5.0-875af3a8b4-d64d5260be.zip │ ├── @cucumber-ci-environment-npm-9.1.0-d31a763262-a5b8d9a42f.zip │ ├── @cucumber-cucumber-expressions-npm-16.1.1-640221664e-2c05439248.zip │ ├── @cucumber-cucumber-npm-9.1.2-b6884d6874-99c3402e50.zip │ ├── @cucumber-gherkin-npm-25.0.2-15c388f65b-673083ae96.zip │ ├── @cucumber-gherkin-npm-26.0.3-0adfeb1401-b070739a8b.zip │ ├── @cucumber-gherkin-streams-npm-5.0.1-a9097ed93e-b8e85b60c0.zip │ ├── @cucumber-gherkin-utils-npm-8.0.2-a6fec84496-2c93c4e90c.zip │ ├── @cucumber-html-formatter-npm-20.2.1-b2876ae75a-a98538ccc8.zip │ ├── @cucumber-message-streams-npm-4.0.1-0c98ff65d5-1ebb05ccf9.zip │ ├── @cucumber-messages-npm-19.1.4-0282e9611e-54981faf2a.zip │ ├── @cucumber-messages-npm-21.0.1-5dd3dcfba8-01849f35bb.zip │ ├── @cucumber-tag-expressions-npm-5.0.1-c376edd938-9d3a5b4d98.zip │ ├── @teppeis-multimaps-npm-2.0.0-b73624193d-eb0d3bf290.zip │ ├── @types-lodash-npm-4.14.194-f099c0742e-113f34831c.zip │ ├── @types-uuid-npm-8.3.4-7547f4402c-6f11f3ff70.zip │ ├── ansi-regex-npm-3.0.1-01f44078a3-09daf180c5.zip │ ├── ansi-regex-npm-4.1.1-af0a582bb9-b1a6ee44cb.zip │ ├── ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip │ ├── ansi-styles-npm-3.2.1-8cb8107983-d85ade01c1.zip │ ├── ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip │ ├── any-promise-npm-1.3.0-f34eeaa7e7-0ee8a9bdbe.zip │ ├── assert-plus-npm-1.0.0-cac95ef098-19b4340cb8.zip │ ├── assertion-error-formatter-npm-2.0.1-d0af52f968-25cce426c2.zip │ ├── assertion-error-formatter-npm-3.0.0-13cc1330f6-82d7349bc0.zip │ ├── assertion-error-npm-1.1.0-66b893015e-fd9429d3a3.zip │ ├── balanced-match-npm-1.0.0-951a2ad706-9b67bfe558.zip │ ├── becke-ch--regex--s0-0-v1--base--pl--lib-npm-1.4.0-c5dcc80723-45d23b80ab.zip │ ├── bluebird-npm-3.7.2-6a54136ee3-869417503c.zip │ ├── brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip │ ├── buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip │ ├── capital-case-npm-1.0.4-90f8a4641d-41fa8fa87f.zip │ ├── chai-npm-4.2.0-b777309e5a-47881a30da.zip │ ├── chalk-npm-2.4.2-3ea16dd91e-ec3661d38f.zip │ ├── chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip │ ├── check-error-npm-1.0.2-00c540c6e9-d9d1065044.zip │ ├── class-transformer-npm-0.5.1-96b5161e6c-f191c8b4cc.zip │ ├── cli-table3-npm-0.5.1-570cb07b69-3ff8c82144.zip │ ├── cli-table3-npm-0.6.3-1dca7f9152-09897f6846.zip │ ├── color-convert-npm-1.9.3-1fe690075e-fd7a64a17c.zip │ ├── color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip │ ├── color-name-npm-1.1.3-728b7b5d39-09c5d3e33d.zip │ ├── color-name-npm-1.1.4-025792b0ea-b044585952.zip │ ├── colors-npm-1.4.0-7e2cf12234-98aa2c2418.zip │ ├── commander-npm-10.0.1-f17613b72b-436901d64a.zip │ ├── commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip │ ├── commander-npm-9.1.0-516d19937f-1428319b6b.zip │ ├── commander-npm-9.4.1-9deffb2749-bfb18e325a.zip │ ├── concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip │ ├── core-js-npm-2.6.12-0b93d77d31-44fa9934a8.zip │ ├── core-util-is-npm-1.0.2-9fc2b94dc3-7a4c925b49.zip │ ├── cross-spawn-npm-6.0.5-2deab6c280-f893bb0d96.zip │ ├── cucumber-expressions-npm-6.6.2-da84c47b14-0ae52e6384.zip │ ├── cucumber-npm-5.1.0-a73abf45e9-b29c89a2a1.zip │ ├── cucumber-tag-expressions-npm-1.1.1-5f44748ef8-bae72a5dc1.zip │ ├── d-npm-1.0.1-64afbbc689-49ca0639c7.zip │ ├── debug-npm-4.3.4-4513954577-3dbad3f94e.zip │ ├── deep-eql-npm-3.0.1-9a66c09c65-4f4c9fb79e.zip │ ├── diff-npm-3.5.0-a321a0df19-00842950a6.zip │ ├── diff-npm-4.0.2-73133c7102-f2c09b0ce4.zip │ ├── duration-npm-0.2.2-92951fbe49-907f4fdb2d.zip │ ├── emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip │ ├── error-stack-parser-npm-2.1.4-5b9f7fc0c2-3b916d2d14.zip │ ├── es5-ext-npm-0.10.62-f20aca46cb-25f42f6068.zip │ ├── es6-iterator-npm-2.0.3-4dadb0ccc1-6e48b1c2d9.zip │ ├── es6-symbol-npm-3.1.3-34d72f2a23-cd49722c2a.zip │ ├── escape-string-regexp-npm-1.0.5-3284de402f-6092fda75c.zip │ ├── ext-npm-1.7.0-580588ab93-ef481f9ef4.zip │ ├── extsprintf-npm-1.4.0-2b015bcaab-184dc8a413.zip │ ├── figures-npm-2.0.0-f2db814eec-081beb16ea.zip │ ├── figures-npm-3.2.0-85d357e955-85a6ad29e9.zip │ ├── find-npm-0.3.0-a46fc0202f-1cc321b24e.zip │ ├── fs-extra-npm-8.1.0-197473387f-bf44f0e6ce.zip │ ├── fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip │ ├── function-bind-npm-1.1.1-b56b322ae9-b32fbaebb3.zip │ ├── get-func-name-npm-2.0.0-afbf363765-8d82e69f3e.zip │ ├── gherkin-npm-5.1.0-6c7db00c8f-38be6507fc.zip │ ├── glob-npm-7.1.4-8bd8317a74-f52480fc82.zip │ ├── glob-npm-7.2.3-2d866d17a5-29452e97b3.zip │ ├── global-dirs-npm-3.0.1-8918d35f86-70147b8026.zip │ ├── graceful-fs-npm-4.2.2-8f9c8e70c7-dc4c5062b6.zip │ ├── has-ansi-npm-4.0.1-37b0d00dc4-44c4eb4b17.zip │ ├── has-flag-npm-3.0.0-16ac11fe05-4a15638b45.zip │ ├── has-flag-npm-4.0.0-32af9f0536-261a135703.zip │ ├── has-npm-1.0.3-b7f00631c1-b9ad53d53b.zip │ ├── indent-string-npm-3.2.0-9930503310-a0b72603bb.zip │ ├── indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip │ ├── inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip │ ├── inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip │ ├── ini-npm-2.0.0-28f7426761-e7aadc5fb2.zip │ ├── is-core-module-npm-2.12.0-3bcb45a24f-f7f7eb2ab7.zip │ ├── is-fullwidth-code-point-npm-2.0.0-507f56ec71-eef9c6e15f.zip │ ├── is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip │ ├── is-generator-npm-1.0.3-cb67f150f1-3512b4bfd1.zip │ ├── is-installed-globally-npm-0.4.0-a30dd056c7-3359840d59.zip │ ├── is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip │ ├── is-stream-npm-1.1.0-818ecbf6bb-063c6bec9d.zip │ ├── is-stream-npm-2.0.1-c802db55e7-b8e05ccdf9.zip │ ├── is-wsl-npm-1.1.0-136e2b7c74-ea157d2323.zip │ ├── isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip │ ├── js-base64-npm-2.6.4-569350f803-5f4084078d.zip │ ├── jsonfile-npm-4.0.0-10ce3aea15-6447d6224f.zip │ ├── jsonfile-npm-5.0.0-be63f5e054-e0ecff572d.zip │ ├── knuth-shuffle-seeded-npm-1.0.6-0348efc66e-3f30993233.zip │ ├── lodash-es-npm-4.17.21-b45832dfce-05cbffad6e.zip │ ├── lodash-npm-4.17.21-6382451519-eb835a2e51.zip │ ├── lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip │ ├── lodash.mergewith-npm-4.6.2-7d2d4201ec-a6db2a9339.zip │ ├── lodash.toarray-npm-4.4.0-e7e700a242-2eebcbe757.zip │ ├── lower-case-npm-1.1.4-9880e9dcb0-1ca9393b5e.zip │ ├── lower-case-npm-2.0.2-151055f1c2-83a0a5f159.zip │ ├── lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip │ ├── luxon-npm-3.2.1-56f8d97395-3fa3def2c5.zip │ ├── minimatch-npm-3.0.4-6e76f51c23-66ac295f8a.zip │ ├── minimatch-npm-3.1.2-9405269906-c154e56640.zip │ ├── mkdirp-npm-2.1.6-832c38f12a-8a1d09ffac.zip │ ├── ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip │ ├── mz-npm-2.7.0-ec3cef4ec2-8427de0ece.zip │ ├── nanoclone-npm-0.2.1-972ee958a0-96b2954e22.zip │ ├── next-tick-npm-1.1.0-e0eb60d6a4-83b5cf3602.zip │ ├── nice-try-npm-1.0.5-963856b16f-0b4af3b5bb.zip │ ├── no-case-npm-2.3.2-5403767f87-8564877319.zip │ ├── no-case-npm-3.0.4-12884c3d98-0b2ebc113d.zip │ ├── node-emoji-npm-1.10.0-3bbb4a73cd-e2514e3459.zip │ ├── object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip │ ├── once-npm-1.4.0-ccf03ef07a-cd0a885013.zip │ ├── open-npm-6.4.0-d2020c939f-e5037facf3.zip │ ├── pad-right-npm-0.2.2-79af3fa2ba-090fe065f9.zip │ ├── path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip │ ├── path-key-npm-2.0.1-b1a971833d-f7ab0ad42f.zip │ ├── path-parse-npm-1.0.7-09564527b7-49abf3d811.zip │ ├── pathval-npm-1.1.0-238ccd3696-a6919cf5b1.zip │ ├── progress-npm-2.0.3-d1f87e2ac6-f67403fe7b.zip │ ├── property-expr-npm-2.0.5-6f6bda4c65-4ebe82ce45.zip │ ├── reflect-metadata-npm-0.1.13-c525998e20-798d379a7b.zip │ ├── regenerator-runtime-npm-0.13.11-90bf536060-27481628d2.zip │ ├── regexp-match-indices-npm-1.0.2-9d4b896d66-8cc779f6cf.zip │ ├── regexp-tree-npm-0.1.27-e0324e6a9c-129aebb34d.zip │ ├── repeat-string-npm-1.6.1-bc8e388655-1b809fc6db.zip │ ├── resolve-from-npm-5.0.0-15c9db4d33-4ceeb9113e.zip │ ├── resolve-npm-1.22.2-9d9621a4ae-7e5df75796.zip │ ├── resolve-patch-e661965a60-66cc788f13.zip │ ├── resolve-pkg-npm-2.0.0-7b70eb3262-4a14cc38ef.zip │ ├── rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip │ ├── seed-random-npm-2.2.0-e78c15bb55-74ddfb9560.zip │ ├── semver-npm-5.7.2-938ee91eaa-fb4ab5e0dd.zip │ ├── semver-npm-7.3.8-25a996cb4f-ba9c7cbbf2.zip │ ├── serialize-error-npm-3.0.0-4378bb78b6-695f695a45.zip │ ├── shebang-command-npm-1.2.0-8990ba5d1d-9eed175030.zip │ ├── shebang-regex-npm-1.0.0-c3612b74e9-404c5a752c.zip │ ├── source-map-npm-0.5.6-ac261b6171-390b3f5165.zip │ ├── source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip │ ├── source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip │ ├── stack-chain-npm-2.0.0-cfe43f2a0e-36e4ea7002.zip │ ├── stack-generator-npm-2.0.10-e7aec8545f-4fc3978a93.zip │ ├── stackframe-npm-1.3.4-bf4b7cc8fd-bae1596873.zip │ ├── stacktrace-gps-npm-3.1.2-8c7130b84d-85daa232d1.zip │ ├── stacktrace-js-npm-2.0.2-f022fac9f9-081e786d56.zip │ ├── string-argv-npm-0.1.1-27bd0ab7e9-76e6d3c41a.zip │ ├── string-argv-npm-0.3.2-6e057a88f1-8703ad3f3d.zip │ ├── string-width-npm-2.1.1-0c2c6ae53f-d6173abe08.zip │ ├── string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip │ ├── strip-ansi-npm-4.0.0-d4de985014-d9186e6c0c.zip │ ├── strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip │ ├── supports-color-npm-5.5.0-183ac537bc-95f6f4ba5a.zip │ ├── supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip │ ├── supports-color-npm-8.1.1-289e937149-c052193a7e.zip │ ├── supports-preserve-symlinks-flag-npm-1.0.0-f17c4d0028-53b1e247e6.zip │ ├── thenify-all-npm-1.6.0-96309bbc8b-dba7cc8a23.zip │ ├── thenify-npm-3.3.0-7426338e19-5ba001d401.zip │ ├── title-case-npm-2.1.1-d828015841-e88ddfc460.zip │ ├── tmp-npm-0.2.1-a9c8d9c0ca-8b12146541.zip │ ├── toposort-npm-2.0.2-d472329c7d-d64c74b570.zip │ ├── traverse-chain-npm-0.1.0-c14e6fc22c-dea79231a4.zip │ ├── tslib-npm-2.5.0-bb364efebd-ae3ed5f9ce.zip │ ├── type-detect-npm-4.0.8-8d8127b901-62b5628bff.zip │ ├── type-npm-1.2.0-e67311c4b2-dae8c64f82.zip │ ├── type-npm-2.7.2-626963ea46-0f42379a8a.zip │ ├── universalify-npm-0.1.2-9b22d31d2d-40cdc60f6e.zip │ ├── upper-case-first-npm-2.0.2-8e0c5a851a-4487db4701.zip │ ├── upper-case-npm-1.1.3-061d82781f-991c845de7.zip │ ├── util-arity-npm-1.1.0-026931c155-ac30ab442d.zip │ ├── uuid-npm-3.4.0-4fd8ef88ad-58de2feed6.zip │ ├── uuid-npm-9.0.0-46c41e3e43-8dd2c83c43.zip │ ├── verror-npm-1.10.1-b32918fe63-690a8d6ad5.zip │ ├── which-npm-1.3.1-f0ebb8bdd8-f2e185c624.zip │ ├── wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip │ ├── xmlbuilder-npm-15.1.1-becc60bf4e-14f7302402.zip │ ├── yallist-npm-4.0.0-b493d9e907-343617202a.zip │ ├── yaml-npm-2.2.2-6e3cddb343-d90c235e09.zip │ └── yup-npm-0.32.11-dbaff8ca9c-43a16786b4.zip └── install-state.gz ├── .yarnrc.yml ├── CHANGELOG.md ├── LICENSE.txt ├── README.md ├── coding-Standards └── eslint │ └── .eslintrc.json ├── cucumber-html-reporter.iml ├── index.d.ts ├── index.js ├── lib ├── hierarchyReporter.js ├── jsonDir.js ├── reporter.js └── searchFileUp.js ├── package.json ├── samples ├── html_report_snapshots │ ├── cucumber_report_bootstrap_snapshot.png │ ├── cucumber_report_bootstrap_snapshot_with_metadata.png │ ├── cucumber_report_bootstrap_snapshot_with_more_info.png │ └── cucumber_report_bootstrap_snapshot_with_screenshot.png ├── html_reports │ ├── cucumber_report_bootstrap.html │ ├── cucumber_report_foundation.html │ ├── cucumber_report_hierarchy.html │ └── cucumber_report_simple.html └── snapshots.md ├── screenshots ├── a_failing_scenario_captures_a_screenshot_4170.png ├── a_failing_scenario_captures_a_screenshot_4687.png ├── a_failing_scenario_captures_a_screenshot_4970.png └── a_failing_scenario_captures_a_screenshot_9719.png ├── templates ├── _common │ ├── bootstrap.hierarchy │ │ ├── features.html │ │ ├── piechart.js │ │ ├── script.js │ │ └── style.css │ ├── foundation │ │ └── script.js │ └── screenshot.js ├── bootstrap │ └── index.html ├── foundation │ ├── features.html │ ├── index.html │ └── style.css ├── hierarchy │ └── index.html └── simple │ ├── features.html │ ├── index.html │ ├── script.js │ └── style.css ├── test ├── assert │ └── assertHtmlReports.js ├── config │ └── config.json ├── createHtmlReports.js ├── features │ ├── happy │ │ ├── admin │ │ │ └── happy.feature │ │ ├── happy.feature │ │ └── overjoyed │ │ │ ├── happy.feature │ │ │ └── overjoyed.feature │ ├── step_definitions │ │ ├── hooks.js │ │ └── stepDefs.js │ └── unhappy │ │ ├── admin │ │ └── unhappy.feature │ │ └── unhappy.feature └── report │ └── multi │ ├── cucumber_report-1.json │ └── cucumber_report-2.json └── yarn.lock /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | // most folder contexts extend rules in a language-specific way (e.g. src, lambda) so these are a catch-all for other folders 3 | "root":true, 4 | "extends": [ 5 | "./coding-standards/eslint/.eslintrc.json" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created 2 | # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages 3 | 4 | name: Node.js Package 5 | 6 | on: 7 | release: 8 | types: [created] 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: actions/setup-node@v3 16 | with: 17 | node-version: 16 18 | - run: npm ci 19 | - run: npm test 20 | 21 | publish-npm: 22 | needs: build 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v3 26 | - uses: actions/setup-node@v3 27 | with: 28 | node-version: 16 29 | registry-url: https://registry.npmjs.org/ 30 | - run: npm ci 31 | - run: npm publish 32 | env: 33 | NODE_AUTH_TOKEN: ${{secrets.npm_token}} 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ 2 | /node_modules/ 3 | test/report/*.html 4 | test/report/*.json 5 | *.log 6 | .DS_Store 7 | /samples/.DS_Store 8 | templates/.DS_Store 9 | templates/_common/.DS_Store 10 | test/.DS_Store 11 | test/features/.DS_Store 12 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | //npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN} 2 | @abhaygarg:registry=https://npm.pkg.github.com 3 | always-auth=true 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 12 4 | 5 | before_script: 6 | - curl -o- -L https://yarnpkg.com/install.sh 7 | - export PATH="$HOME/.yarn/bin:$PATH" 8 | 9 | cache: 10 | npm: false -------------------------------------------------------------------------------- /.yarn/cache/@babel-polyfill-npm-7.12.1-a393b8d870-3f59a9d85a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@babel-polyfill-npm-7.12.1-a393b8d870-3f59a9d85a.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-runtime-npm-7.21.5-7d058028a3-358f2779d3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@babel-runtime-npm-7.21.5-7d058028a3-358f2779d3.zip -------------------------------------------------------------------------------- /.yarn/cache/@colors-colors-npm-1.5.0-875af3a8b4-d64d5260be.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@colors-colors-npm-1.5.0-875af3a8b4-d64d5260be.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-ci-environment-npm-9.1.0-d31a763262-a5b8d9a42f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-ci-environment-npm-9.1.0-d31a763262-a5b8d9a42f.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-cucumber-expressions-npm-16.1.1-640221664e-2c05439248.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-cucumber-expressions-npm-16.1.1-640221664e-2c05439248.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-cucumber-npm-9.1.2-b6884d6874-99c3402e50.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-cucumber-npm-9.1.2-b6884d6874-99c3402e50.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-gherkin-npm-25.0.2-15c388f65b-673083ae96.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-gherkin-npm-25.0.2-15c388f65b-673083ae96.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-gherkin-npm-26.0.3-0adfeb1401-b070739a8b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-gherkin-npm-26.0.3-0adfeb1401-b070739a8b.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-gherkin-streams-npm-5.0.1-a9097ed93e-b8e85b60c0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-gherkin-streams-npm-5.0.1-a9097ed93e-b8e85b60c0.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-gherkin-utils-npm-8.0.2-a6fec84496-2c93c4e90c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-gherkin-utils-npm-8.0.2-a6fec84496-2c93c4e90c.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-html-formatter-npm-20.2.1-b2876ae75a-a98538ccc8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-html-formatter-npm-20.2.1-b2876ae75a-a98538ccc8.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-message-streams-npm-4.0.1-0c98ff65d5-1ebb05ccf9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-message-streams-npm-4.0.1-0c98ff65d5-1ebb05ccf9.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-messages-npm-19.1.4-0282e9611e-54981faf2a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-messages-npm-19.1.4-0282e9611e-54981faf2a.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-messages-npm-21.0.1-5dd3dcfba8-01849f35bb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-messages-npm-21.0.1-5dd3dcfba8-01849f35bb.zip -------------------------------------------------------------------------------- /.yarn/cache/@cucumber-tag-expressions-npm-5.0.1-c376edd938-9d3a5b4d98.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@cucumber-tag-expressions-npm-5.0.1-c376edd938-9d3a5b4d98.zip -------------------------------------------------------------------------------- /.yarn/cache/@teppeis-multimaps-npm-2.0.0-b73624193d-eb0d3bf290.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@teppeis-multimaps-npm-2.0.0-b73624193d-eb0d3bf290.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-lodash-npm-4.14.194-f099c0742e-113f34831c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@types-lodash-npm-4.14.194-f099c0742e-113f34831c.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-uuid-npm-8.3.4-7547f4402c-6f11f3ff70.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/@types-uuid-npm-8.3.4-7547f4402c-6f11f3ff70.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-regex-npm-3.0.1-01f44078a3-09daf180c5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/ansi-regex-npm-3.0.1-01f44078a3-09daf180c5.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-regex-npm-4.1.1-af0a582bb9-b1a6ee44cb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/ansi-regex-npm-4.1.1-af0a582bb9-b1a6ee44cb.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-styles-npm-3.2.1-8cb8107983-d85ade01c1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/ansi-styles-npm-3.2.1-8cb8107983-d85ade01c1.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip -------------------------------------------------------------------------------- /.yarn/cache/any-promise-npm-1.3.0-f34eeaa7e7-0ee8a9bdbe.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/any-promise-npm-1.3.0-f34eeaa7e7-0ee8a9bdbe.zip -------------------------------------------------------------------------------- /.yarn/cache/assert-plus-npm-1.0.0-cac95ef098-19b4340cb8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/assert-plus-npm-1.0.0-cac95ef098-19b4340cb8.zip -------------------------------------------------------------------------------- /.yarn/cache/assertion-error-formatter-npm-2.0.1-d0af52f968-25cce426c2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/assertion-error-formatter-npm-2.0.1-d0af52f968-25cce426c2.zip -------------------------------------------------------------------------------- /.yarn/cache/assertion-error-formatter-npm-3.0.0-13cc1330f6-82d7349bc0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/assertion-error-formatter-npm-3.0.0-13cc1330f6-82d7349bc0.zip -------------------------------------------------------------------------------- /.yarn/cache/assertion-error-npm-1.1.0-66b893015e-fd9429d3a3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/assertion-error-npm-1.1.0-66b893015e-fd9429d3a3.zip -------------------------------------------------------------------------------- /.yarn/cache/balanced-match-npm-1.0.0-951a2ad706-9b67bfe558.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/balanced-match-npm-1.0.0-951a2ad706-9b67bfe558.zip -------------------------------------------------------------------------------- /.yarn/cache/becke-ch--regex--s0-0-v1--base--pl--lib-npm-1.4.0-c5dcc80723-45d23b80ab.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/becke-ch--regex--s0-0-v1--base--pl--lib-npm-1.4.0-c5dcc80723-45d23b80ab.zip -------------------------------------------------------------------------------- /.yarn/cache/bluebird-npm-3.7.2-6a54136ee3-869417503c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/bluebird-npm-3.7.2-6a54136ee3-869417503c.zip -------------------------------------------------------------------------------- /.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip -------------------------------------------------------------------------------- /.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip -------------------------------------------------------------------------------- /.yarn/cache/capital-case-npm-1.0.4-90f8a4641d-41fa8fa87f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/capital-case-npm-1.0.4-90f8a4641d-41fa8fa87f.zip -------------------------------------------------------------------------------- /.yarn/cache/chai-npm-4.2.0-b777309e5a-47881a30da.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/chai-npm-4.2.0-b777309e5a-47881a30da.zip -------------------------------------------------------------------------------- /.yarn/cache/chalk-npm-2.4.2-3ea16dd91e-ec3661d38f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/chalk-npm-2.4.2-3ea16dd91e-ec3661d38f.zip -------------------------------------------------------------------------------- /.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip -------------------------------------------------------------------------------- /.yarn/cache/check-error-npm-1.0.2-00c540c6e9-d9d1065044.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/check-error-npm-1.0.2-00c540c6e9-d9d1065044.zip -------------------------------------------------------------------------------- /.yarn/cache/class-transformer-npm-0.5.1-96b5161e6c-f191c8b4cc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/class-transformer-npm-0.5.1-96b5161e6c-f191c8b4cc.zip -------------------------------------------------------------------------------- /.yarn/cache/cli-table3-npm-0.5.1-570cb07b69-3ff8c82144.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/cli-table3-npm-0.5.1-570cb07b69-3ff8c82144.zip -------------------------------------------------------------------------------- /.yarn/cache/cli-table3-npm-0.6.3-1dca7f9152-09897f6846.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/cli-table3-npm-0.6.3-1dca7f9152-09897f6846.zip -------------------------------------------------------------------------------- /.yarn/cache/color-convert-npm-1.9.3-1fe690075e-fd7a64a17c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/color-convert-npm-1.9.3-1fe690075e-fd7a64a17c.zip -------------------------------------------------------------------------------- /.yarn/cache/color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip -------------------------------------------------------------------------------- /.yarn/cache/color-name-npm-1.1.3-728b7b5d39-09c5d3e33d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/color-name-npm-1.1.3-728b7b5d39-09c5d3e33d.zip -------------------------------------------------------------------------------- /.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip -------------------------------------------------------------------------------- /.yarn/cache/colors-npm-1.4.0-7e2cf12234-98aa2c2418.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/colors-npm-1.4.0-7e2cf12234-98aa2c2418.zip -------------------------------------------------------------------------------- /.yarn/cache/commander-npm-10.0.1-f17613b72b-436901d64a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/commander-npm-10.0.1-f17613b72b-436901d64a.zip -------------------------------------------------------------------------------- /.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip -------------------------------------------------------------------------------- /.yarn/cache/commander-npm-9.1.0-516d19937f-1428319b6b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/commander-npm-9.1.0-516d19937f-1428319b6b.zip -------------------------------------------------------------------------------- /.yarn/cache/commander-npm-9.4.1-9deffb2749-bfb18e325a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/commander-npm-9.4.1-9deffb2749-bfb18e325a.zip -------------------------------------------------------------------------------- /.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip -------------------------------------------------------------------------------- /.yarn/cache/core-js-npm-2.6.12-0b93d77d31-44fa9934a8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/core-js-npm-2.6.12-0b93d77d31-44fa9934a8.zip -------------------------------------------------------------------------------- /.yarn/cache/core-util-is-npm-1.0.2-9fc2b94dc3-7a4c925b49.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/core-util-is-npm-1.0.2-9fc2b94dc3-7a4c925b49.zip -------------------------------------------------------------------------------- /.yarn/cache/cross-spawn-npm-6.0.5-2deab6c280-f893bb0d96.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/cross-spawn-npm-6.0.5-2deab6c280-f893bb0d96.zip -------------------------------------------------------------------------------- /.yarn/cache/cucumber-expressions-npm-6.6.2-da84c47b14-0ae52e6384.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/cucumber-expressions-npm-6.6.2-da84c47b14-0ae52e6384.zip -------------------------------------------------------------------------------- /.yarn/cache/cucumber-npm-5.1.0-a73abf45e9-b29c89a2a1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/cucumber-npm-5.1.0-a73abf45e9-b29c89a2a1.zip -------------------------------------------------------------------------------- /.yarn/cache/cucumber-tag-expressions-npm-1.1.1-5f44748ef8-bae72a5dc1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/cucumber-tag-expressions-npm-1.1.1-5f44748ef8-bae72a5dc1.zip -------------------------------------------------------------------------------- /.yarn/cache/d-npm-1.0.1-64afbbc689-49ca0639c7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/d-npm-1.0.1-64afbbc689-49ca0639c7.zip -------------------------------------------------------------------------------- /.yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip -------------------------------------------------------------------------------- /.yarn/cache/deep-eql-npm-3.0.1-9a66c09c65-4f4c9fb79e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/deep-eql-npm-3.0.1-9a66c09c65-4f4c9fb79e.zip -------------------------------------------------------------------------------- /.yarn/cache/diff-npm-3.5.0-a321a0df19-00842950a6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/diff-npm-3.5.0-a321a0df19-00842950a6.zip -------------------------------------------------------------------------------- /.yarn/cache/diff-npm-4.0.2-73133c7102-f2c09b0ce4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/diff-npm-4.0.2-73133c7102-f2c09b0ce4.zip -------------------------------------------------------------------------------- /.yarn/cache/duration-npm-0.2.2-92951fbe49-907f4fdb2d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/duration-npm-0.2.2-92951fbe49-907f4fdb2d.zip -------------------------------------------------------------------------------- /.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip -------------------------------------------------------------------------------- /.yarn/cache/error-stack-parser-npm-2.1.4-5b9f7fc0c2-3b916d2d14.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/error-stack-parser-npm-2.1.4-5b9f7fc0c2-3b916d2d14.zip -------------------------------------------------------------------------------- /.yarn/cache/es5-ext-npm-0.10.62-f20aca46cb-25f42f6068.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/es5-ext-npm-0.10.62-f20aca46cb-25f42f6068.zip -------------------------------------------------------------------------------- /.yarn/cache/es6-iterator-npm-2.0.3-4dadb0ccc1-6e48b1c2d9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/es6-iterator-npm-2.0.3-4dadb0ccc1-6e48b1c2d9.zip -------------------------------------------------------------------------------- /.yarn/cache/es6-symbol-npm-3.1.3-34d72f2a23-cd49722c2a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/es6-symbol-npm-3.1.3-34d72f2a23-cd49722c2a.zip -------------------------------------------------------------------------------- /.yarn/cache/escape-string-regexp-npm-1.0.5-3284de402f-6092fda75c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/escape-string-regexp-npm-1.0.5-3284de402f-6092fda75c.zip -------------------------------------------------------------------------------- /.yarn/cache/ext-npm-1.7.0-580588ab93-ef481f9ef4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/ext-npm-1.7.0-580588ab93-ef481f9ef4.zip -------------------------------------------------------------------------------- /.yarn/cache/extsprintf-npm-1.4.0-2b015bcaab-184dc8a413.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/extsprintf-npm-1.4.0-2b015bcaab-184dc8a413.zip -------------------------------------------------------------------------------- /.yarn/cache/figures-npm-2.0.0-f2db814eec-081beb16ea.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/figures-npm-2.0.0-f2db814eec-081beb16ea.zip -------------------------------------------------------------------------------- /.yarn/cache/figures-npm-3.2.0-85d357e955-85a6ad29e9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/figures-npm-3.2.0-85d357e955-85a6ad29e9.zip -------------------------------------------------------------------------------- /.yarn/cache/find-npm-0.3.0-a46fc0202f-1cc321b24e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/find-npm-0.3.0-a46fc0202f-1cc321b24e.zip -------------------------------------------------------------------------------- /.yarn/cache/fs-extra-npm-8.1.0-197473387f-bf44f0e6ce.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/fs-extra-npm-8.1.0-197473387f-bf44f0e6ce.zip -------------------------------------------------------------------------------- /.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip -------------------------------------------------------------------------------- /.yarn/cache/function-bind-npm-1.1.1-b56b322ae9-b32fbaebb3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/function-bind-npm-1.1.1-b56b322ae9-b32fbaebb3.zip -------------------------------------------------------------------------------- /.yarn/cache/get-func-name-npm-2.0.0-afbf363765-8d82e69f3e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/get-func-name-npm-2.0.0-afbf363765-8d82e69f3e.zip -------------------------------------------------------------------------------- /.yarn/cache/gherkin-npm-5.1.0-6c7db00c8f-38be6507fc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/gherkin-npm-5.1.0-6c7db00c8f-38be6507fc.zip -------------------------------------------------------------------------------- /.yarn/cache/glob-npm-7.1.4-8bd8317a74-f52480fc82.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/glob-npm-7.1.4-8bd8317a74-f52480fc82.zip -------------------------------------------------------------------------------- /.yarn/cache/glob-npm-7.2.3-2d866d17a5-29452e97b3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/glob-npm-7.2.3-2d866d17a5-29452e97b3.zip -------------------------------------------------------------------------------- /.yarn/cache/global-dirs-npm-3.0.1-8918d35f86-70147b8026.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/global-dirs-npm-3.0.1-8918d35f86-70147b8026.zip -------------------------------------------------------------------------------- /.yarn/cache/graceful-fs-npm-4.2.2-8f9c8e70c7-dc4c5062b6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/graceful-fs-npm-4.2.2-8f9c8e70c7-dc4c5062b6.zip -------------------------------------------------------------------------------- /.yarn/cache/has-ansi-npm-4.0.1-37b0d00dc4-44c4eb4b17.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/has-ansi-npm-4.0.1-37b0d00dc4-44c4eb4b17.zip -------------------------------------------------------------------------------- /.yarn/cache/has-flag-npm-3.0.0-16ac11fe05-4a15638b45.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/has-flag-npm-3.0.0-16ac11fe05-4a15638b45.zip -------------------------------------------------------------------------------- /.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip -------------------------------------------------------------------------------- /.yarn/cache/has-npm-1.0.3-b7f00631c1-b9ad53d53b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/has-npm-1.0.3-b7f00631c1-b9ad53d53b.zip -------------------------------------------------------------------------------- /.yarn/cache/indent-string-npm-3.2.0-9930503310-a0b72603bb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/indent-string-npm-3.2.0-9930503310-a0b72603bb.zip -------------------------------------------------------------------------------- /.yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip -------------------------------------------------------------------------------- /.yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip -------------------------------------------------------------------------------- /.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip -------------------------------------------------------------------------------- /.yarn/cache/ini-npm-2.0.0-28f7426761-e7aadc5fb2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/ini-npm-2.0.0-28f7426761-e7aadc5fb2.zip -------------------------------------------------------------------------------- /.yarn/cache/is-core-module-npm-2.12.0-3bcb45a24f-f7f7eb2ab7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/is-core-module-npm-2.12.0-3bcb45a24f-f7f7eb2ab7.zip -------------------------------------------------------------------------------- /.yarn/cache/is-fullwidth-code-point-npm-2.0.0-507f56ec71-eef9c6e15f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/is-fullwidth-code-point-npm-2.0.0-507f56ec71-eef9c6e15f.zip -------------------------------------------------------------------------------- /.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip -------------------------------------------------------------------------------- /.yarn/cache/is-generator-npm-1.0.3-cb67f150f1-3512b4bfd1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/is-generator-npm-1.0.3-cb67f150f1-3512b4bfd1.zip -------------------------------------------------------------------------------- /.yarn/cache/is-installed-globally-npm-0.4.0-a30dd056c7-3359840d59.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/is-installed-globally-npm-0.4.0-a30dd056c7-3359840d59.zip -------------------------------------------------------------------------------- /.yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip -------------------------------------------------------------------------------- /.yarn/cache/is-stream-npm-1.1.0-818ecbf6bb-063c6bec9d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/is-stream-npm-1.1.0-818ecbf6bb-063c6bec9d.zip -------------------------------------------------------------------------------- /.yarn/cache/is-stream-npm-2.0.1-c802db55e7-b8e05ccdf9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/is-stream-npm-2.0.1-c802db55e7-b8e05ccdf9.zip -------------------------------------------------------------------------------- /.yarn/cache/is-wsl-npm-1.1.0-136e2b7c74-ea157d2323.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/is-wsl-npm-1.1.0-136e2b7c74-ea157d2323.zip -------------------------------------------------------------------------------- /.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip -------------------------------------------------------------------------------- /.yarn/cache/js-base64-npm-2.6.4-569350f803-5f4084078d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/js-base64-npm-2.6.4-569350f803-5f4084078d.zip -------------------------------------------------------------------------------- /.yarn/cache/jsonfile-npm-4.0.0-10ce3aea15-6447d6224f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/jsonfile-npm-4.0.0-10ce3aea15-6447d6224f.zip -------------------------------------------------------------------------------- /.yarn/cache/jsonfile-npm-5.0.0-be63f5e054-e0ecff572d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/jsonfile-npm-5.0.0-be63f5e054-e0ecff572d.zip -------------------------------------------------------------------------------- /.yarn/cache/knuth-shuffle-seeded-npm-1.0.6-0348efc66e-3f30993233.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/knuth-shuffle-seeded-npm-1.0.6-0348efc66e-3f30993233.zip -------------------------------------------------------------------------------- /.yarn/cache/lodash-es-npm-4.17.21-b45832dfce-05cbffad6e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/lodash-es-npm-4.17.21-b45832dfce-05cbffad6e.zip -------------------------------------------------------------------------------- /.yarn/cache/lodash-npm-4.17.21-6382451519-eb835a2e51.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/lodash-npm-4.17.21-6382451519-eb835a2e51.zip -------------------------------------------------------------------------------- /.yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip -------------------------------------------------------------------------------- /.yarn/cache/lodash.mergewith-npm-4.6.2-7d2d4201ec-a6db2a9339.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/lodash.mergewith-npm-4.6.2-7d2d4201ec-a6db2a9339.zip -------------------------------------------------------------------------------- /.yarn/cache/lodash.toarray-npm-4.4.0-e7e700a242-2eebcbe757.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/lodash.toarray-npm-4.4.0-e7e700a242-2eebcbe757.zip -------------------------------------------------------------------------------- /.yarn/cache/lower-case-npm-1.1.4-9880e9dcb0-1ca9393b5e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/lower-case-npm-1.1.4-9880e9dcb0-1ca9393b5e.zip -------------------------------------------------------------------------------- /.yarn/cache/lower-case-npm-2.0.2-151055f1c2-83a0a5f159.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/lower-case-npm-2.0.2-151055f1c2-83a0a5f159.zip -------------------------------------------------------------------------------- /.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip -------------------------------------------------------------------------------- /.yarn/cache/luxon-npm-3.2.1-56f8d97395-3fa3def2c5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/luxon-npm-3.2.1-56f8d97395-3fa3def2c5.zip -------------------------------------------------------------------------------- /.yarn/cache/minimatch-npm-3.0.4-6e76f51c23-66ac295f8a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/minimatch-npm-3.0.4-6e76f51c23-66ac295f8a.zip -------------------------------------------------------------------------------- /.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip -------------------------------------------------------------------------------- /.yarn/cache/mkdirp-npm-2.1.6-832c38f12a-8a1d09ffac.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/mkdirp-npm-2.1.6-832c38f12a-8a1d09ffac.zip -------------------------------------------------------------------------------- /.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip -------------------------------------------------------------------------------- /.yarn/cache/mz-npm-2.7.0-ec3cef4ec2-8427de0ece.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/mz-npm-2.7.0-ec3cef4ec2-8427de0ece.zip -------------------------------------------------------------------------------- /.yarn/cache/nanoclone-npm-0.2.1-972ee958a0-96b2954e22.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/nanoclone-npm-0.2.1-972ee958a0-96b2954e22.zip -------------------------------------------------------------------------------- /.yarn/cache/next-tick-npm-1.1.0-e0eb60d6a4-83b5cf3602.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/next-tick-npm-1.1.0-e0eb60d6a4-83b5cf3602.zip -------------------------------------------------------------------------------- /.yarn/cache/nice-try-npm-1.0.5-963856b16f-0b4af3b5bb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/nice-try-npm-1.0.5-963856b16f-0b4af3b5bb.zip -------------------------------------------------------------------------------- /.yarn/cache/no-case-npm-2.3.2-5403767f87-8564877319.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/no-case-npm-2.3.2-5403767f87-8564877319.zip -------------------------------------------------------------------------------- /.yarn/cache/no-case-npm-3.0.4-12884c3d98-0b2ebc113d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/no-case-npm-3.0.4-12884c3d98-0b2ebc113d.zip -------------------------------------------------------------------------------- /.yarn/cache/node-emoji-npm-1.10.0-3bbb4a73cd-e2514e3459.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/node-emoji-npm-1.10.0-3bbb4a73cd-e2514e3459.zip -------------------------------------------------------------------------------- /.yarn/cache/object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip -------------------------------------------------------------------------------- /.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip -------------------------------------------------------------------------------- /.yarn/cache/open-npm-6.4.0-d2020c939f-e5037facf3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/open-npm-6.4.0-d2020c939f-e5037facf3.zip -------------------------------------------------------------------------------- /.yarn/cache/pad-right-npm-0.2.2-79af3fa2ba-090fe065f9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/pad-right-npm-0.2.2-79af3fa2ba-090fe065f9.zip -------------------------------------------------------------------------------- /.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip -------------------------------------------------------------------------------- /.yarn/cache/path-key-npm-2.0.1-b1a971833d-f7ab0ad42f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/path-key-npm-2.0.1-b1a971833d-f7ab0ad42f.zip -------------------------------------------------------------------------------- /.yarn/cache/path-parse-npm-1.0.7-09564527b7-49abf3d811.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/path-parse-npm-1.0.7-09564527b7-49abf3d811.zip -------------------------------------------------------------------------------- /.yarn/cache/pathval-npm-1.1.0-238ccd3696-a6919cf5b1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/pathval-npm-1.1.0-238ccd3696-a6919cf5b1.zip -------------------------------------------------------------------------------- /.yarn/cache/progress-npm-2.0.3-d1f87e2ac6-f67403fe7b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/progress-npm-2.0.3-d1f87e2ac6-f67403fe7b.zip -------------------------------------------------------------------------------- /.yarn/cache/property-expr-npm-2.0.5-6f6bda4c65-4ebe82ce45.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/property-expr-npm-2.0.5-6f6bda4c65-4ebe82ce45.zip -------------------------------------------------------------------------------- /.yarn/cache/reflect-metadata-npm-0.1.13-c525998e20-798d379a7b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/reflect-metadata-npm-0.1.13-c525998e20-798d379a7b.zip -------------------------------------------------------------------------------- /.yarn/cache/regenerator-runtime-npm-0.13.11-90bf536060-27481628d2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/regenerator-runtime-npm-0.13.11-90bf536060-27481628d2.zip -------------------------------------------------------------------------------- /.yarn/cache/regexp-match-indices-npm-1.0.2-9d4b896d66-8cc779f6cf.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/regexp-match-indices-npm-1.0.2-9d4b896d66-8cc779f6cf.zip -------------------------------------------------------------------------------- /.yarn/cache/regexp-tree-npm-0.1.27-e0324e6a9c-129aebb34d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/regexp-tree-npm-0.1.27-e0324e6a9c-129aebb34d.zip -------------------------------------------------------------------------------- /.yarn/cache/repeat-string-npm-1.6.1-bc8e388655-1b809fc6db.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/repeat-string-npm-1.6.1-bc8e388655-1b809fc6db.zip -------------------------------------------------------------------------------- /.yarn/cache/resolve-from-npm-5.0.0-15c9db4d33-4ceeb9113e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/resolve-from-npm-5.0.0-15c9db4d33-4ceeb9113e.zip -------------------------------------------------------------------------------- /.yarn/cache/resolve-npm-1.22.2-9d9621a4ae-7e5df75796.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/resolve-npm-1.22.2-9d9621a4ae-7e5df75796.zip -------------------------------------------------------------------------------- /.yarn/cache/resolve-patch-e661965a60-66cc788f13.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/resolve-patch-e661965a60-66cc788f13.zip -------------------------------------------------------------------------------- /.yarn/cache/resolve-pkg-npm-2.0.0-7b70eb3262-4a14cc38ef.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/resolve-pkg-npm-2.0.0-7b70eb3262-4a14cc38ef.zip -------------------------------------------------------------------------------- /.yarn/cache/rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip -------------------------------------------------------------------------------- /.yarn/cache/seed-random-npm-2.2.0-e78c15bb55-74ddfb9560.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/seed-random-npm-2.2.0-e78c15bb55-74ddfb9560.zip -------------------------------------------------------------------------------- /.yarn/cache/semver-npm-5.7.2-938ee91eaa-fb4ab5e0dd.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/semver-npm-5.7.2-938ee91eaa-fb4ab5e0dd.zip -------------------------------------------------------------------------------- /.yarn/cache/semver-npm-7.3.8-25a996cb4f-ba9c7cbbf2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/semver-npm-7.3.8-25a996cb4f-ba9c7cbbf2.zip -------------------------------------------------------------------------------- /.yarn/cache/serialize-error-npm-3.0.0-4378bb78b6-695f695a45.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/serialize-error-npm-3.0.0-4378bb78b6-695f695a45.zip -------------------------------------------------------------------------------- /.yarn/cache/shebang-command-npm-1.2.0-8990ba5d1d-9eed175030.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/shebang-command-npm-1.2.0-8990ba5d1d-9eed175030.zip -------------------------------------------------------------------------------- /.yarn/cache/shebang-regex-npm-1.0.0-c3612b74e9-404c5a752c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/shebang-regex-npm-1.0.0-c3612b74e9-404c5a752c.zip -------------------------------------------------------------------------------- /.yarn/cache/source-map-npm-0.5.6-ac261b6171-390b3f5165.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/source-map-npm-0.5.6-ac261b6171-390b3f5165.zip -------------------------------------------------------------------------------- /.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip -------------------------------------------------------------------------------- /.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip -------------------------------------------------------------------------------- /.yarn/cache/stack-chain-npm-2.0.0-cfe43f2a0e-36e4ea7002.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/stack-chain-npm-2.0.0-cfe43f2a0e-36e4ea7002.zip -------------------------------------------------------------------------------- /.yarn/cache/stack-generator-npm-2.0.10-e7aec8545f-4fc3978a93.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/stack-generator-npm-2.0.10-e7aec8545f-4fc3978a93.zip -------------------------------------------------------------------------------- /.yarn/cache/stackframe-npm-1.3.4-bf4b7cc8fd-bae1596873.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/stackframe-npm-1.3.4-bf4b7cc8fd-bae1596873.zip -------------------------------------------------------------------------------- /.yarn/cache/stacktrace-gps-npm-3.1.2-8c7130b84d-85daa232d1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/stacktrace-gps-npm-3.1.2-8c7130b84d-85daa232d1.zip -------------------------------------------------------------------------------- /.yarn/cache/stacktrace-js-npm-2.0.2-f022fac9f9-081e786d56.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/stacktrace-js-npm-2.0.2-f022fac9f9-081e786d56.zip -------------------------------------------------------------------------------- /.yarn/cache/string-argv-npm-0.1.1-27bd0ab7e9-76e6d3c41a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/string-argv-npm-0.1.1-27bd0ab7e9-76e6d3c41a.zip -------------------------------------------------------------------------------- /.yarn/cache/string-argv-npm-0.3.2-6e057a88f1-8703ad3f3d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/string-argv-npm-0.3.2-6e057a88f1-8703ad3f3d.zip -------------------------------------------------------------------------------- /.yarn/cache/string-width-npm-2.1.1-0c2c6ae53f-d6173abe08.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/string-width-npm-2.1.1-0c2c6ae53f-d6173abe08.zip -------------------------------------------------------------------------------- /.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip -------------------------------------------------------------------------------- /.yarn/cache/strip-ansi-npm-4.0.0-d4de985014-d9186e6c0c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/strip-ansi-npm-4.0.0-d4de985014-d9186e6c0c.zip -------------------------------------------------------------------------------- /.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip -------------------------------------------------------------------------------- /.yarn/cache/supports-color-npm-5.5.0-183ac537bc-95f6f4ba5a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/supports-color-npm-5.5.0-183ac537bc-95f6f4ba5a.zip -------------------------------------------------------------------------------- /.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip -------------------------------------------------------------------------------- /.yarn/cache/supports-color-npm-8.1.1-289e937149-c052193a7e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/supports-color-npm-8.1.1-289e937149-c052193a7e.zip -------------------------------------------------------------------------------- /.yarn/cache/supports-preserve-symlinks-flag-npm-1.0.0-f17c4d0028-53b1e247e6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/supports-preserve-symlinks-flag-npm-1.0.0-f17c4d0028-53b1e247e6.zip -------------------------------------------------------------------------------- /.yarn/cache/thenify-all-npm-1.6.0-96309bbc8b-dba7cc8a23.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/thenify-all-npm-1.6.0-96309bbc8b-dba7cc8a23.zip -------------------------------------------------------------------------------- /.yarn/cache/thenify-npm-3.3.0-7426338e19-5ba001d401.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/thenify-npm-3.3.0-7426338e19-5ba001d401.zip -------------------------------------------------------------------------------- /.yarn/cache/title-case-npm-2.1.1-d828015841-e88ddfc460.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/title-case-npm-2.1.1-d828015841-e88ddfc460.zip -------------------------------------------------------------------------------- /.yarn/cache/tmp-npm-0.2.1-a9c8d9c0ca-8b12146541.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/tmp-npm-0.2.1-a9c8d9c0ca-8b12146541.zip -------------------------------------------------------------------------------- /.yarn/cache/toposort-npm-2.0.2-d472329c7d-d64c74b570.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/toposort-npm-2.0.2-d472329c7d-d64c74b570.zip -------------------------------------------------------------------------------- /.yarn/cache/traverse-chain-npm-0.1.0-c14e6fc22c-dea79231a4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/traverse-chain-npm-0.1.0-c14e6fc22c-dea79231a4.zip -------------------------------------------------------------------------------- /.yarn/cache/tslib-npm-2.5.0-bb364efebd-ae3ed5f9ce.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/tslib-npm-2.5.0-bb364efebd-ae3ed5f9ce.zip -------------------------------------------------------------------------------- /.yarn/cache/type-detect-npm-4.0.8-8d8127b901-62b5628bff.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/type-detect-npm-4.0.8-8d8127b901-62b5628bff.zip -------------------------------------------------------------------------------- /.yarn/cache/type-npm-1.2.0-e67311c4b2-dae8c64f82.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/type-npm-1.2.0-e67311c4b2-dae8c64f82.zip -------------------------------------------------------------------------------- /.yarn/cache/type-npm-2.7.2-626963ea46-0f42379a8a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/type-npm-2.7.2-626963ea46-0f42379a8a.zip -------------------------------------------------------------------------------- /.yarn/cache/universalify-npm-0.1.2-9b22d31d2d-40cdc60f6e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/universalify-npm-0.1.2-9b22d31d2d-40cdc60f6e.zip -------------------------------------------------------------------------------- /.yarn/cache/upper-case-first-npm-2.0.2-8e0c5a851a-4487db4701.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/upper-case-first-npm-2.0.2-8e0c5a851a-4487db4701.zip -------------------------------------------------------------------------------- /.yarn/cache/upper-case-npm-1.1.3-061d82781f-991c845de7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/upper-case-npm-1.1.3-061d82781f-991c845de7.zip -------------------------------------------------------------------------------- /.yarn/cache/util-arity-npm-1.1.0-026931c155-ac30ab442d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/util-arity-npm-1.1.0-026931c155-ac30ab442d.zip -------------------------------------------------------------------------------- /.yarn/cache/uuid-npm-3.4.0-4fd8ef88ad-58de2feed6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/uuid-npm-3.4.0-4fd8ef88ad-58de2feed6.zip -------------------------------------------------------------------------------- /.yarn/cache/uuid-npm-9.0.0-46c41e3e43-8dd2c83c43.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/uuid-npm-9.0.0-46c41e3e43-8dd2c83c43.zip -------------------------------------------------------------------------------- /.yarn/cache/verror-npm-1.10.1-b32918fe63-690a8d6ad5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/verror-npm-1.10.1-b32918fe63-690a8d6ad5.zip -------------------------------------------------------------------------------- /.yarn/cache/which-npm-1.3.1-f0ebb8bdd8-f2e185c624.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/which-npm-1.3.1-f0ebb8bdd8-f2e185c624.zip -------------------------------------------------------------------------------- /.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip -------------------------------------------------------------------------------- /.yarn/cache/xmlbuilder-npm-15.1.1-becc60bf4e-14f7302402.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/xmlbuilder-npm-15.1.1-becc60bf4e-14f7302402.zip -------------------------------------------------------------------------------- /.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip -------------------------------------------------------------------------------- /.yarn/cache/yaml-npm-2.2.2-6e3cddb343-d90c235e09.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/yaml-npm-2.2.2-6e3cddb343-d90c235e09.zip -------------------------------------------------------------------------------- /.yarn/cache/yup-npm-0.32.11-dbaff8ca9c-43a16786b4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/cache/yup-npm-0.32.11-dbaff8ca9c-43a16786b4.zip -------------------------------------------------------------------------------- /.yarn/install-state.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/.yarn/install-state.gz -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### 6.0.0 (Mar-02-2023) 2 | * upgraded to be compatible with cucumber v8.9.1 3 | * upgraded all other dependencies to their latest versions 4 | 5 | 6 | ### 5.1.0 (Dec-15-2019) 7 | 8 | * Bootstrap theme filters [#198](https://github.com/gkushang/cucumber-html-reporter/pull/198) by [@srbarrios](https://github.com/srbarrios/) 9 | * Fix duplicate hierarchy names [#200](https://github.com/gkushang/cucumber-html-reporter/pull/200) by [@davestaab](https://github.com/davestaab/) 10 | * Bug fix for issue #163, generate report for cucumber_report_{random_num}.json [#210](https://github.com/gkushang/cucumber-html-reporter/pull/210) by [@hujunhaorobert](https://github.com/hujunhaorobert/) 11 | * Fix for "exit immediate after opening the browser #173" [#205](https://github.com/gkushang/cucumber-html-reporter/pull/205) by [@ErikGrigoriev](https://github.com/ErikGrigoriev/) 12 | 13 | ### 5.0.2 (Sept-03-2019) 14 | 15 | * Quick fix the Chalk dependency - move from devDependencies to dependencies 16 | 17 | ### 5.0.1 (Sept-02-2019) 18 | 19 | * Remove duplicate check condition PR#189 by [@ncounter](https://github.com/ncounter/) 20 | * Scenario timestamp and notes PR#190 by [@ncounter](https://github.com/ncounter/) 21 | * Fixed regression of 4.0.4, fixes ISSUE#160 PR#191 [@eiszfuchs](https://github.com/eiszfuchs/cucumber-html-reporter/tree/patch-notdefined) 22 | * Bump lodash from 4.17.11 to 4.17.13 PR#193 by dependabot 23 | * Bump diff from 3.4.0 to 3.5.0 PR#194 by dependabot 24 | * Removed Deprecated, Update dependencies 25 | 26 | ### 5.0.0 (Apr-16-2019) 27 | 28 | * Fix data tables not being read in - [PR#172](https://github.com/gkushang/cucumber-html-reporter/pull/172) 29 | * Update bootstrap to last 3.x stable version - [PR#170](https://github.com/gkushang/cucumber-html-reporter/pull/170) 30 | * Check if embeddings are base64 encoded (even `text/plain`) - [PR#164](https://github.com/gkushang/cucumber-html-reporter/pull/164) 31 | 32 | ### 4.0.3 (Feb-21-2019) 33 | 34 | * Enable non-inlined screenshots . Fix for [Issue#145](https://github.com/gkushang/cucumber-html-reporter/issues/145) - [PR#166](https://github.com/gkushang/cucumber-html-reporter/pull/166) 35 | 36 | ### 4.0.4 37 | 38 | ### 4.0.3 (Aug-23-2018) 39 | 40 | * Cannot generate report due an error with Trim() - [PR#125](https://github.com/gkushang/cucumber-html-reporter/pull/125) 41 | * if to switch statement change #155 - [PR#155](https://github.com/gkushang/cucumber-html-reporter/pull/155) 42 | 43 | 44 | ### 4.0.2 (Feb-26-2018) 45 | 46 | * Add support for configuring callback - [PR#135](https://github.com/gkushang/cucumber-html-reporter/pull/135) 47 | 48 | ### 4.0.1 (Feb-06-2018) 49 | 50 | * Support to attach Video files as `text/html` to the report - [PR#132](https://github.com/gkushang/cucumber-html-reporter/pull/132) 51 | 52 | ### 4.0.0 (Feb-02-2018) 53 | 54 | * Support for Cucumber 4. Duration is now in Nanoseconds. 55 | * Fix issue: [#130](https://github.com/gkushang/cucumber-html-reporter/issues/130) 56 | 57 | ### 3.0.4 (Sep-20-2017) 58 | 59 | * Fix for Cucumber V2, mime_type 60 | 61 | ### 3.0.3 (Sep-20-2017) 62 | 63 | * Update outdated dependencies [PR#115](https://github.com/gkushang/cucumber-html-reporter/pull/115) 64 | 65 | ### 3.0.2 (Sep-20-2017) 66 | 67 | * Add Backward compatibility for Cucumber V2 and V3. Add styling to Keywords GWT on HTML Report [PR#114](https://github.com/gkushang/cucumber-html-reporter/pull/114) 68 | 69 | 70 | ### 3.0.1 (Aug-23-2017) 71 | 72 | * Feature: update to simple theme report [PR#106](https://github.com/gkushang/cucumber-html-reporter/pull/106) 73 | * Fix issues: [#101](https://github.com/gkushang/cucumber-html-reporter/issues/101), [#98](https://github.com/gkushang/cucumber-html-reporter/issues/98) 74 | 75 | 76 | ### 3.0.0 (Aug-22-2017) 77 | 78 | * Support for Cucumber 3 [PR#104](https://github.com/gkushang/cucumber-html-reporter/pull/104) 79 | * Use `cucumber-html-reporter@2.0.3` for < Cucumber@3 80 | 81 | ### 2.0.3 (Jul-17-2017) 82 | 83 | * Escape HTML on step name & fix

and

order for block 'scenario-container' [PR#97](https://github.com/gkushang/cucumber-html-reporter/pull/97). Resolve Issue [#52](https://github.com/gkushang/cucumber-html-reporter/issues/52) 84 | 85 | 86 | ### 2.0.2 (Jul-10-2017) 87 | 88 | * Support scoped packages [PR#93](https://github.com/gkushang/cucumber-html-reporter/pull/93) 89 | 90 | * Fix issue[#85](https://github.com/gkushang/cucumber-html-reporter/issues/85) with Screenshot attachments with Selenium 3 & Cucumber 2 [PR#95](https://github.com/gkushang/cucumber-html-reporter/pull/95) 91 | 92 | 93 | ### 2.0.1 (Jul-07-2017) 94 | 95 | * Save screenshots into custom directory [PR#88](https://github.com/gkushang/cucumber-html-reporter/pull/88) 96 | 97 | * Added support for JSON attachments [PR#89](https://github.com/gkushang/cucumber-html-reporter/pull/89) 98 | 99 | Based on MIME type of the attachment. Payload is expected to be base64-encoded (this is based on the existing behaviour of the Cucumber Reports plugin for Jenkins). 100 | 101 | * Add tests for Save Screenshots & refactor [PR#91](https://github.com/gkushang/cucumber-html-reporter/pull/91) 102 | 103 | 104 | ### 2.0.0 (Jun-09-2017) 105 | 106 | ##### Support for Cucumber 2 107 | 108 | * Cucumber 2 [PR#81](https://github.com/gkushang/cucumber-html-reporter/pull/81). Resolves Issues [#73](https://github.com/gkushang/cucumber-html-reporter/issues/73),[#72](https://github.com/gkushang/cucumber-html-reporter/issues/72), [#61](https://github.com/gkushang/cucumber-html-reporter/issues/61), [#55](https://github.com/gkushang/cucumber-html-reporter/issues/55) 109 | * Duration is reported as Milliseconds 110 | * Attachments are now plain text without encoding 111 | * DRY the templates and HTML scripts 112 | * Run Travis-CI with Node@7 113 | * Disable the Strict mode to test pending/undefined steps scenarios 114 | 115 | * Use `cucumber-html-reporter@0.5.0` for < Cucumber@2 116 | 117 | ### 0.5.0 (Jun-01-2017) 118 | 119 | ##### Enhancement 120 | 121 | * Introducing new Template `Hierarchy` from the [Proposal](https://github.com/gkushang/cucumber-html-reporter/issues/75), [PR#76](https://github.com/gkushang/cucumber-html-reporter/pull/76) & [PR#77](https://github.com/gkushang/cucumber-html-reporter/pull/77) 122 | * The idea is to render features under respective folder hierarchy. Best case when your features are organized under feature-folders. 123 | * Enhance the Step Duration. Instead of 0s, show 1ms. 124 | * Backward compatible 125 | 126 | 127 | ### 0.4.2 (Apr-27-2017) 128 | 129 | ##### Fix 130 | 131 | * Fix to show '0s' if timestamp is in nanoseconds 132 | 133 | 134 | ### 0.4.1 (Apr-27-2017) 135 | 136 | ##### Enhancement 137 | 138 | * Add `brandTitle` to display on report. Checkout README for more details. 139 | 140 | ##### Fix 141 | 142 | * Step duration time in html report always shows 0s [Issue#61](https://github.com/gkushang/cucumber-html-reporter/issues/61) [PR#62](https://github.com/gkushang/cucumber-html-reporter/pull/62) 143 | * Should not count Before/After hooks if they are hidden [Issue#63](https://github.com/gkushang/cucumber-html-reporter/issues/63) [PR#64](https://github.com/gkushang/cucumber-html-reporter/pull/64) 144 | 145 | 146 | ### 0.4.0 (Mar-24-2017) 147 | 148 | * Supports Node versions >0.12 149 | 150 | ##### Revert the change 151 | 152 | * Use fs-extra [PR#59](https://github.com/gkushang/cucumber-html-reporter/pull/59) 153 | 154 | 155 | ### 0.3.9 (Mar-24-2017) 156 | 157 | * Supports Node versions <0.12 158 | 159 | ##### Fix 160 | 161 | * Remove support for fs-extra for backward compatibility to support Node versions <0.12 162 | 163 | 164 | ### 0.3.8 (Mar-23-2017) 165 | 166 | ##### Fix 167 | 168 | * Use fs-extra instead of node-fs [PR#50](https://github.com/gkushang/cucumber-html-reporter/pull/50) 169 | * Make chai a dev dependency [PR#51](https://github.com/gkushang/cucumber-html-reporter/pull/51) 170 | * Bootstrap template fixes [PR#56](https://github.com/gkushang/cucumber-html-reporter/pull/56) 171 | * Fix Travis CI [PR#57](https://github.com/gkushang/cucumber-html-reporter/pull/57) 172 | 173 | 174 | ### 0.3.7 (Dec-06-2016) 175 | 176 | ##### Fix 177 | 178 | * Sanitize Screenshot filename [Issue#45](https://github.com/gkushang/cucumber-html-reporter/issues/45) [PR#46](https://github.com/gkushang/cucumber-html-reporter/pull/46) 179 | 180 | 181 | ### 0.3.6 (Dec-06-2016) 182 | 183 | ##### Fix 184 | 185 | * Failure in Before hook should fail the Feature/Scenario, Add slice to rest of the scenario pie charts [PR#44](https://github.com/gkushang/cucumber-html-reporter/pull/44) 186 | 187 | 188 | ### 0.3.5 (Nov-29-2016) 189 | 190 | ##### Enhancements 191 | 192 | * Colors 193 | * Making labels & colors consistent on report [PR#42](https://github.com/gkushang/cucumber-html-reporter/pull/42) 194 | 195 | 196 | ### 0.3.4 (Nov-28-2016) 197 | 198 | ##### Enhancements 199 | 200 | * Step Duration 201 | * light gray the step duration to distinguish from the GWT Step description 202 | 203 | 204 | ### 0.3.3 (Nov-28-2016) 205 | 206 | ##### Enhancements 207 | 208 | * Ambiguous Steps 209 | * show ambiguous status on the pie-chart, features, scenarios and at steps level [PR#40](https://github.com/gkushang/cucumber-html-reporter/pull/40) 210 | 211 | 212 | ### 0.3.2 (Nov-21-2016) 213 | 214 | ##### Enhancements 215 | 216 | * Show Metadata 217 | * additional info about your test environment, browser, platform, app version, mode of execution, stage, and so on. [PR#39](https://github.com/gkushang/cucumber-html-reporter/pull/39) 218 | 219 | 220 | ### 0.3.1 (Nov-18-2016) 221 | 222 | ##### Enhancements 223 | 224 | * Adding latest Previews to the readme for all themes 225 | * Add more snapshots for the user's review 226 | 227 | ### 0.3.0 (Nov-18-2016) 228 | 229 | * Deprecate Store Screenshots 230 | * Deprecate the option to store screenshot to the disk by default. If you still want to Store a screenShot to the directory, you can pass an option `storeScreenShots` to the reporter. 231 | 232 | ##### Enhancements 233 | 234 | * Inline Screenshots 235 | * Add support for inline png screenshots, fix package.json lookup, Fix success log: [PR#32](https://github.com/gkushang/cucumber-html-reporter/pull/32) 236 | * For backward compatibility, adds an option to store screenshot to a directory: [PR#38](https://github.com/gkushang/cucumber-html-reporter/pull/38) 237 | 238 | 239 | ##### `storeScreenShots` 240 | Type: `Boolean` 241 | Default: `undefined` 242 | 243 | `true`: Stores all screenShots stores the screenShots to the default directory. It creates a directory 'screehshot' if does not exists. 244 | `false` or `undefined` : Does not store screenShots but attaches screenShots as a step-inline images to HTML report 245 | 246 | ##### Fixes 247 | 248 | * Fixes [ISSUE#29](https://github.com/gkushang/cucumber-html-reporter/issues/29) 249 | 250 | 251 | ### 0.2.17 (Nov-17-2016) 252 | 253 | ##### Enhancements 254 | 255 | * Tags on Report 256 | * Display Tags on Feature & Scenarios: [PR#35](https://github.com/gkushang/cucumber-html-reporter/pull/35) 257 | * Filter Repeated Tags 258 | * Filter Tags from Scenarios which is already displayed at Feature Level & add some styling to Tags [PR#37](https://github.com/gkushang/cucumber-html-reporter/pull/37) 259 | 260 | 261 | ### 0.2.16 (Oct-07-2016) 262 | 263 | ##### Enhancements 264 | 265 | * Scenario Description 266 | * Show Scenario Description on HTML report: [ISSUE#33](https://github.com/gkushang/cucumber-html-reporter/issues/33) 267 | 268 | 269 | ### 0.2.15 (Sep-28-2016) 270 | 271 | ##### Fix 272 | 273 | * Fix for older node versions: [ISSUE#30](https://github.com/gkushang/cucumber-html-reporter/issues/30) 274 | 275 | 276 | ### 0.2.14 (Sep-27-2016) 277 | 278 | ##### Enhancements 279 | 280 | * Option to add custom name to the project & adds footer: [PR#28](https://github.com/gkushang/cucumber-html-reporter/pull/28) 281 | 282 | 283 | ### 0.2.13 (Sep-27-2016) 284 | 285 | ##### Enhancements 286 | 287 | * Show time taken by each steps to complete the execution on report: [PR#17](https://github.com/gkushang/cucumber-html-reporter/pull/17) & [PR#27](https://github.com/gkushang/cucumber-html-reporter/pull/27) 288 | 289 | 290 | ### 0.2.12 (Sep-27-2016) 291 | 292 | ##### Fixes 293 | 294 | * Show hidden hooks if they fail: [PR#25](https://github.com/gkushang/cucumber-html-reporter/pull/25) 295 | 296 | 297 | ### 0.2.11 (Sep-26-2016) 298 | 299 | ##### Fixes 300 | 301 | * Fix typo on README: [PR#22](https://github.com/gkushang/cucumber-html-reporter/pull/22) 302 | 303 | * Fix Foundation template for local: [PR#23](https://github.com/gkushang/cucumber-html-reporter/pull/23) 304 | 305 | 306 | ### 0.2.10 (Sep-22-2016) 307 | 308 | ##### Enhancements 309 | 310 | * Conditionally hide hidden steps from the report: [PR#20](https://github.com/gkushang/cucumber-html-reporter/pull/20) 311 | 312 | * After & Before hooks are hidden on Cucumber JSON file. They will be visible on the report only if it has Info or Screenshot attached to it. 313 | 314 | 315 | ### 0.2.9 (Sep-08-2016) 316 | 317 | ##### Enhancements 318 | 319 | * Ignore the bad JSON files when consolidating from the JSON Directory: [PR#13](https://github.com/gkushang/cucumber-html-reporter/pull/13) 320 | 321 | * Set the option `ignoreBadJsonFile` to `true` as a boolean to ignore the Bad JSON files 322 | 323 | 324 | ##### BugFix 325 | 326 | * Fixed the issue when report was breaking with the Cucumber's Doc String: [Issue#14](https://github.com/gkushang/cucumber-html-reporter/issues/14) 327 | 328 | 329 | ### 0.2.8 (Aug-30-2016) 330 | 331 | ##### Enhancements 332 | 333 | * Generate consolidated report from multiple JSON files: [PR#12](https://github.com/gkushang/cucumber-html-reporter/pull/12) 334 | 335 | * Provide the path of `jsonDir` to generate consolidated report, 336 | 337 | 338 | ``` bash 339 | 340 | var reporter = require('cucumber-html-reporter'); 341 | ... 342 | ... 343 | 344 | var options = { 345 | theme: 'bootstrap', 346 | jsonDir: 'test/reports', 347 | output: 'test/report/cucumber_report.html', 348 | reportSuiteAsScenarios: true, 349 | launchReport: true 350 | }; 351 | 352 | reporter.generate(options); 353 | ``` 354 | 355 | ### 0.2.7 (Aug-16-2016) 356 | 357 | ##### Enhancements 358 | 359 | * Launch report automatically after test ends 360 | * Pass a flag `launchReport` to the options 361 | 362 | 363 | ``` bash 364 | 365 | var reporter = require('cucumber-html-reporter'); 366 | ... 367 | ... 368 | 369 | var options = { 370 | theme: 'bootstrap', 371 | jsonFile: 'test/report/cucumber_report.json', 372 | output: 'test/report/cucumber_report.html', 373 | reportSuiteAsScenarios: true, 374 | launchReport: true 375 | }; 376 | 377 | reporter.generate(options); 378 | ``` 379 | 380 | 381 | ### 0.2.6 (Jul-29-2016) 382 | 383 | ##### BugFix 384 | 385 | * Fixed the issue where Error messages were not printing on the report. 386 | 387 | ### 0.2.5 (Jul-28-2016) 388 | 389 | ##### Enhancements 390 | 391 | * trim the text to be printed on report 392 | 393 | ### 0.2.4 (Jul-28-2016) 394 | 395 | ##### BugFix 396 | 397 | * https://github.com/mavdi/grunt-cucumberjs/issues/86 398 | 399 | ### 0.2.3 (Jul-26-2016) 400 | 401 | ##### Enhancements 402 | 403 | * Published https://github.com/gkushang/cucumber-html-reporter/pull/10 Set charset as utf-8 404 | 405 | ### 0.2.2 (Jul-21-2016) 406 | 407 | ##### BugFix 408 | 409 | * Fixes https://github.com/gkushang/cucumber-html-reporter/issues/7 410 | 411 | ### 0.2.1 (Jul-12-2016) 412 | 413 | ##### Enhancements 414 | 415 | * Recursively create HTML report directory if does not exists 416 | * Remove outdated chai-fs depedency and use chai-should assertions 417 | * Lighter the background color or Scenario attachments 418 | 419 | 420 | ### 0.2.0 (Jul-10-2016) 421 | 422 | ##### Support for Cucumber@1.2.0 version 423 | 424 | * Screenshot attachment support for Cucumber release >= @1.2.0 (https://github.com/cucumber/cucumber-js/blob/master/CHANGELOG.md#bug-fixes-1) 425 | 426 | 427 | ### 0.1.6 (Jul-07-2016) 428 | 429 | ##### Enhancements 430 | 431 | * Format feature descriptions on report 432 | * Add overflow scroll bar for the bigger data-table 433 | * print error messaged in the pre 434 | 435 | 436 | ### 0.1.5 (Jul-05-2016) 437 | 438 | ##### Enhancements 439 | 440 | * Show feature description on report 441 | 442 | * Updated README 443 | 444 | ##### Bug fixes 445 | 446 | * Fix bug when cucumber error message has kind of html tags as a string, e.g. is not defined. 447 | 448 | 449 | ### 0.1.4 (Jun-28-2016) 450 | 451 | ##### Enhancements 452 | 453 | * Using `path` instead of separators to make platform agnostic 454 | 455 | * Updated tests `hooks` 456 | 457 | * README updated with the instructions on how to integrate reporter to the cucumber hooks 458 | 459 | 460 | ### 0.1.3 (Jun-27-2016) 461 | 462 | ##### Bug fixes 463 | 464 | * Fixed a bug in template path 465 | 466 | * README updated 467 | 468 | 469 | ### 0.1.1 (Jun-27-2016) 470 | 471 | ##### New Features 472 | 473 | * Tooltip for Scenarios or Features in the HEADER based on reportSuiteAsScenarios flag 474 | 475 | * Add an optional `callback` for the `generate(options, callback)` function 476 | 477 | * Report `pending` steps in scenarios for bootstrap & foundation themes 478 | 479 | * Refactored and added more tests & validations 480 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cucumber-html-reporter 2 | 3 | ***Generate Cucumber HTML reports with pie charts*** 4 | 5 | [![Build Status](https://travis-ci.org/gkushang/cucumber-html-reporter.svg?branch=develop)](https://travis-ci.org/gkushang/cucumber-html-reporter) [![npm](https://img.shields.io/npm/v/cucumber-html-reporter.svg)](https://www.npmjs.com/package/cucumber-html-reporter) [![Code Climate](https://codeclimate.com/github/gkushang/cucumber-html-reporter/badges/gpa.svg)](https://codeclimate.com/github/gkushang/cucumber-html-reporter) [![License](https://img.shields.io/npm/l/cucumber-html-reporter.svg)](LICENSE) [![contributors](https://img.shields.io/github/contributors/gkushang/cucumber-html-reporter.svg)](https://github.com/gkushang/cucumber-html-reporter/graphs/contributors) 6 | 7 | 8 | > Available HTML themes: `['bootstrap', 'hierarchy', 'foundation', 'simple']` 9 | 10 | ## Preview of HTML Reports 11 | 12 | Provide Cucumber JSON report file created from your framework and this module will create pretty HTML reports. Choose your best suitable HTML theme and dashboard on your CI with available HTML reporter plugins. 13 | 14 | 1. [Bootstrap Theme Reports with Pie Chart][4] 15 | 2. [Hierarchical Feature Structure Theme Reports With Pie Chart][3] 16 | 3. [Foundation Theme Reports][5] 17 | 4. [Simple Theme Reports][6] 18 | 19 | 20 | ## Snapshot of Bootstrap Report 21 | ![Alt text](/samples/html_report_snapshots/cucumber_report_bootstrap_snapshot.png "Snapshot - Bootstrap Report") 22 | 23 | ###### More snapshots are availble [here][9] 24 | 25 | ## Install 26 | 27 | ``` bash 28 | npm install cucumber-html-reporter --save-dev 29 | ``` 30 | 31 | ***Notes:*** 32 | 33 | * Latest version supports Cucumber 8 34 | * Install `cucumber-html-reporter@5.5.0` for cucumber version `< Cucumber@8` 35 | * Install `cucumber-html-reporter@2.0.3` for cucumber version `< Cucumber@3` 36 | * Install `cucumber-html-reporter@0.5.0` for cucumber version `< Cucumber@2` 37 | * Install `cucumber-html-reporter@0.4.0` for node version <0.12 38 | 39 | 40 | ## Usage 41 | 42 | Let's get you started: 43 | 44 | 1. Install the package through npm or yarn 45 | 2. Create an index.js and specify the options. Example of `bootstrap` theme: 46 | 47 | ```js 48 | 49 | var reporter = require('cucumber-html-reporter'); 50 | 51 | var options = { 52 | theme: 'bootstrap', 53 | jsonFile: 'test/report/cucumber_report.json', 54 | output: 'test/report/cucumber_report.html', 55 | reportSuiteAsScenarios: true, 56 | scenarioTimestamp: true, 57 | launchReport: true, 58 | metadata: { 59 | "App Version":"0.3.2", 60 | "Test Environment": "STAGING", 61 | "Browser": "Chrome 54.0.2840.98", 62 | "Platform": "Windows 10", 63 | "Parallel": "Scenarios", 64 | "Executed": "Remote" 65 | }, 66 | failedSummaryReport: true, 67 | }; 68 | 69 | reporter.generate(options); 70 | 71 | 72 | //more info on `metadata` is available in `options` section below. 73 | 74 | //to generate consodilated report from multi-cucumber JSON files, please use `jsonDir` option instead of `jsonFile`. More info is available in `options` section below. 75 | 76 | ``` 77 | > Please look at the [Options](https://github.com/gkushang/cucumber-html-reporter#options) section below for more options 78 | 79 | 3. Run the above code in a node.js script after Cucumber execution: 80 | ```bash 81 | node index.js 82 | ``` 83 | 84 | #### For CucumberJS 85 | 86 | This module converts Cucumber's JSON format to HTML reports. 87 | > The code has to be separated from CucumberJS execution (after it). 88 | 89 | In order to generate JSON formats, run the Cucumber to create the JSON format and pass the file name to the formatter as shown below, 90 | 91 | ```bash 92 | $ cucumberjs test/features/ -f json:test/report/cucumber_report.json 93 | ``` 94 | 95 | Multiple formatter are also supported, 96 | 97 | ```bash 98 | $ cucumberjs test/features/ -f summary -f json:test/report/cucumber_report.json 99 | ``` 100 | 101 | > Are you using cucumber with other frameworks or running [cucumber-parallel][7]? Pass relative path of JSON file to the `options` as shown [here][8] 102 | 103 | 104 | ## Options 105 | 106 | #### `theme` 107 | Available: `['bootstrap', 'hierarchy', 'foundation', 'simple']` 108 | Type: `String` 109 | 110 | Select the Theme for HTML report. 111 | 112 | N.B: Hierarchy theme is best suitable if your features are organized under features-folder hierarchy. Each folder will be rendered as a HTML Tab. It supports up to 3-level of nested folder hierarchy structure. 113 | 114 | 115 | #### `jsonFile` 116 | Type: `String` 117 | 118 | Provide path of the Cucumber JSON format file 119 | 120 | #### `jsonDir` 121 | Type: `String` 122 | 123 | If you have more than one cucumber JSON files, provide the path of JSON directory. This module will create consolidated report of all Cucumber JSON files. 124 | 125 | e.g. `jsonDir: 'test/reports'` //where _reports_ directory contains valid `*.json` files 126 | 127 | 128 | N.B.: `jsonFile` takes precedence over `jsonDir`. We recommend to use either `jsonFile` or `jsonDir` option. 129 | 130 | 131 | #### `output` 132 | Type: `String` 133 | 134 | Provide HTML output file path and name 135 | 136 | 137 | #### `reportSuiteAsScenarios` 138 | Type: `Boolean` 139 | Supported in the Bootstrap theme. 140 | 141 | `true`: Reports total number of passed/failed scenarios as HEADER. 142 | 143 | `false`: Reports total number of passed/failed features as HEADER. 144 | 145 | #### `launchReport` 146 | Type: `Boolean` 147 | 148 | Automatically launch HTML report at the end of test suite 149 | 150 | `true`: Launch HTML report in the default browser 151 | 152 | `false`: Do not launch HTML report at the end of test suite 153 | 154 | #### `ignoreBadJsonFile` 155 | Type: `Boolean` 156 | 157 | Report any bad json files found during merging json files from directory option. 158 | 159 | `true`: ignore any bad json files found and continue with remaining files to merge. 160 | 161 | `false`: Default option. Fail report generation if any bad files found during merge. 162 | 163 | #### `name` 164 | Type: `String` (optional) 165 | 166 | Custom project name. If not passed, module reads the name from projects package.json which is preferable. 167 | 168 | #### `brandTitle` 169 | Type: `String` (optional) 170 | 171 | Brand Title is the brand of your report, e.g. Smoke Tests Report, Acceptance Test Report etc as per your need. If not passed, it will be displayed as "Cucumberjs Report" 172 | 173 | #### `columnLayout` 174 | Available: `[1, 2]` 175 | Type: `Number` 176 | Default: 2 177 | 178 | Select the Column Layout. One column or Two columns 179 | 180 | 1 = One Column layout (col-xx-12) 181 | 2 = Two Columns Layout (col-xx-6) 182 | 183 | #### `storeScreenshots` 184 | Type: `Boolean` 185 | Default: `undefined` 186 | 187 | `true`: Stores the screenShots to the default directory. It creates a directory 'screenshot' if does not exists. 188 | 189 | `false` or `undefined` : Does not store screenShots but attaches screenShots as a step-inline images to HTML report 190 | 191 | #### `screenshotsDirectory` 192 | Type: `String` (optional) 193 | Default: `options.output/../screenshots` 194 | 195 | Applicable if `storeScreenshots=true`. Relative path for directory where screenshots should be saved. E.g. the below options should store the screenshots to the `/screenshots/` where as the report would be at `/report/cucumber_report.html` 196 | 197 | ```js 198 | { 199 | ... 200 | ... 201 | output: '/report/cucumber_report.html', 202 | screenshotsDirectory: 'screenshots/', 203 | storeScreenshots: true 204 | } 205 | ``` 206 | 207 | #### `noInlineScreenshots` 208 | Type: `Boolean` 209 | Default: `undefined` 210 | 211 | `true`: Applicable if `storeScreenshots=true`. Avoids inlining screenshots, uses relative path to screenshots instead (i.e. enables lazy loading of images). 212 | 213 | `false` or `undefined`: Keeps screenshots inlined. 214 | 215 | ### `scenarioTimestamp` 216 | Type: `Boolean` 217 | Default: `undefined` 218 | 219 | `true`: Applicable if `theme: 'bootstrap'`. Shows the starting timestamp of each scenario within the title. 220 | 221 | `false` or `undefined`: Does not show starting timestamp. 222 | 223 | #### `metadata` 224 | Type: `JSON` (optional) 225 | Default: `undefined` 226 | 227 | Print more data to your report, such as _browser info, platform, app info, environments_ etc. Data can be passed as JSON `key-value` pair. Reporter will parse the JSON and will show the _Key-Value_ under `Metadata` section on HTML report. Checkout the below preview HTML Report with Metadata. 228 | 229 | Pass the _Key-Value_ pair as per your need, as shown in below example, 230 | 231 | ```js 232 | 233 | metadata: { 234 | "App Version":"0.3.2", 235 | "Test Environment": "STAGING", 236 | "Browser": "Chrome 54.0.2840.98", 237 | "Platform": "Windows 10", 238 | "Parallel": "Scenarios", 239 | "Executed": "Remote" 240 | } 241 | 242 | ``` 243 | 244 | * [HTML Report Preview with Metadata][4] 245 | * [Report Snapshot with Metadata][11] 246 | 247 | #### `failedSummaryReport` 248 | Type: `Boolean` 249 | 250 | A summary report of all failed scenarios will be listed in a grid, which its scenario title, tags, failed step and exception. 251 | 252 | `true`: Insert failed summary report. 253 | 254 | `false`: Failed summary report will not be inserted. 255 | 256 | ## Tips 257 | 258 | #### Attach Screenshots to HTML report 259 | 260 | Capture and Attach screenshots to the Cucumber Scenario and HTML report will render the screenshot image 261 | 262 | **for Cucumber V8** 263 | ```javascript 264 | 265 | let world = this; 266 | 267 | return driver.takeScreenshot().then((screenShot) => { 268 | // screenShot is a base-64 encoded PNG 269 | world.attach(screenShot, 'image/png'); 270 | }); 271 | 272 | ``` 273 | 274 | **for Cucumber V2 and V3** 275 | ```javascript 276 | 277 | var world = this; 278 | 279 | driver.takeScreenshot().then(function (buffer) { 280 | return world.attach(buffer, 'image/png'); 281 | }; 282 | 283 | ``` 284 | 285 | **for Cucumber V1** 286 | ```javascript 287 | 288 | driver.takeScreenshot().then(function (buffer) { 289 | return scenario.attach(new Buffer(buffer, 'base64'), 'image/png'); 290 | }; 291 | 292 | ``` 293 | 294 | #### Attach Plain Text to HTML report 295 | 296 | Attach plain-texts/data to HTML report to help debug/review the results 297 | 298 | ```javascript 299 | 300 | scenario.attach('test data goes here'); 301 | 302 | ``` 303 | 304 | #### Attach pretty JSON to HTML report 305 | 306 | Attach JSON to HTML report 307 | 308 | ```javascript 309 | 310 | scenario.attach(JSON.stringify(myJsonObject, undefined, 4)); 311 | 312 | ``` 313 | 314 | ## Changelog 315 | 316 | [changelog][10] 317 | 318 | 319 | [1]: https://www.npmjs.com/package/grunt-cucumberjs "grunt-cucummberjs" 320 | [2]: https://github.com/cucumber/cucumber-js "CucumberJs" 321 | [3]: http://htmlpreview.github.io/?https://github.com/gkushang/cucumber-html-reporter/blob/develop/samples/html_reports/cucumber_report_hierarchy.html "Hierarchy Theme Reports" 322 | [4]: http://htmlpreview.github.io/?https://github.com/gkushang/cucumber-html-reporter/blob/develop/samples/html_reports/cucumber_report_bootstrap.html "Bootstrap Theme Reports" 323 | [5]: http://htmlpreview.github.io/?https://github.com/gkushang/cucumber-html-reporter/blob/develop/samples/html_reports/cucumber_report_foundation.html "Foundation Theme Reports" 324 | [6]: http://htmlpreview.github.io/?https://github.com/gkushang/cucumber-html-reporter/blob/develop/samples/html_reports/cucumber_report_simple.html "Simple Theme Reports" 325 | [7]: https://www.npmjs.com/package/cucumber-parallel "cucumber-parallel" 326 | [8]: https://github.com/gkushang/cucumber-html-reporter/blob/develop/test/features/step_definitions/hooks.js#L13-L44 327 | [9]: https://github.com/gkushang/cucumber-html-reporter/blob/develop/samples/snapshots.md 328 | [10]: https://github.com/gkushang/cucumber-html-reporter/blob/develop/CHANGELOG.md 329 | [11]: https://github.com/gkushang/cucumber-html-reporter/blob/develop/samples/snapshots.md#with-metadata 330 | [twitter]: https://twitter.com/g_kushang 331 | 332 | 333 | 334 | -------------------------------------------------------------------------------- /coding-Standards/eslint/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "env": { 4 | "browser": true, 5 | "commonjs": true, 6 | "es6": true, 7 | "node": true 8 | }, 9 | "parserOptions": { 10 | "ecmaVersion":2017, 11 | "ecmaFeatures": { 12 | "jsx": true 13 | }, 14 | "sourceType": "module" 15 | }, 16 | "plugins": ["import", "prettier"], 17 | "extends": [ 18 | "eslint:recommended", 19 | "plugin:import/errors", 20 | "plugin:import/warnings" 21 | ], 22 | "rules": { 23 | "prettier/prettier": [ 24 | "warn", 25 | { 26 | "singleQuote": true, 27 | "printWidth": 120 28 | } 29 | ], 30 | "no-const-assign": "warn", 31 | "no-this-before-super": "warn", 32 | "no-undef": "warn", 33 | "no-unreachable": "warn", 34 | "no-unused-vars": "warn", 35 | "constructor-super": "warn", 36 | "valid-typeof": "warn", 37 | "linebreak-style": [ "error", "unix" ], 38 | "no-console": [ 0, "error" ], 39 | "indent": [ "error", 2 ], 40 | "semi": [ "error", "always" ], 41 | "quotes":["error", "single"] 42 | }, 43 | "globals": { 44 | "noImplicitAny": "readonly", 45 | "noImplicitThis": "readonly", 46 | "strictNullChecks": "readonly", 47 | "strictFunctionTypes": "readonly", 48 | "noEmit": "readonly", 49 | "forceConsistentCasingInFileNames": "readonly" 50 | } 51 | } -------------------------------------------------------------------------------- /cucumber-html-reporter.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | interface Options { 2 | theme: 'bootstrap' | 'hierarchy' | 'foundation' | 'simple', 3 | jsonFile?: string, 4 | jsonDir?: string, 5 | output: string, 6 | screenshotsDirectory?: string, 7 | reportSuiteAsScenarios: boolean, 8 | ignoreBadJsonFile?: boolean, 9 | launchReport: boolean, 10 | columnLayout?: number, 11 | storeScreenshots?: boolean, 12 | noInlineScreenshots?: boolean, 13 | name?: string, 14 | brandTitle?: string, 15 | scenarioTimestamp?: boolean, 16 | metadata?: { 17 | [key: string]: string 18 | }, 19 | } 20 | 21 | export function generate(options: Options, callback?: () => void): void 22 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /*-----------------------------------------------------------------------------------------*\ 2 | | The MIT License (MIT) | 3 | | | 4 | | Copyright (c) 2015 | 5 | | | 6 | | Permission is hereby granted, free of charge, to any person obtaining a copy | 7 | | of this software and associated documentation files (the "Software"), to deal | 8 | | in the Software without restriction, including without limitation the rights | 9 | | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 10 | | copies of the Software, and to permit persons to whom the Software is | 11 | | furnished to do so, subject to the following conditions: | 12 | | | 13 | | The above copyright notice and this permission notice shall be included in | 14 | | all copies or substantial portions of the Software. | 15 | | | 16 | | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 17 | | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 18 | | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 19 | | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 20 | | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 21 | | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 22 | | THE SOFTWARE. | 23 | \*---------------------------------------------------------------------------------------- */ 24 | 25 | 'use strict'; 26 | 27 | const reporter = require('./lib/reporter'); 28 | 29 | function generateReport(options, callback) { 30 | return reporter.generate(options, callback); 31 | } 32 | 33 | module.exports = { 34 | generate: generateReport, 35 | }; 36 | -------------------------------------------------------------------------------- /lib/hierarchyReporter.js: -------------------------------------------------------------------------------- 1 | // const _ = require('lodash'); 2 | const path = require('path'); 3 | 4 | /** 5 | * hierarchyReporter.js 6 | * 7 | * Support for hierarchy report template 8 | * These functions will always be called, 9 | * but they will be harmlessly ignored by other report types 10 | */ 11 | 12 | module.exports = { 13 | /** 14 | * Review each feature in the suite, and find the common baseDir that is shared by all of them. 15 | * We will later use this as the basis from which to construct the feature hierarchy-- 16 | * the basedir prefix needs to be removed since it is not important. 17 | */ 18 | getBaseDir: function (suite) { 19 | let baseDir = []; 20 | suite.features.forEach(function (feature) { 21 | baseDir = feature.uri.split(path.sep); 22 | // let uriParts = feature.uri.split(path.sep); 23 | // if (!baseDir?.length) { 24 | // baseDir = uriParts; 25 | // // console.log('this is the result 1 ===> ', suite); 26 | // } else { 27 | // for (let i = uriParts.length; i > 0; i--) { 28 | // // for (let i = 0, l = uriParts.length; i < l; i++) { 29 | // if ((baseDir.length > i) && (baseDir[i] !== uriParts[i])) { 30 | // baseDir.length = i; 31 | // // console.log('this is the result ===> ', baseDir.length = i) 32 | // } 33 | // } 34 | // } 35 | }); 36 | return baseDir.join(path.sep); 37 | }, 38 | 39 | /** 40 | * Given a feature, remove the basedir prefix and the feature name suffix from its URI 41 | * and return the remaining folders (if any) in an array. If the feature is at the top-level, 42 | * it will return [] 43 | * For example: 44 | * @param featureUri: '/home/cstrong/myproj/test/features/authentication/login/guestLogin.feature' 45 | * @param baseDir: '/home/cstrong/myproj/test/features' 46 | * @returns [ 'authentication', 'login' ] 47 | */ 48 | getFeatureHierarchy: function (featureUri, baseDir) { 49 | let noBaseDir = featureUri.slice(baseDir.length + 1); 50 | let noBadChars = noBaseDir.split('=').join('_'); 51 | let featureDirs = noBadChars.split(path.sep); 52 | 53 | // remove the feature name itself 54 | featureDirs.length = featureDirs.length - 1; 55 | 56 | return featureDirs; 57 | }, 58 | 59 | /** 60 | * Given the top-level suite and the hierarchy to build, recursively create the hierarchy 61 | * of sub-suites (if needed) and return the lowest level sub-suite. 62 | * 63 | * @param suite 64 | * @param hierarchy e.g. [ 'authentication', 'login' ] 65 | * @returns suite object or null if there is no hierarchy 66 | */ 67 | findOrCreateSubSuite: function (suite, hierarchy) { 68 | /** 69 | Create a new sub-suite correspond to a folder name. The suite will contain the features that are defined 70 | within that folder, and/or sub-suites corresponding to any sub-folders that themselves may contain features. 71 | A sub-suite has a reference to its parent suite, so that we can easily aggregate statistics of passed and failed 72 | tests up the hierarchy. 73 | */ 74 | function newSubSuite(name, parent) { 75 | return { 76 | name: { 77 | plain: name, 78 | sanitized: name, 79 | }, 80 | passed: 0, 81 | failed: 0, 82 | ambiguous: 0, 83 | skipped: 0, 84 | parent: parent, 85 | features: [], 86 | suites: [], 87 | }; 88 | } 89 | 90 | if (hierarchy.length < 1) { 91 | return null; 92 | } 93 | let subSuiteName = hierarchy[0]; 94 | if (!suite.suites) { 95 | suite.suites = []; 96 | } 97 | let subSuite = suite.suites.find(function (s) { 98 | return s.name.plain === subSuiteName; 99 | }); 100 | if (!subSuite) { 101 | let subSuite = newSubSuite(subSuiteName, suite); 102 | suite.suites.push(subSuite); 103 | } 104 | if (hierarchy.length === 1) { 105 | return subSuite; 106 | } else { 107 | return this.findOrCreateSubSuite(subSuite, hierarchy.slice(1)); 108 | } 109 | }, 110 | 111 | /** 112 | * Increment stat such as failed, ambiguous or passed for the current suite 113 | * and follow the parent attribute (if any) recursively up the tree, incrementing all. 114 | * That way the top level suite accumulates all results from child and grandchild suites 115 | * 116 | * @param subSuite 117 | * @param attrName ('passed', 'failed', 'ambiguous', or 'skipped') 118 | */ 119 | recursivelyIncrementStat: function (subSuite, attrName) { 120 | subSuite[attrName] = subSuite[attrName] + 1; 121 | if (subSuite.parent) { 122 | this.recursivelyIncrementStat(subSuite.parent, attrName); 123 | } 124 | }, 125 | }; 126 | -------------------------------------------------------------------------------- /lib/jsonDir.js: -------------------------------------------------------------------------------- 1 | // 'use strict'; 2 | const jsonFile = require('jsonfile'); 3 | const find = require('find'); 4 | const path = require('path'); 5 | 6 | const collectJSONS = function (options) { 7 | const jsonOutput = []; 8 | const featureCollection = new Map(); 9 | let files; 10 | 11 | try { 12 | files = find.fileSync(/\.json$/, options.jsonDir); 13 | } catch (e) { 14 | throw new Error('\'options.jsonDir\' does not exist. ' + e); 15 | } 16 | 17 | if (files.length === 0) throw new Error('No JSON files found under \'options.jsonDir\': ' + options.jsonDir); 18 | 19 | function mergeJSONS(file) { 20 | let cucumberJson = jsonFile.readFileSync(file); 21 | 22 | function trackScenarioRetries(scenarios) { 23 | // HACK: Very brittle. Will track if cucumber json file name is not in format command.1.1.log.json 24 | let basename = path.basename(file, ".log.json"); 25 | let retried = basename.split(".")[2] ?? "0"; 26 | retried = parseInt(retried); 27 | scenarios.forEach( (scenario) => { 28 | scenario["retried"] = retried; 29 | }); 30 | } 31 | 32 | function collect(json) { 33 | trackScenarioRetries(json["elements"] ?? []); 34 | let featureKey = json["uri"] ?? "Feature: URI Not Present"; 35 | if (featureCollection.has(featureKey)) { 36 | const featureItem = featureCollection.get(featureKey); 37 | const elements = featureItem["elements"] ?? []; 38 | elements.push(...(json["elements"] ?? [])); 39 | featureItem["elements"] = elements; 40 | featureCollection.set(featureKey, featureItem); 41 | } else { 42 | featureCollection.set(featureKey, json); 43 | } 44 | } 45 | 46 | if ((!cucumberJson || typeof cucumberJson[0] === 'undefined') && !options.ignoreBadJsonFile) { 47 | throw new Error('Invalid Cucumber JSON file found under ' + options.jsonDir + ': ' + file); 48 | } else if ((!cucumberJson || typeof cucumberJson[0] === 'undefined') && options.ignoreBadJsonFile) { 49 | console.log('Invalid Cucumber JSON file found under ' + options.jsonDir + ': ' + file); 50 | } 51 | else { 52 | cucumberJson.map(collect) 53 | } 54 | } 55 | 56 | function addTimestamp(featureItem) { 57 | if (featureItem["elements"] && featureItem["elements"][0] && 58 | featureItem["elements"][0]["steps"] && featureItem["elements"][0]["steps"][0] && 59 | featureItem["elements"][0]["steps"][0]["output"] && featureItem["elements"][0]["steps"][0]["output"][0]) { 60 | 61 | if (typeof featureItem["elements"][0]["steps"][0]["output"][0] !== 'undefined') { 62 | const timestamp = featureItem["elements"][0]["steps"][0]["output"][0]; 63 | featureItem["timestamp"] = Date.parse(timestamp.match(/[0-9]{4}-.+:[0-9]{2}/g)); 64 | } 65 | } 66 | return featureItem; 67 | } 68 | 69 | files.map(mergeJSONS); 70 | 71 | featureCollection.forEach( (feature, _) => { 72 | jsonOutput.push(feature); 73 | }); 74 | 75 | jsonOutput.map(addTimestamp); 76 | if (!jsonOutput.filter(f => !f.timestamp).length) { 77 | jsonOutput.sort(function (feature, nextFeature) { 78 | return feature.timestamp - nextFeature.timestamp; 79 | }); 80 | } 81 | 82 | jsonFile.writeFileSync(options.output + '.json', jsonOutput, {spaces: 2}); 83 | 84 | return jsonOutput; 85 | }; 86 | 87 | module.exports = { 88 | collectJSONS: collectJSONS 89 | }; 90 | -------------------------------------------------------------------------------- /lib/reporter.js: -------------------------------------------------------------------------------- 1 | // 'use strict'; 2 | const chalk = require('chalk'); 3 | const jsonFile = require('jsonfile'); 4 | const _ = require('lodash'); 5 | const fs = require('fs-extra'); 6 | const path = require('path'); 7 | const jsonDir = require('./jsonDir'); 8 | const emoji = require('node-emoji'); 9 | const searchFileUp = require('./searchFileUp'); 10 | const hierarchyReporter = require('./hierarchyReporter'); 11 | const guid = require('uuid').v4; 12 | const open = require('open'); 13 | const isBase64 = data => { 14 | try { 15 | const buffer = Buffer.from(data, "base64") 16 | return buffer.toString("base64") === data 17 | } catch (e) { 18 | console.log("Failed to read base64") 19 | return false 20 | } 21 | } 22 | let stageRerunCount = getStageReRunCount(); 23 | 24 | const generateReport = function (options) { 25 | let featureOutput = jsonFile.readFileSync(options.jsonFile); 26 | let packageJsonPath = searchFileUp('package.json'); 27 | let packageJson = {}; 28 | try { 29 | packageJson = packageJsonPath && jsonFile.readFileSync(packageJsonPath, 'utf8'); 30 | } catch (err) { 31 | console.warn('No package.json file found in: ' + packageJsonPath + ', using default name and version.'); 32 | packageJson.name = 'default'; 33 | packageJson.version = '0.0.0'; 34 | } 35 | 36 | const sanitize = function (name, find) { 37 | const unsafeCharacters = find || /[/|:"*?<>]/g; 38 | if (name !== undefined) { 39 | name = name.trim().replace(unsafeCharacters, '_'); 40 | } 41 | return name; 42 | }; 43 | 44 | featureOutput.summary = { 45 | isFailed: false, 46 | passed: 0, 47 | failed: 0, 48 | ambiguous: 0, 49 | skipped: 0, 50 | notdefined: 0, 51 | pending: 0, 52 | }; 53 | 54 | const result = { 55 | status: { 56 | passed: 'passed', 57 | failed: 'failed', 58 | skipped: 'skipped', 59 | pending: 'pending', 60 | undefined: 'undefined', 61 | ambiguous: 'ambiguous', 62 | }, 63 | }; 64 | 65 | let suite = { 66 | name: { 67 | plain: options.name || (packageJson && packageJson.name), 68 | sanitized: sanitize(options.name || (packageJson && packageJson.name), /[^a-z|0-9]/g), 69 | }, 70 | brandTitle: options.brandTitle, 71 | version: packageJson && packageJson.version, 72 | time: new Date(), 73 | features: featureOutput, 74 | passed: 0, 75 | failed: 0, 76 | ambiguous: 0, 77 | rerun: 0, 78 | totalTime: 0, 79 | suites: [], 80 | scenarios: { 81 | passed: 0, 82 | failed: 0, 83 | skipped: 0, 84 | pending: 0, 85 | notdefined: 0, 86 | ambiguous: 0, 87 | rerun: 0, 88 | getTotal: function () { 89 | return this.passed + this.failed + this.skipped + this.pending + this.notdefined + this.ambiguous; 90 | }, 91 | }, 92 | failedSummaryReport: options.failedSummaryReport, 93 | }; 94 | 95 | const createReportDirectoryIfNotExists = function () { 96 | if (!fs.existsSync(options.output)) { 97 | fs.mkdirsSync(path.dirname(options.output)); 98 | } 99 | }; 100 | 101 | createReportDirectoryIfNotExists(); 102 | 103 | function getColumnLayoutWidth() { 104 | const FULL_WIDTH = 12; 105 | const HALF_WIDTH = 6; 106 | 107 | if (options.columnLayout === 1) { 108 | return FULL_WIDTH; 109 | } else { 110 | return HALF_WIDTH; 111 | } 112 | } 113 | /** 114 | * Make human-readable duration for scenario steps 115 | * Sample Input: "2005366787" 116 | * Sample Output: "2s 5ms" 117 | */ 118 | const calculateDuration = function (durationInNanoSeconds) { 119 | // convert it to MILLI_SECONDS 120 | const durationInMillis = _.floor(durationInNanoSeconds / 1000000); 121 | 122 | let oneMilliSecond = 1000; 123 | let oneMinute = 60 * oneMilliSecond; 124 | let formattedDuration = '0s'; 125 | 126 | function format(min, sec, ms) { 127 | const MINUTES = 'm '; 128 | const SECONDS = 's '; 129 | const MILLI_SECONDS = 'ms'; 130 | let formattedTimeStamp = ''; 131 | 132 | min > 0 ? (formattedTimeStamp += min + MINUTES) : ''; 133 | sec > 0 ? (formattedTimeStamp += sec + SECONDS) : ''; 134 | ms > 0 ? (formattedTimeStamp += ms + MILLI_SECONDS) : ''; 135 | 136 | return formattedTimeStamp.trim().length === 0 ? '< 1ms' : formattedTimeStamp; 137 | } 138 | 139 | if (!isNaN(durationInMillis)) { 140 | const min = _.floor(durationInMillis / oneMinute); 141 | const sec = _.floor((durationInMillis % oneMinute) / oneMilliSecond); 142 | const ms = durationInMillis % oneMilliSecond; 143 | 144 | formattedDuration = format(min, sec, ms); 145 | } 146 | 147 | return formattedDuration; 148 | }; 149 | 150 | const preventOverlappingTheScenarioTitle = function (element) { 151 | let counter = 0; 152 | 153 | if (element.passed) counter++; 154 | if (element.notdefined) counter++; 155 | if (element.pending) counter++; 156 | if (element.skipped) counter++; 157 | if (element.failed) counter++; 158 | if (element.ambiguous) counter++; 159 | 160 | counter = counter * 20 + 10; 161 | if (element.retried) { 162 | // 90px fixed width 163 | counter = Math.max(counter, 90); 164 | } 165 | 166 | return counter + 'px'; 167 | }; 168 | 169 | const readFileForRespectiveTemplates = function (filename) { 170 | if (filename === 'script.js' && options.theme === 'foundation') { 171 | return readFile('../_common/foundation/' + filename); 172 | } 173 | return options.theme === 'bootstrap' || options.theme === 'hierarchy' 174 | ? readFile('../_common/bootstrap.hierarchy/' + filename) 175 | : readFile(filename); 176 | }; 177 | 178 | /** 179 | * NOTE: This method is used by hierarchy report template, harmless for others. 180 | * Creates the HTML fragments for any features assigned to this suite, 181 | * and stores them in `featureMarkup` attribute of the suite so we can render them in index.tmpl 182 | * 183 | * @param suite 184 | */ 185 | 186 | const getFeaturesTemplate = function (suite) { 187 | return _.template(readFileForRespectiveTemplates('features.html'))({ 188 | suite: suite, 189 | _: _, 190 | calculateDuration: calculateDuration, 191 | columnLayoutWidth: getColumnLayoutWidth(), 192 | decideScenarioTitlePadding: preventOverlappingTheScenarioTitle, 193 | guid: guid, 194 | }); 195 | }; 196 | 197 | const setupSubSuiteTemplates = function (suite) { 198 | suite.featureMarkup = '
No features
'; 199 | if (suite.features && suite.features.length) { 200 | suite.featureMarkup = getFeaturesTemplate(suite); 201 | } 202 | for (let i = 0; i < suite.suites.length; i++) { 203 | const subSuite = suite.suites[i]; 204 | setupSubSuiteTemplates(subSuite); 205 | } 206 | }; 207 | 208 | const parseScenarioHooks = function (data) { 209 | return data.map((step) => { 210 | const match = step.match && step.match.location ? step.match : { location: 'can not be determined' }; 211 | 212 | if (step.embeddings === undefined) { 213 | return {}; 214 | } 215 | 216 | return { 217 | arguments: step.arguments || [], 218 | result: step.result, 219 | match, 220 | embeddings: step.embeddings || [], 221 | }; 222 | }); 223 | }; 224 | 225 | const setStats = function (suite) { 226 | const featureOutput = suite.features; 227 | const topLevelFeatures = []; 228 | const featuresSummary = suite.features.summary; 229 | let screenshotsDirectory; 230 | suite.reportAs = 'Features'; 231 | if (options.screenshotsDirectory) { 232 | screenshotsDirectory = options.screenshotsDirectory; 233 | } else { 234 | screenshotsDirectory = options.output ? path.join(options.output, '..', 'screenshots') : 'screenshots'; 235 | } 236 | 237 | const basedir = hierarchyReporter.getBaseDir(suite); 238 | 239 | featureOutput.forEach(function (feature) { 240 | feature.hierarchy = hierarchyReporter.getFeatureHierarchy(feature.uri, basedir); 241 | feature.scenarios = {}; 242 | feature.scenarios.passed = 0; 243 | feature.scenarios.failed = 0; 244 | feature.scenarios.notdefined = 0; 245 | feature.scenarios.skipped = 0; 246 | feature.scenarios.pending = 0; 247 | feature.scenarios.ambiguous = 0; 248 | feature.scenarios.rerun = 0; 249 | feature.scenarios.count = 0; 250 | feature.time = 0; 251 | featuresSummary.isFailed = false; 252 | featuresSummary.isAmbiguous = false; 253 | 254 | if (!feature.elements) { 255 | return; 256 | } 257 | 258 | if (feature.elements) { 259 | feature.elements.map((scenario) => { 260 | const { before, after } = scenario; 261 | 262 | if (before) { 263 | scenario.steps = parseScenarioHooks(before).concat(scenario.steps); 264 | } 265 | if (after) { 266 | scenario.steps = scenario.steps.concat(parseScenarioHooks(after)); 267 | } 268 | }); 269 | } 270 | 271 | feature.elements.forEach(function (element) { 272 | element.passed = 0; 273 | element.failed = 0; 274 | element.notdefined = 0; 275 | element.skipped = 0; 276 | element.pending = 0; 277 | element.ambiguous = 0; 278 | element.time = 0; 279 | element.timestamp = ''; 280 | element.notes = ''; 281 | 282 | if (element.type === 'background') { 283 | return; 284 | } 285 | 286 | element.steps.forEach(function (step, count) { 287 | if (step.embeddings !== undefined) { 288 | step.embeddings.forEach(function (embedding) { 289 | let embeddingType = {}; 290 | 291 | if (embedding.mime_type) { 292 | embeddingType = embedding.mime_type; 293 | } else if (embedding.media) { 294 | embeddingType = embedding.media.type; 295 | } 296 | if (['text/plain', 'text/html', 'application/json'].includes(embeddingType)) { 297 | let decoded; 298 | 299 | if (isBase64(embedding.data)) { 300 | decoded = Buffer.from(embedding.data, 'base64').toString('utf8'); 301 | } else { 302 | decoded = embedding.data; 303 | } 304 | 305 | if (!step.text) { 306 | step.text = decoded; 307 | } else { 308 | step.text = step.text.concat(`
${decoded}`); 309 | } 310 | } else if (embeddingType === 'image/png') { 311 | step.image = 'data:image/png;base64,' + embedding.data; 312 | 313 | if (options.storeScreenshots && options.storeScreenshots === true) { 314 | let name = sanitize(step.name || step.keyword, /[^a-zA-Z0-9-]+/g); // Only allow URL-friendly file names 315 | if (!fs.existsSync(screenshotsDirectory)) { 316 | fs.mkdirSync(screenshotsDirectory); 317 | } 318 | name = name + '_' + Math.round(Math.random() * 10000) + '.png'; //randomize the file name 319 | const filename = path.join(screenshotsDirectory, name); 320 | fs.writeFileSync(filename, embedding.data, 'base64'); 321 | if (options.noInlineScreenshots) 322 | step.image = path.relative(path.join(options.output, '..'), filename); 323 | } 324 | } else if (embeddingType === 'image/gif') { 325 | step.image = 'data:image/gif;base64,' + embedding.data; 326 | 327 | if (options.storeScreenshots && options.storeScreenshots === true) { 328 | let name = sanitize(step.name || step.keyword, /[^a-zA-Z0-9-]+/g); // Only allow URL-friendly file names 329 | if (!fs.existsSync(screenshotsDirectory)) { 330 | fs.mkdirSync(screenshotsDirectory); 331 | } 332 | name = name + '_' + Math.round(Math.random() * 10000) + '.gif'; //randomize the file name 333 | const filename = path.join(screenshotsDirectory, name); 334 | fs.writeFileSync(filename, embedding.data, 'base64'); 335 | if (options.noInlineScreenshots) 336 | step.image = path.relative(path.join(options.output, '..'), filename); 337 | } 338 | } else { 339 | const file = 'data:application/octet-stream;base64,' + embedding.data; 340 | const fileType = embedding.mime_type.split('/')[1]; 341 | step.text = step.text || ''; 342 | step.text = step.text.concat( 343 | 'download file' 344 | ); 345 | } 346 | }); 347 | } 348 | 349 | if (!step.result || (step.hidden && !step.text && !step.image)) { 350 | return 0; 351 | } 352 | 353 | if (step.result.duration) element.time += step.result.duration; 354 | 355 | if (step.output) { 356 | if (options.scenarioTimestamp && count === 0) { 357 | element.timestamp = step.output[0]; 358 | } 359 | step.output.forEach(function (o) { 360 | element.notes += o + '
'; 361 | }); 362 | } 363 | 364 | switch (step.result.status) { 365 | case result.status.passed: 366 | return element.passed++; 367 | case result.status.failed: 368 | return element.failed++; 369 | case result.status.undefined: 370 | return element.notdefined++; 371 | case result.status.pending: 372 | return element.pending++; 373 | case result.status.ambiguous: 374 | return element.ambiguous++; 375 | default: 376 | break; 377 | } 378 | 379 | element.skipped++; 380 | }); 381 | 382 | if (element.time > 0) { 383 | feature.time += element.time; 384 | } 385 | 386 | feature.scenarios.count++; 387 | 388 | if (element.failed > 0) { 389 | feature.scenarios.failed++; 390 | featuresSummary.isFailed = true; 391 | return suite.scenarios.failed++; 392 | } 393 | 394 | if (element.ambiguous > 0) { 395 | feature.scenarios.ambiguous++; 396 | featuresSummary.isAmbiguous = true; 397 | return suite.scenarios.ambiguous++; 398 | } 399 | 400 | if (element.notdefined > 0) { 401 | feature.scenarios.notdefined++; 402 | return suite.scenarios.notdefined++; 403 | } 404 | 405 | if (element.pending > 0) { 406 | feature.scenarios.pending++; 407 | return suite.scenarios.pending++; 408 | } 409 | 410 | if (element.skipped > 0) { 411 | feature.scenarios.skipped++; 412 | return suite.scenarios.skipped++; 413 | } 414 | 415 | if (element.passed > 0) { 416 | feature.scenarios.passed++; 417 | return suite.scenarios.passed++; 418 | } 419 | }); 420 | if (stageRerunCount > 0) { 421 | feature.scenarios.rerun = stageRerunCount; 422 | suite.scenarios.rerun = stageRerunCount; 423 | } 424 | 425 | let subSuite = undefined; 426 | if (options.theme === 'hierarchy') { 427 | subSuite = hierarchyReporter.findOrCreateSubSuite(suite, feature.hierarchy); 428 | } 429 | if (subSuite) { 430 | subSuite.features.push(feature); 431 | } else { 432 | topLevelFeatures.push(feature); 433 | } 434 | 435 | if (featuresSummary.isFailed) { 436 | featuresSummary.failed++; 437 | subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'failed') : suite.failed++; 438 | } else if (featuresSummary.isAmbiguous) { 439 | featuresSummary.ambiguous++; 440 | subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'ambiguous') : suite.ambiguous++; 441 | } else if (feature.scenarios.count === feature.scenarios.skipped) { 442 | featuresSummary.skipped++; 443 | subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'skipped') : suite.skipped++; 444 | } else if (feature.scenarios.count === feature.scenarios.notdefined) { 445 | featuresSummary.notdefined++; 446 | subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'passed') : suite.passed++; 447 | } else if (feature.scenarios.count === feature.scenarios.pending) { 448 | featuresSummary.pending++; 449 | subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'passed') : suite.passed++; 450 | } else { 451 | featuresSummary.passed++; 452 | subSuite ? hierarchyReporter.recursivelyIncrementStat(subSuite, 'passed') : suite.passed++; 453 | } 454 | 455 | if (options.reportSuiteAsScenarios) { 456 | suite.failed = suite.scenarios.failed; 457 | suite.passed = suite.scenarios.passed; 458 | suite.ambiguous = suite.scenarios.ambiguous; 459 | suite.skipped = suite.scenarios.skipped; 460 | suite.rerun = suite.scenarios.rerun; 461 | suite.reportAs = 'scenarios'; 462 | } 463 | 464 | if (feature.time) { 465 | suite.totalTime += feature.time; 466 | } 467 | 468 | suite.features = topLevelFeatures; 469 | suite.features.summary = featuresSummary; 470 | 471 | return suite; 472 | }); 473 | 474 | suite.totalTime = calculateDuration(suite.totalTime); 475 | 476 | if (options.theme === 'hierarchy') { 477 | setupSubSuiteTemplates(suite); 478 | } 479 | 480 | if (options.metadata) suite.metadata = options.metadata; 481 | 482 | return suite; 483 | }; 484 | 485 | function readFile(fileName) { 486 | function getPath(name) { 487 | //use custom template based on user's requirement 488 | if (options.templateDir && fs.existsSync(path.join(options.templateDir, name))) { 489 | return path.join(options.templateDir, name); 490 | } else { 491 | return path.join(__dirname, '..', 'templates', options.theme, name); 492 | } 493 | } 494 | 495 | return fs.readFileSync(getPath(fileName), 'utf-8'); 496 | } 497 | 498 | suite = setStats(suite); 499 | 500 | fs.writeFileSync( 501 | options.output, 502 | _.template(readFile('index.html'))({ 503 | suite: suite, 504 | features: getFeaturesTemplate(suite), 505 | styles: readFileForRespectiveTemplates('style.css'), 506 | script: readFileForRespectiveTemplates('script.js'), 507 | screenshot: readFile('../_common/screenshot.js'), 508 | piechart: 509 | options.theme === 'bootstrap' || options.theme === 'hierarchy' 510 | ? readFileForRespectiveTemplates('piechart.js') 511 | : undefined, 512 | guid: guid, 513 | }) 514 | ); 515 | 516 | console.log( 517 | '\n' + 518 | chalk.green.bold( 519 | emoji.emojify(':rocket:') + 520 | ' Cucumber HTML report ' + 521 | chalk.blue.bold(options.output) + 522 | ' generated successfully ' 523 | ) + 524 | emoji.emojify(':thumbsup:') 525 | ); 526 | }; 527 | 528 | function generate(options, callback) { 529 | function isValidJsonFile() { 530 | // options.jsonFile = options.jsonFile || options.output + '.json'; 531 | options.jsonFile = options.jsonFile || options.output + '.json' || options.output + '.ndjson'; 532 | 533 | function isAFile(filePath) { 534 | try { 535 | return fs.statSync(filePath).isFile(); 536 | } catch (err) { 537 | return false; 538 | } 539 | } 540 | 541 | if (!isAFile(options.jsonFile)) { 542 | const jsonFilePath = options.jsonFile; 543 | const dynamicReportJsonFileName = fs.readdirSync(jsonFilePath, 'utf-8'); 544 | options.jsonFile = jsonFilePath + '/' + dynamicReportJsonFileName[0]; 545 | } 546 | 547 | try { 548 | JSON.parse(JSON.stringify(jsonFile.readFileSync(options.jsonFile))); 549 | return true; 550 | } catch (e) { 551 | console.log( 552 | '\n' + 553 | '\n' + 554 | chalk.bold.red( 555 | emoji.emojify(':warning: ') + 556 | emoji.emojify(':disappointed: ') + 557 | "Unable to parse cucumberjs output into json: '%s'", 558 | options.jsonFile, 559 | e 560 | ) 561 | ); 562 | if (callback) { 563 | callback('Unable to parse cucumberjs output into json: \'' + options.jsonFile + '\'. Error: ' + e); 564 | } else { 565 | return false; 566 | } 567 | } 568 | } 569 | 570 | async function launchReport() { 571 | if (fs.existsSync(options.output) && (options.launchReport || options.launchReport === 'true')) { 572 | await open(options.output, { wait: false }); 573 | } 574 | } 575 | 576 | if (options.jsonDir) { 577 | jsonDir.collectJSONS(options); 578 | } 579 | 580 | if (isValidJsonFile()) { 581 | generateReport(options); 582 | launchReport(); 583 | return callback ? callback() : true; 584 | } 585 | } 586 | 587 | // Specific to LambdaTest 588 | function getStageReRunCount() { 589 | let retryCount = undefined; 590 | const metaFile = process.env.META_FILE; 591 | try { 592 | const jobReports = jsonFile.readFileSync(metaFile); 593 | retryCount = 0; 594 | if ( 595 | !!jobReports && 596 | !!jobReports['JobSummary'] && 597 | !!jobReports['JobSummary']['Tasks'] && 598 | jobReports['JobSummary']['Tasks'] instanceof Array 599 | ) { 600 | jobReports['JobSummary']['Tasks'].forEach((task) => { 601 | if (!!task && !!task['stages'] && !!task['stages']['retried'] && !isNaN(task['stages']['retried'])) { 602 | // + makes sure that a numeric constiable is getting read as a number 603 | retryCount += +task['stages']['retried']; 604 | } 605 | }); 606 | } 607 | } catch (err) { 608 | retryCount = undefined; 609 | } 610 | return retryCount; 611 | } 612 | 613 | module.exports = { 614 | generate: generate, 615 | }; 616 | -------------------------------------------------------------------------------- /lib/searchFileUp.js: -------------------------------------------------------------------------------- 1 | // 'use strict'; 2 | 3 | const fs = require('fs-extra'); 4 | const path = require('path'); 5 | 6 | function searchFileUp(fileName) { 7 | const pathParts = process.cwd().split(path.sep); 8 | 9 | let filePath = pathParts.concat([fileName]).join(path.sep); 10 | 11 | while (!exists(filePath) && pathParts.length) { 12 | pathParts.pop(); 13 | filePath = pathParts.concat([fileName]).join(path.sep); 14 | } 15 | 16 | return filePath; 17 | } 18 | 19 | function exists(filePath) { 20 | try { 21 | return fs.statSync(filePath).isFile(); 22 | } catch (err) { 23 | return false; 24 | } 25 | } 26 | 27 | module.exports = searchFileUp; 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cucumber-html-reporter", 3 | "version": "7.2.0", 4 | "description": "Generates Cucumber HTML reports in three different themes", 5 | "main": "index.js", 6 | "typings": "./index.d.ts", 7 | "author": { 8 | "name": "Kushang Gajjar", 9 | "email": "g.kushang@gmail.com" 10 | }, 11 | "contributors": [ 12 | { 13 | "name": "larryg01", 14 | "url": "https://github.com/larryg01" 15 | }, 16 | { 17 | "name": "Galileo1", 18 | "url": "https://github.com/Galileo1" 19 | }, 20 | { 21 | "name": "LiQiang", 22 | "url": "https://github.com/li-qiang" 23 | }, 24 | { 25 | "name": "Igor Muchychka", 26 | "url": "https://github.com/mucsi96" 27 | }, 28 | { 29 | "name": "Miguel Ángel Domínguez", 30 | "url": "https://github.com/eridem" 31 | }, 32 | { 33 | "name": "Thyagarajulu Atthipatla", 34 | "url": "https://github.com/thyagab" 35 | }, 36 | { 37 | "name": "Alexandros D", 38 | "url": "https://github.com/AlexandrosD" 39 | }, 40 | { 41 | "name": "spujar", 42 | "url": "https://github.com/spujar" 43 | }, 44 | { 45 | "name": "Craeg Strong", 46 | "url": "https://github.com/cstrong" 47 | }, 48 | { 49 | "name": "anrodkin", 50 | "url": "https://github.com/anrodkin" 51 | }, 52 | { 53 | "name": "spukst3r", 54 | "url": "https://github.com/spukst3r" 55 | }, 56 | { 57 | "name": "klimenko4", 58 | "url": "https://github.com/klimenko4" 59 | }, 60 | { 61 | "name": "telaoumatenyanis", 62 | "url": "https://github.com/telaoumatenyanis" 63 | }, 64 | { 65 | "name": "jingfuxiang", 66 | "url": "https://github.com/jingfuxiang" 67 | }, 68 | { 69 | "name": "StefanPi-gfk", 70 | "url": "https://github.com/StefanPi-gfk" 71 | }, 72 | { 73 | "name": "binalabs", 74 | "url": "https://github.com/binalabs" 75 | }, 76 | { 77 | "name": "rakeshkumar5b4", 78 | "url": "https://github.com/rakeshkumar5b4" 79 | }, 80 | { 81 | "name": "xywang68", 82 | "url": "https://github.com/xywang68" 83 | }, 84 | { 85 | "name": "aurell14", 86 | "url": "https://github.com/aurell14" 87 | }, 88 | { 89 | "name": "mkginfo", 90 | "url": "https://github.com/mkginfo" 91 | }, 92 | { 93 | "name": "tiborv", 94 | "url": "https://github.com/tiborv" 95 | }, 96 | { 97 | "name": "mgor", 98 | "url": "https://github.com/mgor" 99 | }, 100 | { 101 | "name": "mattvass", 102 | "url": "https://github.com/mattvass" 103 | }, 104 | { 105 | "name": "LoicL66", 106 | "url": "https://github.com/LoicL66" 107 | }, 108 | { 109 | "name": "srbarrios", 110 | "url": "https://github.com/srbarrios" 111 | }, 112 | { 113 | "name": "glitchassassin", 114 | "url": "https://github.com/glitchassassin" 115 | }, 116 | { 117 | "name": "ncounter", 118 | "url": "https://github.com/ncounter" 119 | }, 120 | { 121 | "name": "eiszfuchs", 122 | "url": "https://github.com/eiszfuchs" 123 | }, 124 | { 125 | "name": "davestaab", 126 | "url": "https://github.com/davestaab" 127 | }, 128 | { 129 | "name": "hujunhaorobert", 130 | "url": "https://github.com/hujunhaorobert" 131 | }, 132 | { 133 | "name": "ErikGrigoriev", 134 | "url": "https://github.com/ErikGrigoriev" 135 | }, 136 | { 137 | "name": "roland-vachter", 138 | "url": "https://github.com/roland-vachter" 139 | }, 140 | { 141 | "name": "sv3k", 142 | "url": "https://github.com/sv3k" 143 | }, 144 | { 145 | "name": "Fabienmrqs ", 146 | "url": "https://github.com/Fabienmrqs" 147 | }, 148 | { 149 | "name": "abhaygarg98 ", 150 | "url": "https://github.com/abhaygarg98" 151 | } 152 | ], 153 | "scripts": { 154 | "pretest": "node node_modules/cucumber/bin/cucumber-js test/features/ -r test/features/step_definitions -f json:test/report/cucumber_report.json --no-strict || true", 155 | "clean": "rm -rf screenshots", 156 | "test": "node test/createHtmlReports.js" 157 | }, 158 | "repository": { 159 | "type": "git", 160 | "url": "git+https://github.com/gkushang/cucumber-html-reporter.git" 161 | }, 162 | "bugs": { 163 | "url": "https://github.com/gkushang/cucumber-html-reporter/issues", 164 | "email": "g.kushang@gmail.com" 165 | }, 166 | "keywords": [ 167 | "cucumber", 168 | "html", 169 | "cucumber-html-reporter", 170 | "html report", 171 | "json to html" 172 | ], 173 | "license": "MIT", 174 | "homepage": "https://github.com/gkushang/cucumber-html-reporter#readme", 175 | "dependencies": { 176 | "@cucumber/cucumber": "9.1.2", 177 | "chalk": "^2.4.2", 178 | "find": "^0.3.0", 179 | "fs-extra": "^8.1.0", 180 | "js-base64": "^2.3.2", 181 | "jsonfile": "^5.0.0", 182 | "lodash": "^4.17.11", 183 | "node-emoji": "^1.10.0", 184 | "open": "^6.4.0", 185 | "uuid": "^3.3.3" 186 | }, 187 | "devDependencies": { 188 | "chai": "^4.2.0", 189 | "cucumber": "^5.1.0" 190 | }, 191 | "directories": { 192 | "lib": "lib", 193 | "test": "test" 194 | } 195 | } 196 | -------------------------------------------------------------------------------- /samples/html_report_snapshots/cucumber_report_bootstrap_snapshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/samples/html_report_snapshots/cucumber_report_bootstrap_snapshot.png -------------------------------------------------------------------------------- /samples/html_report_snapshots/cucumber_report_bootstrap_snapshot_with_metadata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/samples/html_report_snapshots/cucumber_report_bootstrap_snapshot_with_metadata.png -------------------------------------------------------------------------------- /samples/html_report_snapshots/cucumber_report_bootstrap_snapshot_with_more_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/samples/html_report_snapshots/cucumber_report_bootstrap_snapshot_with_more_info.png -------------------------------------------------------------------------------- /samples/html_report_snapshots/cucumber_report_bootstrap_snapshot_with_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/samples/html_report_snapshots/cucumber_report_bootstrap_snapshot_with_screenshot.png -------------------------------------------------------------------------------- /samples/snapshots.md: -------------------------------------------------------------------------------- 1 | ## Attach More INFO to report 2 | 3 | ![Alt text](/samples/html_report_snapshots/cucumber_report_bootstrap_snapshot_with_more_info.png) 4 | 5 | 6 | 7 | ## Attach Screenshots to report 8 | 9 | ![Alt text](/samples/html_report_snapshots/cucumber_report_bootstrap_snapshot_with_screenshot.png) 10 | 11 | 12 | ## With Metadata 13 | 14 | ![Alt text](/samples/html_report_snapshots/cucumber_report_bootstrap_snapshot_with_metadata.png) 15 | 16 | 17 | ## Sample 18 | 19 | ![Alt text](/samples/html_report_snapshots/cucumber_report_bootstrap_snapshot.png) 20 | -------------------------------------------------------------------------------- /screenshots/a_failing_scenario_captures_a_screenshot_4170.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/screenshots/a_failing_scenario_captures_a_screenshot_4170.png -------------------------------------------------------------------------------- /screenshots/a_failing_scenario_captures_a_screenshot_4687.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/screenshots/a_failing_scenario_captures_a_screenshot_4687.png -------------------------------------------------------------------------------- /screenshots/a_failing_scenario_captures_a_screenshot_4970.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/screenshots/a_failing_scenario_captures_a_screenshot_4970.png -------------------------------------------------------------------------------- /screenshots/a_failing_scenario_captures_a_screenshot_9719.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gkushang/cucumber-html-reporter/e37df003d3c1d0b697e2124b21c1d6aee4fce62a/screenshots/a_failing_scenario_captures_a_screenshot_9719.png -------------------------------------------------------------------------------- /templates/_common/bootstrap.hierarchy/piechart.js: -------------------------------------------------------------------------------- 1 | function drawChart(chartData) { 2 | let data = google.visualization.arrayToDataTable([ 3 | ['Task', 'Cucumber Results'], 4 | ['Passed', chartData.passed], 5 | ['Failed', chartData.failed], 6 | ['Pending', chartData.pending], 7 | ['Undefined', chartData.notdefined], 8 | ['Ambiguous', chartData.ambiguous], 9 | ['Skipped', chartData.skipped], 10 | ['Re-run', chartData.rerun], 11 | ]); 12 | 13 | let total = 14 | chartData.passed + 15 | chartData.failed + 16 | (chartData.pending || 0) + 17 | (chartData.notdefined || 0) + 18 | (chartData.ambiguous || 0) + 19 | (chartData.skipped || 0) || 20 | chartData.rerun || 21 | 0; 22 | let title; 23 | 24 | if (total === 1) { 25 | title = total + ' ' + chartData.title.slice(0, -1); 26 | } else { 27 | title = total + ' ' + chartData.title; 28 | } 29 | 30 | let options = { 31 | width: '100%', 32 | height: 240, 33 | title: title, 34 | is3D: true, 35 | colors: ['#5cb85c', '#d9534f', '#999', '#5bc0de', '#428bca', '#f0ad4e', '#ff9933'], 36 | fontSize: '13', 37 | fontName: '"Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif', 38 | slices: { 39 | 1: { offset: 0.4 }, 40 | 2: { offset: 0.4 }, 41 | 3: { offset: 0.4 }, 42 | 4: { offset: 0.4 }, 43 | 5: { offset: 0.4 }, 44 | 6: { offset: 0.4 }, 45 | 7: { offset: 0.4 }, 46 | }, 47 | titleTextStyle: { 48 | fontSize: '13', 49 | color: '#5e5e5e', 50 | }, 51 | }; 52 | 53 | let chart = new google.visualization.PieChart(document.getElementById('piechart_' + chartData.title.toLowerCase())); 54 | 55 | chart.draw(data, options); 56 | } 57 | -------------------------------------------------------------------------------- /templates/_common/bootstrap.hierarchy/script.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | $('.collapse') 3 | .on('hide.bs.collapse', function (e) { 4 | e.stopPropagation(); 5 | $(this).prev().removeClass('open'); 6 | }) 7 | .on('show.bs.collapse', function (e) { 8 | e.stopPropagation(); 9 | $(this).prev().addClass('open'); 10 | }); 11 | 12 | let $generated = $('.generated-on'); 13 | 14 | let timestamp = $generated.text(); 15 | $generated.text('Report generated ' + moment(timestamp).fromNow()); 16 | $generated.prop('title', new Date(timestamp).toISOString()); 17 | }); 18 | 19 | $(document).ready(function () { 20 | const $collapsibleItems = $('[data-toggle="collapse"]'); 21 | const $collapseAllBtn = $('#collapse_all'); 22 | const $expandAllBtn = $('#expand_all'); 23 | 24 | const collapseAll = function () { 25 | $collapsibleItems.each(function () { 26 | $($(this).attr('href')).collapse('hide'); 27 | }); 28 | }; 29 | 30 | const expandAll = function () { 31 | $collapsibleItems.each(function () { 32 | $($(this).attr('href')).collapse('show'); 33 | }); 34 | }; 35 | 36 | $collapseAllBtn.on('click', collapseAll); 37 | $expandAllBtn.on('click', expandAll); 38 | 39 | }); 40 | 41 | function toggle(className) { 42 | let x = $(className); 43 | if (x.css('display') === 'none') { 44 | x.css('display', 'block'); 45 | } else { 46 | x.css('display', 'none'); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /templates/_common/bootstrap.hierarchy/style.css: -------------------------------------------------------------------------------- 1 | .panel-heading { 2 | padding: 0; 3 | } 4 | 5 | @media (min-width: 768px) { 6 | .pull-right-lg { 7 | float: left; 8 | } 9 | } 10 | 11 | @media (min-width: 992px) and (max-width: 1199px) { 12 | .pull-right-lg { 13 | float: right; 14 | } 15 | } 16 | 17 | @media (min-width: 768px) and (max-width: 991px) { 18 | .pull-right-lg { 19 | float: right; 20 | } 21 | } 22 | 23 | @media (min-width: 1200px) { 24 | .pull-right-lg { 25 | float: right; 26 | } 27 | } 28 | 29 | .left { 30 | float: left; 31 | } 32 | 33 | .metadata { 34 | overflow: auto; 35 | letter-spacing: 0.2px; 36 | border-color: white; 37 | line-height: 1.6; 38 | color: #4d4d4d; 39 | font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; 40 | font-size: 13px; 41 | padding-bottom: 3px; 42 | } 43 | 44 | .panel-heading a { 45 | padding: 10px 15px; 46 | display: block; 47 | position: relative; 48 | text-decoration: none; 49 | } 50 | 51 | .panel-heading i.glyphicon-chevron-down { 52 | display: none; 53 | } 54 | 55 | .panel-heading i.glyphicon-chevron-right { 56 | display: inline-block; 57 | } 58 | 59 | .panel-heading.open i.glyphicon-chevron-down { 60 | display: inline-block; 61 | } 62 | 63 | .panel-heading.open i.glyphicon-chevron-right { 64 | display: none; 65 | } 66 | 67 | .generated-on { 68 | text-align: right; 69 | padding-bottom: 10px; 70 | } 71 | 72 | .panel-title b { 73 | padding-right: 10px; 74 | } 75 | 76 | .panel-heading .label-container { 77 | position: absolute; 78 | top: 8px; 79 | right: 8px; 80 | } 81 | 82 | .panel-heading .label-container label { 83 | margin-left: 5px; 84 | padding: 5px; 85 | } 86 | 87 | .navbar .label-container { 88 | position: absolute; 89 | right: 10px; 90 | top: 14px; 91 | } 92 | 93 | .navbar { 94 | margin-bottom: 10px; 95 | } 96 | 97 | .navbar .label { 98 | font-size: 20px; 99 | } 100 | 101 | .navbar .project-name { 102 | position: absolute; 103 | top: 10px; 104 | left: 50%; 105 | margin-left: -100px; 106 | text-align: center; 107 | font-size: 20px; 108 | font-weight: bold; 109 | } 110 | 111 | .tags { 112 | margin-left: 18px; 113 | margin-right: 20px; 114 | padding-top: 5px; 115 | margin-bottom: -4px; 116 | } 117 | 118 | .tag { 119 | font-size: 13px; 120 | color: #696969; 121 | letter-spacing: 0.3px; 122 | font-weight: bold; 123 | font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; 124 | } 125 | 126 | .chart { 127 | padding-bottom: 15px; 128 | } 129 | 130 | div.chart div div svg rect { 131 | fill: #f5f5f5; 132 | } 133 | 134 | .arguments { 135 | margin-left: 30px; 136 | margin-top: 1em; 137 | margin-bottom: 15px; 138 | } 139 | 140 | #directory { 141 | background-color: #f0f0f0; 142 | } 143 | 144 | .screenshot { 145 | padding: 2% 0 2% 0; 146 | } 147 | 148 | .description { 149 | background-color: white; 150 | border-color: white; 151 | line-height: 1.6; 152 | color: #6f6f6f; 153 | font-weight: 400; 154 | font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; 155 | font-size: 14px; 156 | padding: 0.1em 0.5em 1.2em 1.5em 157 | } 158 | 159 | #scenario-description { 160 | padding-bottom: 1em; 161 | padding-left: 0.2em; 162 | } 163 | 164 | .scrollBar { 165 | overflow-x: scroll; 166 | } 167 | 168 | table { 169 | border-collapse: collapse; 170 | } 171 | 172 | table, th, td { 173 | border: 1px solid black; 174 | } 175 | 176 | th, td { 177 | text-align: left; 178 | padding: 8px; 179 | } 180 | 181 | th { 182 | background-color: #f5f5f5; 183 | color: black; 184 | } 185 | 186 | .info { 187 | background-color: #fbfbfb; 188 | } 189 | 190 | pre { 191 | display: block; 192 | padding: 10px; 193 | margin-top: 1em; 194 | margin-right: 3em; 195 | font-size: 13px; 196 | line-height: 1.42857143; 197 | word-break: break-all; 198 | word-wrap: break-word; 199 | color: #333; 200 | background-color: #f5f5f5; 201 | border: 1px solid #ccc; 202 | border-radius: 4px; 203 | } 204 | 205 | .step-duration { 206 | float: right; 207 | color: #BDBDBD; 208 | } 209 | 210 | .footer-div { 211 | text-align: right; 212 | vertical-align: middle; 213 | height: 3.5%; 214 | width: 100%; 215 | } 216 | 217 | .footer-container { 218 | margin-right: 10px; 219 | margin-top: 5px; 220 | width: 18%; 221 | z-index: 10; 222 | position: absolute; 223 | right: 0; 224 | bottom: 10px; 225 | text-align: center; 226 | background-color: transparent; 227 | } 228 | 229 | .show-modal:hover { 230 | background-color: #f0f0f0; 231 | } 232 | 233 | .footer-link { 234 | font-size: 13px; 235 | float: right; 236 | } 237 | 238 | .footer-link:hover { 239 | color: darkgray; 240 | } 241 | 242 | .steps { 243 | padding-left: 10px; 244 | padding-right: 10px; 245 | margin-bottom: -4px; 246 | } 247 | 248 | .all-features { 249 | padding-top: 0.6em; 250 | } 251 | 252 | .keyword { 253 | color: #616161; 254 | } 255 | 256 | .stepname { 257 | word-wrap: break-word; 258 | } 259 | 260 | .feature-passed { 261 | display: block; 262 | } 263 | 264 | .feature-failed{ 265 | display: block; 266 | } 267 | 268 | .label-saffron{ 269 | background-color: #ff9933; 270 | } 271 | 272 | .label-retries { 273 | display: flex; 274 | flex-wrap: wrap; 275 | width: 90px; 276 | justify-content: flex-end; 277 | gap: 5px; 278 | } 279 | 280 | .label-retries > span:first-child { 281 | min-width: 100%; 282 | } 283 | 284 | .ellipsis { 285 | display: block; 286 | white-space: nowrap; 287 | overflow: hidden; 288 | text-overflow: ellipsis; 289 | transition: all .2s linear; 290 | white-space: nowrap; 291 | padding:.5rem 1rem; 292 | } 293 | .ellipsis:focus, .ellipsis:hover { 294 | color:transparent; 295 | } 296 | .ellipsis:focus:after,.ellipsis:hover:after{ 297 | content:attr(data-text); 298 | overflow: visible; 299 | text-overflow: inherit; 300 | background: #fff; 301 | position: absolute; 302 | left:auto; 303 | top:auto; 304 | width: auto; 305 | max-width: 100%; 306 | border: 1px solid #eaebec; 307 | padding: 0 .5rem; 308 | box-shadow: 0 2px 4px 0 rgba(0,0,0,.28); 309 | white-space: normal; 310 | word-wrap: break-word; 311 | display:block; 312 | color:black; 313 | margin-top:-1.25rem; 314 | z-index: 1; 315 | } -------------------------------------------------------------------------------- /templates/_common/foundation/script.js: -------------------------------------------------------------------------------- 1 | window.onload = function () { 2 | // Accordion hide/show 3 | let accordionTitles = document.getElementsByClassName('accordion-title'); 4 | 5 | // Convert node list to array 6 | Array.prototype.slice.call(accordionTitles).forEach(function (title) { 7 | title.onclick = function () { 8 | let content = nextElement(title); 9 | let style = window.getComputedStyle(content); 10 | let display = style.getPropertyValue('display'); 11 | 12 | if (display === 'block') { 13 | content.style.display = 'none'; 14 | } else { 15 | content.style.display = 'block'; 16 | } 17 | 18 | return false; 19 | }; 20 | }); 21 | 22 | // Update build time to since 23 | let buildTimeElem = document.getElementById('buildTime'); 24 | buildTimeElem.innerHTML = 'Built ' + moment(buildTimeElem.innerHTML).fromNow(); 25 | }; 26 | 27 | /* 28 | Credit to John Resig for this function 29 | taken from Pro JavaScript techniques 30 | */ 31 | function nextElement(elem) { 32 | do { 33 | elem = elem.nextSibling; 34 | } while (elem && elem.nodeType !== 1); 35 | 36 | return elem; 37 | } 38 | -------------------------------------------------------------------------------- /templates/_common/screenshot.js: -------------------------------------------------------------------------------- 1 | $('a.toggle').on('click', function (e) { 2 | e.preventDefault(); 3 | 4 | if (!$(this).hasClass('collapse')) { 5 | if ($(this).text() === 'Screenshot -') { 6 | // $(this).text('Screenshot +'); 7 | $(this).next('a.screenshot').find('img').hide(); 8 | } else if ($(this).text() === 'Screenshot +') { 9 | // $(this).text('Screenshot -'); 10 | $(this).next('a.screenshot').find('img').show(); 11 | } 12 | } 13 | 14 | if ($(this).text().includes(' -')) { 15 | $(this).text($(this).text().replace(' -', ' +')); 16 | } else { 17 | $(this).text($(this).text().replace(' +', ' -')); 18 | } 19 | }); 20 | -------------------------------------------------------------------------------- /templates/bootstrap/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cucumber Feature Report 6 | 7 | 8 | 73 | 74 | 75 | 76 | 77 | 78 | 96 | 97 |
98 | 99 |
100 |
101 |
102 |

All Scenarios

103 |
104 |
105 |
106 | <%= suite.scenarios.getTotal() %> 107 |
108 |
109 |
110 |
111 |
112 |

Passed Scenarios

113 |
114 |
115 |
116 | <%= suite.scenarios.passed %> 117 |
118 |
119 |
120 |
121 |
122 |

Failed Scenarios

123 |
124 |
125 |
126 | <%= suite.scenarios.failed %> 127 |
128 |
129 |
130 | <% if (suite.scenarios.rerun) { %> 131 |
132 |
133 |

Re-run Scenarios

134 |
135 |
136 |
137 | <%= suite.scenarios.rerun %> 138 |
139 |
140 |
141 | <% } %> 142 | <% if (suite.scenarios.skipped) { %> 143 |
144 |
145 |

Skipped Scenarios

146 |
147 |
148 |
149 | <%= suite.scenarios.skipped %> 150 |
151 |
152 |
153 | <% } %> 154 | <% if (suite.scenarios.pending) { %> 155 |
156 |
157 |

Pending Scenarios

158 |
159 |
160 |
161 | <%= suite.scenarios.pending %> 162 |
163 |
164 |
165 | <% } %> 166 | <% if (suite.scenarios.notdefined) { %> 167 |
168 |
169 |

Undefined Scenarios

170 |
171 |
172 |
173 | <%= suite.scenarios.notdefined %> 174 |
175 |
176 |
177 | <% } %> 178 | <% if (suite.scenarios.ambiguous) { %> 179 |
180 |
181 |

Ambiguous Scenarios

182 |
183 |
184 |
185 | <%= suite.scenarios.ambiguous %> 186 |
187 |
188 |
189 | <% } %> 190 |
191 |
192 |
193 |
194 |
195 | 196 |
197 |

198 | Execution Time: <%= suite.totalTime %> 199 |

200 |

201 | Expand All 202 | | 203 | Collapse All 204 |

205 |
206 | 207 | <% if (suite.metadata) { %> 208 |
209 |
210 |

211 | 212 | 213 | 214 | Metadata 215 | 216 |

217 |
218 |
219 |
220 |
221 | <% var isLeft=true %> 222 | <% _.map(suite.metadata, function(value, key) { %> 223 | <% var className %> 224 | <% if (isLeft) { className="pull-left" ; isLeft=false; } else { className="pull-right-lg" ; 225 | isLeft=true } %> 226 | 234 | <% }) %> 235 |
236 |
237 |
238 |
239 | <% } %> 240 | 241 | <%= features %> 242 | 243 | <% if (suite.failedSummaryReport) { %> 244 |
245 | 254 | 255 | 256 |
257 |
258 | 259 | <% if (suite.scenarios.failed===0) { %> 260 |
261 |

Nothing to show

262 |
263 | <% } %> 264 | <% if (suite.scenarios.failed!==0) { %> 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | <% } %> 273 | <% if (suite.features) { %> 274 | <% _.each(suite.features, function(features, featureIndex) { %> 275 | <% _.each(features.elements, function(elements) { %> 276 | <% if (elements.failed) { %> 277 | 278 | 281 | 284 | 291 | 292 | <% _.each(elements.steps, function(steps) { %> 293 | <% if (steps.result.status==='failed' ) { %> 294 | 297 | 300 | <% } %> 301 | <% }); %> 302 | <% } %> 303 | <% }); %> 304 | 305 | <% }); %> 306 | <% } %> 307 |
FeatureScenarioTagsStep FailedFailed Exception
279 | <%= features.name %> 280 | 282 | <%= elements.name %> 283 | 285 | <% _.each(elements.tags, function(tags) { %> 286 | 287 | <%= tags.name %> 288 | 289 | <% }); %> 290 | 295 | <%= steps.name %> 296 | 298 | <%= steps.result.error_message %> 299 |
308 |
309 |
310 |
311 | <% } %> 312 |
313 | 314 | 315 | 316 | 319 | 322 | 323 | 324 | 350 | 355 | 356 | 357 | 358 | -------------------------------------------------------------------------------- /templates/foundation/features.html: -------------------------------------------------------------------------------- 1 | <% _.each(suite.features, function(feature, featureIndex) { %> 2 |
3 |
4 | 5 |

<%= feature.keyword %>: <%= feature.name %>

6 | <% if (feature.description) { %>

<%= feature.description.replace(/\n/g, '
') %>

<% } %> 7 |
8 | <% _.each(feature.elements, function(element, scenarioIndex) { %> 9 |
10 |
11 |

<%= element.keyword %>: <%= element.name %> 12 | 13 | <% if(_.some(element.steps, function(step){ return step.result && step.result.status === 'failed'; })) { %> 14 | Failed 15 | <% } else if(_.some(element.steps, function(step){ return step.result && step.result.status === 'ambiguous' })) { %> 16 | Ambiguous 17 | <% } else if(_.some(element.steps, function(step){ return step.result && step.result.status === 'undefined'; })) { %> 18 | Undefined 19 | <% } else if(_.some(element.steps, function(step){ return step.result && step.result.status === 'pending'; })) { %> 20 | Pending 21 | <% } else if(_.every(element.steps, function(step){ return step.result && step.result.status === 'passed'; })) { %> 22 | Passed 23 | <% } %> 24 | 25 |

26 | 27 |
28 | <% _.each(element.steps, function(step, stepIndex) { %> 29 | 30 |

31 | <%= step.keyword %> <%- step.name %> 32 | <% if(step.result) { %> 33 | 34 | <% if(step.result.status === 'failed') { %> 35 | Failed 36 | <% } else if(step.result.status === 'ambiguous') { %> 37 | Ambiguous 38 | <% } else if(step.result.status === 'skipped') { %> 39 | Skipped 40 | <% } else if(step.result.status === 'undefined') { %> 41 | Undefined 42 | <% } else if(step.result.status === 'pending') { %> 43 | Pending 44 | <% } else { %> 45 | Passed 46 | <% } %> 47 | 48 | <% } %> 49 | 50 | <% if (step.text) { %> 51 | + Show Info 52 |

53 | <%= step.text %> 54 |
55 | <% } %> 56 | 57 | <% if (step.image) { %> 58 | Screenshot - 59 | 60 | 61 | 62 | <% } %> 63 |

64 | 65 | <% if (step.result && step.result.error_message) { %> 66 | <%= step.result.error_message %> 67 | <% } %> 68 | 69 | <% }); %> 70 |
71 |
72 |
73 | <% }); %> 74 |
75 |
76 |
77 |
78 | <% }); %> 79 | -------------------------------------------------------------------------------- /templates/foundation/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Cucumber Feature Report 5 | 6 | 7 | 10 | 11 | 12 | 13 |
14 |
15 |
16 |

<%= suite.name.plain %>

17 |

Feature tests

18 |
19 |
20 |

<%= suite.version %>

21 |

<%= suite.time %>

22 |
23 |
24 |
25 |

26 | 27 | <%= features %> 28 | 29 | 30 | 31 | 32 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /templates/foundation/style.css: -------------------------------------------------------------------------------- 1 | p { 2 | font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; 3 | } 4 | 5 | header { 6 | background-color: #2ba6cb; 7 | padding: 22px 0; 8 | } 9 | 10 | header h1, 11 | header h4 { 12 | color: #fff !important; 13 | } 14 | 15 | header h4 { 16 | font-family: "OpenSans", "Helvetica Neue", "Helvetica", Arial, Verdana, sans-serif; 17 | -webkit-font-smoothing: antialiased; 18 | } 19 | 20 | .right-col { 21 | text-align: right; 22 | } 23 | 24 | .highlight { 25 | color: #5EC7E5; 26 | } 27 | -------------------------------------------------------------------------------- /templates/hierarchy/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Cucumber Feature Report 5 | 6 | 9 | 10 | 11 | 12 | 13 | 26 | 27 |
28 | 29 |
<%= suite.time %>
30 | 31 |
32 |
33 |
34 |
35 | 36 | <% if (suite.metadata) { %> 37 |
38 |
39 |

40 | 41 | 42 | 43 | Metadata 44 | 45 |

46 |
47 |
48 |
49 |
50 | <% var isLeft = true %> 51 | <% _.map(suite.metadata, function(value, key) { %> 52 | <% var className %> 53 | <% if (isLeft) { className = "pull-left"; isLeft = false; } 54 | else { className= "pull-right-lg"; isLeft = true } %> 55 | 60 | <% }) %> 61 |
62 |
63 |
64 |
65 | <% } %> 66 | 67 |
68 | <%= suite.featureMarkup %> 69 | <% _.each(suite.suites, function(subSuite, subSuiteIndex) { %> 70 |
71 | 86 |
87 |
88 | <%= subSuite.featureMarkup %> 89 | <% _.each(subSuite.suites, function(subSubSuite, subSubSuiteIndex) { %> 90 | <% var subSuiteId = guid(); %> 91 | 138 | <% }); %> 139 |
140 |
141 |
142 | <% }); %> 143 |
144 | 145 |
146 | 157 | 158 | 159 | 160 | 161 | 162 | 185 | 190 | 191 | 192 | -------------------------------------------------------------------------------- /templates/simple/features.html: -------------------------------------------------------------------------------- 1 | <% _.each(suite.features, function(feature) { %> 2 |
3 |

<%= feature.keyword %>: <%= feature.name %>

4 | <% if (feature.description) { %>

<%= feature.description.replace(/\n/g, '
') %>

<% } %> 5 | <% _.each(feature.elements, function(element) { %> 6 |
7 |

<%= element.keyword %>: <%= element.name %>

8 | <% _.each(element.steps, function(step) { %> 9 |
10 |

11 | <% if(step.result) { %> 12 | 13 | <% } %> 14 | <%= step.keyword %> <%- step.name %> 15 | <% if (step.text) { %> 16 |

17 |
18 | <%= step.text %> 19 |
20 | <% } %> 21 | <% if (step.image) { %> 22 |
23 | Screenshot - 24 | 25 |
26 | <% } %> 27 | <% if (step.result.error_message) { %> 28 |
<%= step.result.error_message.replace(//g, ')') %>
29 | <% } %> 30 |

31 |
32 | <% }); %> 33 |
34 | <% }); %> 35 |
36 | <% }); %> 37 | -------------------------------------------------------------------------------- /templates/simple/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Cucumber Feature Report 5 | 8 | 9 | 10 | 11 | <%= features %> 12 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /templates/simple/script.js: -------------------------------------------------------------------------------- 1 | function toggleScreenshot(e) { 2 | if (this.innerText === 'Screenshot -') { 3 | this.innerText = 'Screenshot +'; 4 | this.nextElementSibling.style.display = 'none'; 5 | } else { 6 | this.innerText = 'Screenshot -'; 7 | this.nextElementSibling.style.display = 'block'; 8 | } 9 | } 10 | 11 | let toggleEls = document.querySelectorAll('a.toggle'); 12 | 13 | for (let i = 0; i < toggleEls.length; i++) { 14 | toggleEls[i].addEventListener('click', toggleScreenshot); 15 | } 16 | -------------------------------------------------------------------------------- /templates/simple/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | font: 14px Consolas, Courier, monospace; 3 | } 4 | 5 | h1, h2, h3, h4, p { 6 | margin: 0; 7 | padding: 0; 8 | } 9 | 10 | .highlight { 11 | font-weight: bold; 12 | } 13 | 14 | .failed { 15 | color: darkred; 16 | font-weight: bold; 17 | } 18 | 19 | .step-error-message { 20 | color: darkred; 21 | margin: 0 0 0 10px; 22 | } 23 | 24 | .passed { 25 | color: green; 26 | } 27 | 28 | .skipped { 29 | color: #999; 30 | } 31 | 32 | .step { 33 | margin: 4px 0; 34 | } 35 | 36 | .step .text { 37 | border-radius: 3px; 38 | display: block; 39 | } 40 | 41 | .step .screenshot { 42 | border: solid 1px #CCC; 43 | height: 100%; 44 | width: 100%; 45 | } 46 | 47 | .step-screenshot-wrap { 48 | margin-left: 10px; 49 | } 50 | 51 | .container { 52 | background: #f8f8f8; 53 | border-radius: 5px; 54 | border: 1px solid #e8e8e8; 55 | padding: 10px; 56 | margin: 10px; 57 | } 58 | 59 | #danger { 60 | background-color: #f66666; 61 | } -------------------------------------------------------------------------------- /test/assert/assertHtmlReports.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | const chai = require('chai'); 3 | const fs = require('fs-extra'); 4 | const path = require('path'); 5 | 6 | const should = chai.should(); 7 | 8 | module.exports = function assertHtmlReports(outputDirectory) { 9 | function isReportExists(report) { 10 | try { 11 | return fs.statSync(report).isFile(); 12 | } catch (e) { 13 | return false; 14 | } 15 | } 16 | 17 | function isDirectoryExists(dir) { 18 | return fs.existsSync(dir); 19 | } 20 | 21 | const hierarchyHtmlFile = path.join(outputDirectory, 'cucumber_report_hierarchy.html'); 22 | const bootstrapHtmlFile = path.join(outputDirectory, 'cucumber_report_bootstrap.html'); 23 | const foundationHtmlFile = path.join(outputDirectory, 'cucumber_report_foundation.html'); 24 | const simpleHtmlFile = path.join(outputDirectory, 'cucumber_report_simple.html'); 25 | 26 | isReportExists(hierarchyHtmlFile).should.be.equal( 27 | true, 28 | 'hierarchyHtmlFile file ' + hierarchyHtmlFile + ' does not exist' 29 | ); 30 | isReportExists(bootstrapHtmlFile).should.be.equal( 31 | true, 32 | 'bootstrapHtmlFile file' + bootstrapHtmlFile + ' does not exist' 33 | ); 34 | isReportExists(foundationHtmlFile).should.be.equal( 35 | true, 36 | 'foundationHtmlFile file' + foundationHtmlFile + ' does not exist' 37 | ); 38 | isReportExists(simpleHtmlFile).should.be.equal(true, 'simpleHtmlFile file ' + simpleHtmlFile + ' does not exist'); 39 | isDirectoryExists(path.join(outputDirectory, '..', '..', 'screenshots')).should.be.equal( 40 | true, 41 | 'screenshots directory does not exists, at "parentDirectory/screenshots"' 42 | ); 43 | }; 44 | -------------------------------------------------------------------------------- /test/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "scenario": { 3 | "totalScenarios": 9 4 | } 5 | } -------------------------------------------------------------------------------- /test/createHtmlReports.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fs = require('fs-extra'); 3 | const find = require('find'); 4 | const reporter = require('../index.js'); 5 | const assertHtmlReports = require('./assert/assertHtmlReports'); 6 | 7 | let theme = { 8 | hierarchy: 'hierarchy', 9 | bootstrap: 'bootstrap', 10 | foundation: 'foundation', 11 | simple: 'simple', 12 | }; 13 | 14 | let outputDirectory = 'test/report'; 15 | let jsonFile = 'test/report/cucumber_report.json'; 16 | let jsonDir = 'test/report/multi'; 17 | 18 | function removeReports() { 19 | let files = find.fileSync(/\.html/, outputDirectory); 20 | files.map(function (file) { 21 | fs.unlinkSync(file); 22 | }); 23 | } 24 | 25 | function getOptions(theme) { 26 | return { 27 | name: '@cucumber-html-reporter/*&!@#$%)(~<>`', //this tests for the sanitized hyperlinks on report, otherwise this should be plain text english 28 | theme: theme, 29 | output: path.join(outputDirectory, 'cucumber_report_' + theme + '.html'), 30 | reportSuiteAsScenarios: true, 31 | // TODO: change launchReport back to 'true' before final merge 32 | launchReport: false, 33 | storeScreenshots: true, 34 | screenshotsDirectory: 'screenshots/', 35 | metadata: { 36 | 'App Version': '0.3.2', 37 | 'Test Environment': 'STAGING', 38 | Browser: 'Chrome 54.0.2840.98', 39 | Platform: 'Windows 10', 40 | Parallel: 'Scenarios', 41 | Executed: 'Remote', 42 | }, 43 | failedSummaryReport: true, 44 | }; 45 | } 46 | 47 | function getJsonFileOptions(theme) { 48 | let options = getOptions(theme); 49 | options.jsonFile = jsonFile; 50 | return options; 51 | } 52 | 53 | function getJsonDirOptions(theme) { 54 | let options = getOptions(theme); 55 | options.jsonDir = jsonDir; 56 | return options; 57 | } 58 | 59 | function assertJsonFile() { 60 | //Generate Hierarchy theme report 61 | reporter.generate(getJsonFileOptions(theme.hierarchy)); 62 | 63 | //Generate Bootstrap theme report 64 | reporter.generate(getJsonFileOptions(theme.bootstrap)); 65 | 66 | //Generate Foundation theme report 67 | reporter.generate(getJsonFileOptions(theme.foundation)); 68 | 69 | //Generate Simple theme report 70 | reporter.generate(getJsonFileOptions(theme.simple)); 71 | 72 | //assert reports 73 | assertHtmlReports(outputDirectory); 74 | } 75 | 76 | function assertJsonDir() { 77 | //Generate Hierarchy theme report 78 | reporter.generate(getJsonDirOptions(theme.hierarchy)); 79 | 80 | // Generate Bootstrap theme report 81 | reporter.generate(getJsonDirOptions(theme.bootstrap)); 82 | 83 | //Generate Foundation theme report 84 | reporter.generate(getJsonDirOptions(theme.foundation)); 85 | 86 | //Generate Simple theme report 87 | reporter.generate(getJsonDirOptions(theme.simple)); 88 | 89 | //assert reports 90 | assertHtmlReports(outputDirectory); 91 | } 92 | 93 | assertJsonDir(); 94 | 95 | removeReports(); 96 | 97 | assertJsonFile(); 98 | -------------------------------------------------------------------------------- /test/features/happy/admin/happy.feature: -------------------------------------------------------------------------------- 1 | Feature: Admin can see Happy HTML reporting 2 | 3 | Scenario: Admin has a happy feature 4 | Given Fred is an admin 5 | When his scenario is a duplicate folder name 6 | Then it won't open unless it's the first one 7 | -------------------------------------------------------------------------------- /test/features/happy/happy.feature: -------------------------------------------------------------------------------- 1 | @happy @reporting 2 | Feature: Happy HTML reporting 3 | 4 | In order to review cucumber reports 5 | Fred, a cucumber user 6 | Wants to have cucumber reports in HTML 7 | 8 | Background: 9 | When this feature runs with background 10 | 11 | @testPassing 12 | Scenario: Fred wants to see passing scenarios in the HTML report 13 | 14 | Given Fred runs a passing
 cucumber step with 2 seconds timeout
15 |     When he provides cucumber JSON file to reporter
16 |     Then cucumber-html-reporter should create HTML report
17 | 
18 |   @testScenarioOutline
19 |   Scenario Outline: Fred runs scenario outline for  and print on HTML report
20 | 
21 |   John & Bob wants to run cucumber scenarios
22 |   - expects to have HTML reports
23 | 
24 |     Given Fred runs a passing cucumber scenario on behalf of ""
25 |     When he provides cucumber JSON file to reporter
26 |     Then cucumber-html-reporter should create HTML report
27 | 
28 |     Examples:
29 |       | name |
30 |       | John |
31 |       | Bob  |
32 | 
33 |   @testAttachDebugData
34 |   Scenario: Fred wants to print test data in the HTML reports for debugging purpose
35 |     Given Fred attaches the "test data to be printed" to the Given step of passing cucumber scenario
36 |     When he provides cucumber JSON file to reporter
37 |     Then cucumber-html-reporter should create HTML report with test-data
38 | 
39 |   @testDocString
40 |   Scenario: Fred wants see the long doc string attached in the HTML report
41 |     Given Fred runs a passing cucumber scenario with the below content
42 | 
43 |     """
44 |     In order to see Doc String in the HTML report
45 |     As a Cucumber User,
46 |     I want to print below Doc String
47 | 
48 |       Hey, I am a Doc string
49 | 
50 |     """
51 | 
52 |     When he provides cucumber JSON file to reporter
53 |     Then cucumber-html-reporter should create HTML report
54 | 
55 | 
56 |   @testDataTable
57 |   Scenario: Fred wants to use data table and print on HTML report
58 |     Given Fred runs a passing scenario for the following data set
59 |       | id | name   | id | name   | id | name   | id | name   | id | name   | id | name   | id | name   |
60 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
61 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
62 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
63 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
64 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
65 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
66 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
67 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
68 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
69 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
70 | 
71 |     When he provides cucumber JSON file to reporter
72 |     Then cucumber-html-reporter should create HTML report with data-table
73 | 


--------------------------------------------------------------------------------
/test/features/happy/overjoyed/happy.feature:
--------------------------------------------------------------------------------
 1 | @happy @reporting
 2 | Feature: Happy HTML reporting
 3 | 
 4 |   In order to review cucumber reports
 5 |   Fred, a cucumber user
 6 |   Wants to have cucumber reports in HTML
 7 | 
 8 |   Background:
 9 |     When this feature runs with background
10 | 
11 |   @testPassing
12 |   Scenario: Fred wants to see passing scenarios in the HTML report
13 | 
14 | #    Given Fred runs a passing cucumber step with 2 seconds timeout
15 |     When he provides cucumber JSON file to reporter
16 |     Then cucumber-html-reporter should create HTML report
17 | 
18 |   @testScenarioOutline
19 |   Scenario Outline: Fred runs scenario outline for  and print on HTML report
20 | 
21 |   John & Bob wants to run cucumber scenarios
22 |   - expects to have HTML reports
23 | 
24 |     Given Fred runs a passing cucumber scenario on behalf of ""
25 |     When he provides cucumber JSON file to reporter
26 |     Then cucumber-html-reporter should create HTML report
27 | 
28 |     Examples:
29 |       | name |
30 |       | John |
31 |       | Bob  |
32 | 
33 |   @testAttachDebugData
34 |   Scenario: Fred wants to print test data in the HTML reports for debugging purpose
35 |     Given Fred attaches the "test data to be printed" to the Given step of passing cucumber scenario
36 |     When he provides cucumber JSON file to reporter
37 |     Then cucumber-html-reporter should create HTML report with test-data
38 | 
39 |   @testDocString
40 |   Scenario: Fred wants see the long doc string attached in the HTML report
41 |     Given Fred runs a passing cucumber scenario with the below content
42 | 
43 |     """
44 |     In order to see Doc String in the HTML report
45 |     As a Cucumber User,
46 |     I want to print below Doc String
47 | 
48 |       Hey, I am a Doc string
49 | 
50 |     """
51 | 
52 |     When he provides cucumber JSON file to reporter
53 |     Then cucumber-html-reporter should create HTML report
54 | 
55 | 
56 |   @testDataTable
57 |   Scenario: Fred wants to use data table and print on HTML report
58 |     Given Fred runs a passing scenario for the following data set
59 |       | id | name   | id | name   | id | name   | id | name   | id | name   | id | name   | id | name   |
60 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
61 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
62 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
63 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
64 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
65 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
66 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
67 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
68 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
69 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
70 | 
71 |     When he provides cucumber JSON file to reporter
72 |     Then cucumber-html-reporter should create HTML report with data-table
73 | 


--------------------------------------------------------------------------------
/test/features/happy/overjoyed/overjoyed.feature:
--------------------------------------------------------------------------------
 1 | @happy @reporting
 2 | Feature: Happy HTML reporting
 3 | 
 4 |   In order to review cucumber reports
 5 |   Fred, a cucumber user
 6 |   Wants to have cucumber reports in HTML
 7 | 
 8 |   Background:
 9 |     When this feature runs with background
10 | 
11 |   @testPassing
12 |   Scenario: Fred wants to see passing scenarios in the HTML report
13 | 
14 |     Given Fred runs a passing cucumber step with 2 seconds timeout
15 |     When he provides cucumber JSON file to reporter
16 |     Then cucumber-html-reporter should create HTML report
17 | 
18 |   @testScenarioOutline
19 |   Scenario Outline: Fred runs scenario outline for  and print on HTML report
20 | 
21 |   John & Bob wants to run cucumber scenarios
22 |   - expects to have HTML reports
23 | 
24 |     Given Fred runs a passing cucumber scenario on behalf of ""
25 |     When he provides cucumber JSON file to reporter
26 |     Then cucumber-html-reporter should create HTML report
27 | 
28 |     Examples:
29 |       | name |
30 |       | John |
31 |       | Bob  |
32 | 
33 |   @testAttachDebugData
34 |   Scenario: Fred wants to print test data in the HTML reports for debugging purpose
35 |     Given Fred attaches the "test data to be printed" to the Given step of passing cucumber scenario
36 |     When he provides cucumber JSON file to reporter
37 |     Then cucumber-html-reporter should create HTML report with test-data
38 | 
39 |   @testDocString
40 |   Scenario: Fred wants see the long doc string attached in the HTML report
41 |     Given Fred runs a passing cucumber scenario with the below content
42 | 
43 |     """
44 |     In order to see Doc String in the HTML report
45 |     As a Cucumber User,
46 |     I want to print below Doc String
47 | 
48 |       Hey, I am a Doc string
49 | 
50 |     """
51 | 
52 |     When he provides cucumber JSON file to reporter
53 |     Then cucumber-html-reporter should create HTML report
54 | 
55 | 
56 |   @testDataTable
57 |   Scenario: Fred wants to use data table and print on HTML report
58 |     Given Fred runs a passing scenario for the following data set
59 |       | id | name   | id | name   | id | name   | id | name   | id | name   | id | name   | id | name   |
60 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
61 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
62 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
63 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
64 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
65 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
66 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
67 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
68 |       | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A | 1  | data-A |
69 |       | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B | 2  | data-B |
70 | 
71 |     When he provides cucumber JSON file to reporter
72 |     Then cucumber-html-reporter should create HTML report with data-table
73 | 


--------------------------------------------------------------------------------
/test/features/step_definitions/hooks.js:
--------------------------------------------------------------------------------
 1 | const { Before, After } = require('@cucumber/cucumber');
 2 | 
 3 | // const chalk = require('chalk');
 4 | 
 5 | // Before(function (scenario, callback) {
 6 | //     console.log( '\n' + chalk.blue.bgYellow.bold('TESTING: ') + chalk.white.bgBlue.bold(' console.log() should not break the report'));
 7 | //     this.scenario = scenario;
 8 | //     callback();
 9 | // });
10 | 
11 | Before({ tags: '@testPassing' }, function (scenario, callback) {
12 |   this.attach(
13 |     'Tests INFO will print here.' +
14 |       '
To attach INFO to Any steps, use scenario.attach function in your step definitions as shown below.' + 15 | '

If you pass HTML\'s to scenario.attach then reporter will format accordingly
' + 16 | '
Simple String : scenario.attach(\'sample data\')' + 17 | '
Pretty JSON : scenario.attach(JSON.stringify(json, null, 2))' + 18 | '
HTML Link : scenario.attach(\'format the link with html-a tag\'' 19 | ); 20 | 21 | this.attach('some text'); 22 | callback(); 23 | }); 24 | 25 | After({ tags: '@testPassing' }, function (scenario, callback) { 26 | callback(); 27 | }); 28 | -------------------------------------------------------------------------------- /test/features/unhappy/admin/unhappy.feature: -------------------------------------------------------------------------------- 1 | Feature: Admin can see Unhappy HTML reporting 2 | 3 | Scenario: Admin has a unhappy feature 4 | Given Fred is an admin 5 | When his scenario is in a duplicate folder name 6 | Then it won't open unless it's the first one 7 | -------------------------------------------------------------------------------- /test/features/unhappy/unhappy.feature: -------------------------------------------------------------------------------- 1 | @unhappy @reporting 2 | Feature: Unhappy HTML reporting 3 | 4 | @attachScreenshots 5 | Scenario: Fred wants to see a Screenshot attached to the HTML report 6 | Given Fred runs a failing cucumber scenario 7 | When he provides cucumber JSON file to reporter 8 | And a failing scenario captures a screenshot 9 | And a failing scenario captures a json payload 10 | Then cucumber-html-reporter should create HTML report with Screenshot 11 | 12 | @pendingStep 13 | Scenario: Fred wants to see if steps are pending in the HTML report 14 | Given Fred runs a cucumber scenario 15 | When he left this step as a pending 16 | Then cucumber-html-reporter should report pending step with code-snippets in HTML report 17 | 18 | @undefinedStep 19 | Scenario: Fred wants to see if steps are undefined on the HTML report 20 | Given Fred runs a cucumber scenario 21 | When he left this step as a undefined 22 | Then cucumber-html-reporter should create undefined step in HTML report 23 | 24 | @ambiguousStep 25 | Scenario: Fred wants to see if steps are ambiguous on the HTML report 26 | Given Fred runs a cucumber scenario 27 | When he left this step to be ambiguous 28 | Then cucumber-html-reporter should create HTML report with ambiguous steps 29 | --------------------------------------------------------------------------------