@cucumber/html-formatter 13.0.0 → 15.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cucumber/html-formatter",
3
- "version": "13.0.0",
3
+ "version": "15.0.2",
4
4
  "description": "HTML formatter for Cucumber",
5
5
  "bin": {
6
6
  "cucumber-html-formatter": "bin/cucumber-html-formatter.js"
@@ -18,31 +18,34 @@
18
18
  "prepublishOnly": "tsc --build tsconfig.build.json"
19
19
  },
20
20
  "dependencies": {
21
- "@cucumber/messages": "^15.0.0",
22
- "commander": "^7.2.0",
23
- "source-map-support": "^0.5.19"
21
+ "@cucumber/messages": "^16.0.1",
22
+ "commander": "7.2.0",
23
+ "source-map-support": "0.5.19"
24
24
  },
25
25
  "devDependencies": {
26
- "@babel/core": "^7.13.14",
27
- "@cucumber/gherkin-utils": "^4.0.0",
28
- "@cucumber/query": "^9.0.2",
29
- "@cucumber/react": "^13.0.0",
30
- "@cucumber/gherkin-streams": "^1.0.0",
31
- "@cucumber/message-streams": "^1.0.0",
32
- "@types/mocha": "^8.2.2",
33
- "@types/node": "^14.14.37",
34
- "@types/react": "^17.0.3",
35
- "@types/react-dom": "^17.0.3",
36
- "babel-loader": "^8.2.2",
37
- "mocha": "^8.3.2",
38
- "puppeteer": "^8.0.0",
39
- "react": "^17.0.2",
40
- "react-dom": "^17.0.2",
41
- "ts-loader": "^8.1.0",
42
- "ts-node": "^9.1.1",
43
- "typescript": "^4.2.3",
44
- "webpack": "^5.30.0",
45
- "webpack-cli": "^4.6.0"
26
+ "@babel/core": "7.14.3",
27
+ "@cucumber/gherkin-streams": "^2.0.2",
28
+ "@cucumber/gherkin-utils": "^5.1.0",
29
+ "@cucumber/message-streams": "^2.0.0",
30
+ "@cucumber/query": "^10.0.0",
31
+ "@cucumber/react": "^16.1.0",
32
+ "@types/mocha": "8.2.2",
33
+ "@types/node": "15.6.1",
34
+ "@types/react": "17.0.8",
35
+ "@types/react-dom": "17.0.5",
36
+ "babel-loader": "8.2.2",
37
+ "css-loader": "5.2.6",
38
+ "mini-css-extract-plugin": "1.6.0",
39
+ "mocha": "8.4.0",
40
+ "puppeteer": "9.1.1",
41
+ "react": "17.0.2",
42
+ "react-dom": "17.0.2",
43
+ "sass-loader": "11.1.1",
44
+ "ts-loader": "9.2.2",
45
+ "ts-node": "10.0.0",
46
+ "typescript": "4.3.2",
47
+ "webpack": "5.37.1",
48
+ "webpack-cli": "4.7.0"
46
49
  },
47
50
  "bugs": {
48
51
  "url": "https://github.com/cucumber/cucumber/issues"
@@ -1,6 +1,6 @@
1
1
  import fs from 'fs'
2
2
  import { Readable, Transform, TransformCallback } from 'stream'
3
- import { messages } from '@cucumber/messages'
3
+ import * as messages from '@cucumber/messages'
4
4
 
5
5
  export default class CucumberHtmlStream extends Transform {
6
6
  private template: string | null = null
@@ -104,6 +104,6 @@ export default class CucumberHtmlStream extends Transform {
104
104
  } else {
105
105
  this.push(',')
106
106
  }
107
- this.push(JSON.stringify(envelope.toJSON()))
107
+ this.push(JSON.stringify(envelope))
108
108
  }
109
109
  }
package/src/cli-main.ts CHANGED
@@ -1,26 +1,17 @@
1
- import { messages } from '@cucumber/messages'
2
- import { BinaryToMessageStream, NdjsonToMessageStream } from '@cucumber/message-streams'
1
+ import { NdjsonToMessageStream } from '@cucumber/message-streams'
3
2
  import program from 'commander'
4
3
  import p from '../package.json'
5
4
  import { pipeline } from 'stream'
6
5
  import CucumberHtmlStream from './CucumberHtmlStream'
7
6
 
8
7
  program.version(p.version)
9
- program.option('-f, --format <format>', 'output format: ndjson|protobuf', 'protobuf')
10
8
  program.parse(process.argv)
11
9
 
12
- const toMessageStream =
13
- program.opts().format === 'ndjson'
14
- ? new NdjsonToMessageStream(messages.Envelope.fromObject.bind(messages.Envelope))
15
- : new BinaryToMessageStream(messages.Envelope.decodeDelimited.bind(messages.Envelope))
16
-
10
+ const toMessageStream = new NdjsonToMessageStream()
17
11
  pipeline(
18
12
  process.stdin,
19
13
  toMessageStream,
20
- new CucumberHtmlStream(
21
- __dirname + '/../../dist/cucumber-react.css',
22
- __dirname + '/../../dist/main.js'
23
- ),
14
+ new CucumberHtmlStream(__dirname + '/../../dist/main.css', __dirname + '/../../dist/main.js'),
24
15
  process.stdout,
25
16
  (err: any) => {
26
17
  if (err) {
package/src/main.tsx CHANGED
@@ -1,4 +1,4 @@
1
- import { messages } from '@cucumber/messages'
1
+ import * as messages from '@cucumber/messages'
2
2
  import { QueriesWrapper, EnvelopesQuery, FilteredResults } from '@cucumber/react'
3
3
  import { Query as GherkinQuery } from '@cucumber/gherkin-utils'
4
4
  import { Query as CucumberQuery } from '@cucumber/query'
@@ -7,7 +7,7 @@ import ReactDOM from 'react-dom'
7
7
 
8
8
  declare global {
9
9
  interface Window {
10
- CUCUMBER_MESSAGES: messages.IEnvelope[]
10
+ CUCUMBER_MESSAGES: messages.Envelope[]
11
11
  }
12
12
  }
13
13
 
@@ -15,8 +15,7 @@ const gherkinQuery = new GherkinQuery()
15
15
  const cucumberQuery = new CucumberQuery()
16
16
  const envelopesQuery = new EnvelopesQuery()
17
17
 
18
- for (const envelopeObject of window.CUCUMBER_MESSAGES) {
19
- const envelope = messages.Envelope.fromObject(envelopeObject)
18
+ for (const envelope of window.CUCUMBER_MESSAGES as messages.Envelope[]) {
20
19
  gherkinQuery.update(envelope)
21
20
  cucumberQuery.update(envelope)
22
21
  envelopesQuery.update(envelope)
@@ -1,9 +1,9 @@
1
- import { messages } from '@cucumber/messages'
1
+ import * as messages from '@cucumber/messages'
2
2
  import CucumberHtmlStream from '../src/CucumberHtmlStream'
3
3
  import { Writable } from 'stream'
4
4
  import assert from 'assert'
5
5
 
6
- async function renderAsHtml(...envelopes: messages.IEnvelope[]): Promise<string> {
6
+ async function renderAsHtml(...envelopes: messages.Envelope[]): Promise<string> {
7
7
  return new Promise((resolve, reject) => {
8
8
  let html = ''
9
9
  const sink: Writable = new Writable({
@@ -34,25 +34,30 @@ describe('CucumberHtmlStream', () => {
34
34
  })
35
35
 
36
36
  it('writes one message to html', async () => {
37
- const e1 = messages.Envelope.create({
38
- testRunStarted: messages.TestRunStarted.create({}),
39
- })
37
+ const e1: messages.Envelope = {
38
+ testRunStarted: {
39
+ timestamp: { seconds: 0, nanos: 0 },
40
+ },
41
+ }
40
42
  const html = await renderAsHtml(e1)
41
- assert(html.indexOf(`window.CUCUMBER_MESSAGES = [${JSON.stringify(e1.toJSON())}]`) >= 0)
43
+ assert(html.indexOf(`window.CUCUMBER_MESSAGES = [${JSON.stringify(e1)}]`) >= 0)
42
44
  })
43
45
 
44
46
  it('writes two messages to html', async () => {
45
- const e1 = messages.Envelope.create({
46
- testRunStarted: messages.TestRunStarted.create({}),
47
- })
48
- const e2 = messages.Envelope.create({
49
- testRunFinished: messages.TestRunFinished.create({}),
50
- })
47
+ const e1: messages.Envelope = {
48
+ testRunStarted: {
49
+ timestamp: { seconds: 0, nanos: 0 },
50
+ },
51
+ }
52
+ const e2: messages.Envelope = {
53
+ testRunFinished: {
54
+ timestamp: { seconds: 0, nanos: 0 },
55
+ success: true,
56
+ },
57
+ }
51
58
  const html = await renderAsHtml(e1, e2)
52
59
  assert(
53
- html.indexOf(
54
- `window.CUCUMBER_MESSAGES = [${JSON.stringify(e1.toJSON())},${JSON.stringify(e2.toJSON())}]`
55
- ) >= 0
60
+ html.indexOf(`window.CUCUMBER_MESSAGES = [${JSON.stringify(e1)},${JSON.stringify(e2)}]`) >= 0
56
61
  )
57
62
  })
58
63
  })
package/webpack.config.js CHANGED
@@ -1,3 +1,29 @@
1
+ const MiniCssExtractPlugin = require('mini-css-extract-plugin');
2
+
1
3
  module.exports = {
2
4
  entry: './dist/src/main.js',
5
+ module: {
6
+ rules: [
7
+ {
8
+ test: /\.scss$/,
9
+ use: [
10
+ MiniCssExtractPlugin.loader,
11
+ {
12
+ loader: 'css-loader',
13
+ options: {
14
+ modules: {
15
+ auto: true
16
+ }
17
+ }
18
+ },
19
+ 'sass-loader'
20
+ ],
21
+ }
22
+ ],
23
+ },
24
+ plugins: [
25
+ new MiniCssExtractPlugin({
26
+ filename: 'main.css'
27
+ })
28
+ ]
3
29
  };
@@ -1,291 +0,0 @@
1
- .cucumber-react .cucumber-status--passed {
2
- color: #2CB14A;
3
- }
4
- .cucumber-react .cucumber-status--skipped {
5
- color: #00A0CC;
6
- }
7
- .cucumber-react .cucumber-status--pending {
8
- color: #FFAD33;
9
- }
10
- .cucumber-react .cucumber-status--undefined {
11
- color: #FFAD33;
12
- }
13
- .cucumber-react .cucumber-status--ambiguous {
14
- color: #F4EBFD;
15
- }
16
- .cucumber-react .cucumber-status--failed {
17
- color: #BB0000;
18
- }
19
- .cucumber-react .cucumber-status--unknown {
20
- color: #B6BECB;
21
- }
22
- .cucumber-react h1, .cucumber-react h2, .cucumber-react h3 {
23
- padding: 0;
24
- margin: 0;
25
- }
26
- .cucumber-react a {
27
- color: inherit;
28
- }
29
- .cucumber-react .gherkin-document-list {
30
- font: 14px "Open Sans", sans-serif;
31
- color: #161C24;
32
- background: #fff;
33
- overflow-x: hidden;
34
- }
35
- .cucumber-react .cucumber-title {
36
- margin-top: 0.3em;
37
- margin-bottom: 0;
38
- display: inline-block;
39
- }
40
- .cucumber-react .cucumber-title__keyword {
41
- font-weight: bold;
42
- }
43
- .cucumber-react .cucumber-title__text {
44
- font-weight: normal;
45
- }
46
- .cucumber-react .cucumber-tags {
47
- padding: 0;
48
- margin-bottom: 0;
49
- }
50
- .cucumber-react .cucumber-tags .cucumber-tag {
51
- display: inline;
52
- list-style-type: none;
53
- padding: 4px 8px 4px 8px;
54
- margin-right: 6px;
55
- background-color: #FFFFFF;
56
- border-radius: 6px;
57
- }
58
- .cucumber-react .cucumber-feature__icon {
59
- padding-top: 0.35em;
60
- padding-right: 0.5em;
61
- }
62
- .cucumber-react .cucumber-description,
63
- .cucumber-react .cucumber-children {
64
- margin-left: 1em;
65
- }
66
- .cucumber-react .cucumber-feature,
67
- .cucumber-react .cucumber-rule,
68
- .cucumber-react .cucumber-scenario,
69
- .cucumber-react .cucumber-background {
70
- margin-bottom: 1em;
71
- }
72
- .cucumber-react .cucumber-steps {
73
- list-style-type: none;
74
- padding-left: 10px;
75
- }
76
- .cucumber-react .cucumber-steps .cucumber-step {
77
- display: flex;
78
- }
79
- .cucumber-react .cucumber-steps .cucumber-step__status {
80
- padding-top: 0.2em;
81
- padding-right: 0.5em;
82
- }
83
- .cucumber-react .cucumber-steps .cucumber-step__content {
84
- flex-grow: 1;
85
- max-width: calc(100% - 1.5em);
86
- }
87
- .cucumber-react .cucumber-steps .cucumber-step__keyword {
88
- font-weight: bold;
89
- }
90
- .cucumber-react .cucumber-steps .cucumber-step__text {
91
- font-weight: normal;
92
- }
93
- .cucumber-react .cucumber-steps .cucumber-step__param {
94
- font-weight: normal;
95
- font-style: italic;
96
- }
97
- .cucumber-react .cucumber-table {
98
- border-collapse: collapse;
99
- margin-top: 0.5em;
100
- margin-bottom: 0.5em;
101
- }
102
- .cucumber-react .cucumber-table__header-cell {
103
- border: 1px solid #4B5662;
104
- padding: 0.3em;
105
- }
106
- .cucumber-react .cucumber-table__cell {
107
- border: 1px solid #4B5662;
108
- padding: 0.3em;
109
- }
110
- .cucumber-react .cucumber-table__cell__status {
111
- padding: 0.5em 3px 3px 3px;
112
- }
113
- .cucumber-react .cucumber-table__cell__step {
114
- flex-grow: 1;
115
- }
116
- .cucumber-react .cucumber-code {
117
- padding: 0.25em;
118
- background-color: #ebebeb;
119
- }
120
- .cucumber-react .cucumber-error {
121
- padding: 0.5em;
122
- margin: 0;
123
- overflow-x: auto;
124
- }
125
- .cucumber-react .cucumber-no-documents {
126
- font: 14px "Open Sans", sans-serif;
127
- }
128
- .cucumber-react .cucumber-attachment__icon {
129
- margin-right: 0.5em;
130
- }
131
- .cucumber-react .cucumber-attachment__image {
132
- max-width: 100%;
133
- margin-top: 1em;
134
- }
135
- .cucumber-react .cucumber-attachment__text {
136
- background-color: #ebebeb;
137
- padding: 0.5em;
138
- overflow-x: auto;
139
- }
140
- .cucumber-react .cucumber-anchor {
141
- position: relative;
142
- display: flex;
143
- align-items: center;
144
- margin-top: 0.3em;
145
- }
146
- .cucumber-react .cucumber-anchor__link {
147
- opacity: 0;
148
- transition: all 0.35s ease-in-out;
149
- position: absolute;
150
- left: -20px;
151
- display: flex;
152
- align-items: center;
153
- }
154
- .cucumber-react .cucumber-anchor__icon {
155
- margin-right: 0.5em;
156
- }
157
- .cucumber-react .cucumber-anchor:hover a {
158
- opacity: 1;
159
- width: max-content;
160
- transition: all 0.35s ease-in-out;
161
- }
162
- .cucumber-react .cucumber-anchor > * {
163
- height: 100%;
164
- margin-top: 0px;
165
- }
166
-
167
- .cucumber-report-header {
168
- width: 100%;
169
- display: grid;
170
- grid-template-columns: 1fr;
171
- border: 1px solid rgba(0, 0, 0, 0.1);
172
- font: 11px "Open Sans", sans-serif;
173
- margin-bottom: 1em;
174
- }
175
- .cucumber-report-header > * {
176
- padding: 1em;
177
- }
178
- .cucumber-report-header .cucumber-status-filter {
179
- border-bottom: 1px solid rgba(0, 0, 0, 0.1);
180
- }
181
- .cucumber-report-header .cucumber-status-filter table {
182
- width: 100%;
183
- }
184
- .cucumber-report-header .cucumber-execution-data {
185
- border-bottom: 1px solid rgba(0, 0, 0, 0.1);
186
- }
187
- .cucumber-report-header .cucumber-search-bar {
188
- border-right: 0;
189
- }
190
- .cucumber-report-header .cucumber-search-bar form.cucumber-search-bar-search {
191
- width: 100%;
192
- display: grid;
193
- grid-template-columns: 9fr 1fr;
194
- }
195
- .cucumber-report-header .cucumber-search-bar form.cucumber-search-bar-search input {
196
- padding: 0.4em;
197
- border-radius: 0;
198
- }
199
- .cucumber-report-header .cucumber-search-bar form.cucumber-search-bar-search button {
200
- height: 2.2em;
201
- padding-left: 0.6em;
202
- padding-right: 0.6em;
203
- }
204
- .cucumber-report-header .cucumber-search-bar p.help {
205
- font-size: 80%;
206
- }
207
- .cucumber-report-header .cucumber-search-bar form.cucumber-search-bar-filter ul {
208
- display: inline;
209
- }
210
- .cucumber-report-header .cucumber-search-bar form.cucumber-search-bar-filter ul li {
211
- list-style-type: none;
212
- display: inline-block;
213
- }
214
- .cucumber-report-header .cucumber-search-bar form.cucumber-search-bar-filter ul li input {
215
- display: inline-block;
216
- width: auto;
217
- height: 0.6em;
218
- }
219
- .cucumber-report-header .cucumber-search-bar form.cucumber-search-bar-filter ul li label {
220
- padding-right: 1em;
221
- }
222
-
223
- @media only screen and (min-width: 600px) {
224
- .cucumber-report-header {
225
- grid-template-columns: 1fr 1fr;
226
- }
227
- .cucumber-report-header .cucumber-status-filter {
228
- border-right: 1px solid rgba(0, 0, 0, 0.1);
229
- }
230
- .cucumber-report-header .cucumber-search-bar {
231
- grid-column: 1/-1;
232
- }
233
- }
234
- @media only screen and (min-width: 992px) {
235
- .cucumber-report-header {
236
- grid-template-columns: 1fr 1fr 2fr;
237
- }
238
- .cucumber-report-header .cucumber-status-filter {
239
- border-bottom: 0;
240
- }
241
- .cucumber-report-header .cucumber-execution-data {
242
- border-right: 1px solid rgba(0, 0, 0, 0.1);
243
- border-bottom: 0;
244
- }
245
- .cucumber-report-header .cucumber-search-bar {
246
- grid-column: auto;
247
- }
248
- }
249
- .accordion {
250
- border: 1px solid rgba(0, 0, 0, 0.1);
251
- border-radius: 2px;
252
- }
253
-
254
- .accordion__item + .accordion__item {
255
- border-top: 1px solid rgba(0, 0, 0, 0.1);
256
- }
257
-
258
- .accordion__button {
259
- background-color: #f4f4f4;
260
- color: #444;
261
- cursor: pointer;
262
- padding: 10px;
263
- width: 100%;
264
- text-align: left;
265
- border: none;
266
- }
267
-
268
- .accordion__button:hover {
269
- background-color: #ddd;
270
- }
271
-
272
- .accordion__button:before {
273
- display: inline-block;
274
- content: '';
275
- height: 10px;
276
- width: 10px;
277
- margin-right: 12px;
278
- border-bottom: 2px solid currentColor;
279
- border-right: 2px solid currentColor;
280
- transform: rotate(-45deg);
281
- }
282
-
283
- .accordion__button[aria-expanded='true']::before,
284
- .accordion__button[aria-selected='true']::before {
285
- transform: rotate(45deg);
286
- }
287
-
288
- .accordion__panel {
289
- padding: 20px;
290
- animation: fadein 0.35s ease-in;
291
- }