@serenity-js/playwright-test 3.36.2 → 3.37.1

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/CHANGELOG.md CHANGED
@@ -3,6 +3,27 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [3.37.1](https://github.com/serenity-js/serenity-js/compare/v3.37.0...v3.37.1) (2025-12-16)
7
+
8
+ **Note:** Version bump only for package @serenity-js/playwright-test
9
+
10
+
11
+
12
+
13
+
14
+ # [3.37.0](https://github.com/serenity-js/serenity-js/compare/v3.36.2...v3.37.0) (2025-12-02)
15
+
16
+
17
+ ### Features
18
+
19
+ * **playwright-test:** introduced axios fixture ([a836746](https://github.com/serenity-js/serenity-js/commit/a83674697531622d522c6924db2875188efcc834))
20
+ * **playwright-test:** support for providing extraAbilities without overriding the actors ([5e189ca](https://github.com/serenity-js/serenity-js/commit/5e189caa4f4a0f38287f8586f21d8106c7c7dab3))
21
+ * **playwright-test:** useBase supports merging multiple base fixtures ([e37ed77](https://github.com/serenity-js/serenity-js/commit/e37ed77ae2cc8c18349096cc82668cf522d2e7f1))
22
+
23
+
24
+
25
+
26
+
6
27
  ## [3.36.2](https://github.com/serenity-js/serenity-js/compare/v3.36.1...v3.36.2) (2025-11-26)
7
28
 
8
29
 
package/README.md CHANGED
@@ -1,36 +1,33 @@
1
- # Serenity/JS
1
+ # Serenity/JS Playwright Test
2
+
3
+ [![NPM Version](https://badge.fury.io/js/%40serenity-js%2Fplaywright-test.svg)](https://badge.fury.io/js/%40serenity-js%2Fplaywright-test)
4
+ [![Build Status](https://github.com/serenity-js/serenity-js/actions/workflows/main.yaml/badge.svg?branch=main)](https://github.com/serenity-js/serenity-js/actions)
5
+ [![Maintainability](https://qlty.sh/gh/serenity-js/projects/serenity-js/maintainability.svg)](https://qlty.sh/gh/serenity-js/projects/serenity-js)
6
+ [![Code Coverage](https://qlty.sh/gh/serenity-js/projects/serenity-js/coverage.svg)](https://qlty.sh/gh/serenity-js/projects/serenity-js)
7
+ [![Contributors](https://img.shields.io/github/contributors/serenity-js/serenity-js.svg)](https://github.com/serenity-js/serenity-js/graphs/contributors)
8
+ [![Known Vulnerabilities](https://snyk.io/test/npm/@serenity-js/playwright-test/badge.svg)](https://snyk.io/test/npm/@serenity-js/playwright-test)
9
+ [![GitHub stars](https://img.shields.io/github/stars/serenity-js/serenity-js?style=flat)](https://github.com/serenity-js/serenity-js)
2
10
 
3
11
  [![Follow Serenity/JS on LinkedIn](https://img.shields.io/badge/Follow-Serenity%2FJS%20-0077B5?logo=linkedin)](https://www.linkedin.com/company/serenity-js)
4
12
  [![Watch Serenity/JS on YouTube](https://img.shields.io/badge/Watch-@serenity--js-E62117?logo=youtube)](https://www.youtube.com/@serenity-js)
5
13
  [![Join Serenity/JS Community Chat](https://img.shields.io/badge/Chat-Serenity%2FJS%20Community-FBD30B?logo=matrix)](https://matrix.to/#/#serenity-js:gitter.im)
6
14
  [![Support Serenity/JS on GitHub](https://img.shields.io/badge/Support-@serenity--js-703EC8?logo=github)](https://github.com/sponsors/serenity-js)
7
15
 
8
- [Serenity/JS](https://serenity-js.org) is an innovative open-source framework designed to make acceptance and regression testing
9
- of complex software systems faster, more collaborative and easier to scale.
10
-
11
- ⭐️ Get started with Serenity/JS!
12
- - [Serenity/JS web testing tutorial](https://serenity-js.org/handbook/web-testing/your-first-web-scenario)
13
- - [Serenity/JS + Playwright Test deep dive](https://serenity-js.org/handbook/test-runners/playwright-test/)
14
- - [Serenity/JS Handbook](https://serenity-js.org/handbook)
15
- - [API documentation](https://serenity-js.org/api/)
16
- - [Serenity/JS Project Templates](https://serenity-js.org/handbook/project-templates/)
16
+ [`@serenity-js/playwright-test`](https://serenity-js.org/api/playwright-test/) brings full [Serenity reporting](https://serenity-js.org/handbook/reporting/) capabilities to [Playwright Test](https://playwright.dev/docs/intro) and provides fixtures that enable writing tests using the [Screenplay Pattern](https://serenity-js.org/handbook/design/screenplay-pattern/).
17
17
 
18
- 👋 Join the Serenity/JS Community!
19
- - Meet other Serenity/JS developers and maintainers on the [Serenity/JS Community chat channel](https://matrix.to/#/#serenity-js:gitter.im),
20
- - Find answers to your Serenity/JS questions on the [Serenity/JS Forum](https://github.com/orgs/serenity-js/discussions/categories/how-do-i),
21
- - Learn how to [contribute to Serenity/JS](https://serenity-js.org/community/contributing/),
22
- - Support the project and gain access to [Serenity/JS Playbooks](https://github.com/serenity-js/playbooks) by becoming a [Serenity/JS GitHub Sponsor](https://github.com/sponsors/serenity-js)!
18
+ Learn more about using [Serenity/JS with Playwright Test](https://serenity-js.org/handbook/test-runners/playwright-test/)
23
19
 
24
- ## Serenity/JS Playwright Test
20
+ ## Features
25
21
 
26
- [`@serenity-js/playwright-test`](https://serenity-js.org/api/playwright-test/) module offers a Serenity/JS reporter
27
- and fixtures that integrate [Playwright Test](https://playwright.dev/docs/intro) with Serenity/JS Screenplay Pattern APIs.
22
+ - Integrates Serenity/JS with Playwright Test using dedicated test fixtures
23
+ - Supports testing websites, web apps, and HTTP APIs
24
+ - Enables [Screenplay Pattern](https://serenity-js.org/handbook/design/screenplay-pattern/) APIs in Playwright Test scenarios
25
+ - Supports all [Serenity/JS reporting features](https://serenity-js.org/handbook/reporting/) and expands native Playwright Test reports
26
+ - TypeScript-first design with strong typing for safer and more predictable test code.
28
27
 
29
- Learn more about using [Serenity/JS with Playwright Test](https://serenity-js.org/handbook/test-runners/playwright-test/)
28
+ ## Installation
30
29
 
31
- ### Installation
32
-
33
- To install this module, use an existing [Playwright Test project](https://playwright.dev/docs/intro) or generate a new one by running:
30
+ Use an existing [Playwright Test project](https://playwright.dev/docs/intro) or generate a new one by running:
34
31
 
35
32
  ```sh
36
33
  npm init playwright@latest
@@ -39,20 +36,43 @@ npm init playwright@latest
39
36
  Install the below Serenity/JS modules in your Playwright Test project directory:
40
37
 
41
38
  ```sh
42
- npm install --save-dev @serenity-js/assertions @serenity-js/console-reporter @serenity-js/core @serenity-js/serenity-bdd @serenity-js/web @serenity-js/playwright @serenity-js/playwright-test
39
+ npm install --save-dev @serenity-js/assertions @serenity-js/console-reporter @serenity-js/core @serenity-js/rest @serenity-js/serenity-bdd @serenity-js/web @serenity-js/playwright @serenity-js/playwright-test
40
+ ```
41
+
42
+ See the [Serenity/JS Installation Guide](https://serenity-js.org/handbook/installation/).
43
+
44
+ ## Quick Start
45
+
46
+ ```ts
47
+ import { describe, it } from '@serenity-js/playwright-test'
48
+ import { Navigate, Page } from '@serenity-js/web'
49
+ import { Ensure, startsWith } from '@serenity-js/assertions'
50
+
51
+ describe('Website', () => {
52
+
53
+ it('should have a title', async ({ actor }) => {
54
+
55
+ await actor.attemptsTo(
56
+ Navigate.to('https://serenity-js.org/'),
57
+ Ensure.that(Page.current().title(), startsWith('Serenity/JS')),
58
+ )
59
+ })
60
+ })
43
61
  ```
44
62
 
45
- ### Serenity/JS Playwright Fixtures
63
+ Explore the in-depth Serenity/JS and Playwright Test integration guide in the [Serenity/JS Handbook](https://serenity-js.org/handbook/test-runners/playwright-test/).
64
+
65
+ ## Serenity/JS Playwright Fixtures
46
66
 
47
67
  To use Serenity/JS Screenplay Pattern APIs and benefit from the in-depth reporting capabilities,
48
- import Serenity/JS test fixtures instead of the default ones:
68
+ import Serenity/JS `test` fixtures instead of the default ones:
49
69
 
50
70
  ```diff
51
- // example.spec.ts
71
+ // todo_app.spec.ts
52
72
  + import { test } from '@serenity-js/playwright-test'
53
73
  - import { test } from '@playwright/test'
54
74
 
55
- test.describe('Serenity Screenplay with Playwright', () => {
75
+ test.describe('To-do app', () => {
56
76
 
57
77
  test.describe('New Todo', () => {
58
78
 
@@ -66,14 +86,14 @@ test.describe('Serenity Screenplay with Playwright', () => {
66
86
  If you prefer, Serenity/JS also offers the more concise BDD-style `describe/it` syntax:
67
87
 
68
88
  ```typescript
69
- // example.spec.ts
89
+ // todo_app.spec.ts
70
90
  import { describe, it, test } from '@serenity-js/playwright-test'
71
91
 
72
92
  test.use({
73
93
  headless: true,
74
94
  })
75
95
 
76
- describe('Serenity Screenplay with Playwright', () => {
96
+ describe('To-do app', () => {
77
97
 
78
98
  describe('New Todo', () => {
79
99
 
@@ -84,28 +104,32 @@ describe('Serenity Screenplay with Playwright', () => {
84
104
  })
85
105
  ```
86
106
 
87
- ### Serenity/JS Screenplay Pattern Actors
107
+ ## Serenity/JS Screenplay Pattern Actors
88
108
 
89
- Serenity/JS test fixtures simplify how you instantiate and use [Serenity/JS Screenplay Pattern Actors](https://serenity-js.org/api/core/class/Actor/).
109
+ Serenity/JS test fixtures simplify how you manage the [actors](https://serenity-js.org/api/core/class/Actor/).
90
110
 
91
- #### Single-actor scenarios
111
+ ### Single-actor scenarios
92
112
 
93
113
  If your tests need only a single actor, you can inject it using the `actor` fixture.
94
114
  To configure the name of your default actor, use the `defaultActorName` configuration property:
95
115
 
96
116
  ```typescript
97
- // example.spec.ts
117
+ // todo_app.spec.ts
98
118
 
99
- import { describe, it, test } from '@serenity-js/playwright-test' // import fixtures
100
- import { Navigate, Page } from '@serenity-js/playwright' // import Screenplay Pattern web APIs
101
- import { Ensure, equals } from '@serenity-js/assertions' // import Screenplay Pattern assertion APIs
119
+ // import fixtures
120
+ import { describe, it, test } from '@serenity-js/playwright-test'
121
+ // import Screenplay Pattern web APIs
122
+ import { Navigate, Page } from '@serenity-js/web'
123
+ // import Screenplay Pattern assertion APIs
124
+ import { Ensure, equals } from '@serenity-js/assertions'
102
125
 
103
126
  test.use({
104
127
  headless: true,
105
- defaultActorName: 'Serena' // change default actor name
128
+ // change default actor name
129
+ defaultActorName: 'Serena'
106
130
  })
107
131
 
108
- describe('Serenity Screenplay with Playwright', () => {
132
+ describe('To-do app', () => {
109
133
 
110
134
  describe('New Todo', () => {
111
135
 
@@ -122,118 +146,60 @@ describe('Serenity Screenplay with Playwright', () => {
122
146
  })
123
147
  ```
124
148
 
125
- #### Multi-actor scenarios
149
+ ### Multi-actor scenarios
126
150
 
127
- For multi-actor scenarios where you need each actor to use a separate browser, use the `actorCalled` fixture.
128
- You can also use this pattern to override the default actor name on a per-scenario basis:
151
+ For multi-actor scenarios, for example where you need each actor to use a separate browser,
152
+ use the `actorCalled` fixture.
129
153
 
130
154
  ```typescript
131
- // example.spec.ts
155
+ // todo_app.spec.ts
132
156
 
133
157
  import { describe, it, test } from '@serenity-js/playwright-test' // import fixtures
134
158
 
135
- describe('Serenity Screenplay with Playwright', () => {
159
+ test.use({
160
+ // change default actor name
161
+ defaultActorName: 'Alice'
162
+ })
163
+
164
+ describe('To-do app', () => {
136
165
 
137
166
  describe('Chat app', () => {
138
167
 
139
- it('should allow actors to send and receive messages', async ({ actorCalled }) => {
168
+ it('should allow actors to send and receive messages', async ({ actor, actorCalled, browser }) => {
140
169
 
141
- // define part of the workflow performed by the first actor:
142
- await actorCalled('Alice').attemptsTo(
143
- // navigate to a chat app
144
- // post a message to Bob
145
- )
146
-
147
- // define parts of the workflow performed by the any other actors:
148
- await actorCalled('Bob').attemptsTo(
149
- // navigate to a chat app
150
- // post a reply to Alice
170
+ // Define part of the workflow performed by the default actor:
171
+ await actor.attemptsTo(
172
+ // Navigate to a chat app...
173
+ // Post a message to Bob...
151
174
  )
152
175
 
176
+ // Fefine parts of the workflow performed by the any other actors.
153
177
  // Note that invoking actorCalled(name) multiple times
154
178
  // while using the same name and within the scope of a single test
155
179
  // returns the same actor, so you don't need to cache them:
156
- await actorCalled('Alice').attemptsTo(
157
- // check if the reply from Bob is received
180
+ await actorCalled('Bob')
181
+ // The second actor can use a separate browser instance
182
+ .whoCan(BrowseTheWebWithPlaywright.using(browser))
183
+ .attemptsTo(
184
+ // Navigate to a chat app...
185
+ // Post a reply to Alice...
186
+ )
187
+
188
+
189
+ await actor.attemptsTo(
190
+ // Check if the reply from Bob is received
158
191
  )
159
192
  })
160
193
  })
161
194
  })
162
195
  ```
163
196
 
164
- #### Customising Actors
165
-
166
- The default [cast](https://serenity-js.org/api/core/class/Cast) of actors is limited to using a single ability
167
- to [`BrowseTheWebWithPlaywright`](https://serenity-js.org/api/playwright/class/BrowseTheWebWithPlaywright).
168
-
169
- If you'd like to give your actors additional abilities, like to [`TakeNotes`](https://serenity-js.org/api/core/class/TakeNotes),
170
- [`CallAnApi`](https://serenity-js.org/api/rest/class/CallAnApi),
171
- or [`ManageALocalServer`](https://serenity-js.org/api/local-server/class/ManageALocalServer), you can install the relevant Serenity/JS module
172
- and configure them as follows:
173
-
174
- ```typescript
175
- // example.spec.ts
176
-
177
- import { Cast, TakeNotes } from '@serenity-js/core'
178
- import { test } from '@serenity-js/playwright-test'
179
- import { BrowseTheWebWithPlaywright } from '@serenity-js/playwright'
180
- import { CallAnApi } from '@serenity-js/rest'
181
-
182
- test.use({
183
- actors: async ({ browser, baseURL }, use) => {
184
- await use(
185
- Cast.where(actor => actor.whoCan(
186
- BrowseTheWebWithPlaywright.using(browser),
187
- TakeNotes.usingAnEmptyNotepad(),
188
- CallAnApi.at(baseURL),
189
- ))
190
- )
191
- },
192
- })
193
- ```
194
-
195
- For scenarios where different actors need to be configured differently, you can also implement your own `Cast`:
197
+ To learn more about customising actors and managing their abilities, see the [Serenity/JS Handbook section on Playwright Test customisation](https://serenity-js.org/handbook/test-runners/playwright-test/#modifying-default-abilities).
196
198
 
197
- ```typescript
198
- // example.spec.ts
199
-
200
- import { Cast } from '@serenity-js/core'
201
- import { BrowseTheWebWithPlaywright, ExtraBrowserContextOptions } from '@serenity-js/playwright'
202
- import { test } from '@serenity-js/playwright-test'
203
- import { CallAnApi } from '@serenity-js/rest'
204
- import { Browser, BrowserContextOptions } from 'playwright'
205
-
206
- class Actors implements Cast {
207
- constructor(
208
- private readonly browser: Browser,
209
- private readonly contextOptions: BrowserContextOptions,
210
- private readonly extraContextOptions: ExtraBrowserContextOptions,
211
- ) {
212
- }
199
+ ### Customising test fixtures
213
200
 
214
- prepare(actor: Actor) {
215
- switch (actor.name) {
216
- case 'James':
217
- return actor.whoCan(BrowseTheWebWithPlaywright.using(this.browser, this.contextOptions, this.extraContextOptions))
218
- default:
219
- return actor.whoCan(CallAnApi.at(this.contextOptions.baseURL))
220
- }
221
- }
222
- }
223
-
224
- test.use({
225
- actors: async ({ browser, config }) => {
226
- await use(new Actors(browser, {
227
- defaultNavigationWaitUntil: 'domcontentloaded'
228
- }))
229
- }
230
- })
231
- ```
232
-
233
- #### Customising test fixtures
234
-
235
- [`useFixtures`](https://serenity-js.org/api/playwright-test/function/useFixtures/) lets you configure
236
- Serenity/JS Screenplay Pattern actors in a single place,
201
+ The [`useFixtures`](https://serenity-js.org/api/playwright-test/function/useFixtures/) function
202
+ lets you configure your actors in a single place,
237
203
  and define custom [test fixtures](https://playwright.dev/docs/test-fixtures) if needed.
238
204
 
239
205
  ```typescript
@@ -260,15 +226,16 @@ export const {
260
226
  })
261
227
  ```
262
228
 
263
- With the custom test API definition in place, use it in your test files instead of the default one:
229
+ Next, use your custom test API definition in your test files:
264
230
 
265
231
  ```typescript
266
- // example.spec.ts
232
+ // todo_app.spec.ts
267
233
  import { Log } from '@serenity-js/core'
268
234
 
269
- import { describe, it, test } from './my-custom-api' // Note the custom test API
235
+ // Import describe/it/test from your custom API
236
+ import { describe, it, test } from './my-custom-api'
270
237
 
271
- describe('Serenity Screenplay with Playwright', () => {
238
+ describe('To-do app', () => {
272
239
 
273
240
  describe('New Todo', () => {
274
241
 
@@ -284,7 +251,7 @@ describe('Serenity Screenplay with Playwright', () => {
284
251
  })
285
252
  ```
286
253
 
287
- ### UI Component Testing
254
+ ## UI Component Testing
288
255
 
289
256
  You can use Serenity/JS and Playwright Test to write UI component tests and **reuse your test code** between component and end-to-end test suites.
290
257
 
@@ -310,14 +277,14 @@ test('should work', async ({ mount }) => {
310
277
  })
311
278
  ```
312
279
 
313
- #### Using Serenity/JS Screenplay Pattern Actors for Component Testing
280
+ ### Using Serenity/JS actors for Component Testing
314
281
 
315
282
  Serenity/JS [`useBase(test)`](https://serenity-js.org/api/playwright-test/function/useBase/) creates
316
283
  a test API that gives you access to all the [`SerenityFixtures`](https://serenity-js.org/api/playwright-test/interface/SerenityFixtures/)
317
284
  you could access in any other regular end-to-end test.
318
285
 
319
- This capability allows you to use [Serenity/JS Actors](https://serenity-js.org/api/core/class/Actor/) and design
320
- and experiment with your [Screenplay Pattern Tasks](https://serenity-js.org/api/core/class/Task/)
286
+ This capability allows you to use [Serenity/JS actors](https://serenity-js.org/api/core/class/Actor/) and design
287
+ and experiment with your [tasks](https://serenity-js.org/api/core/class/Task/)
321
288
  before incorporating them in your high-level acceptance and end-to-end tests.
322
289
 
323
290
  ```tsx
@@ -349,7 +316,9 @@ describe('EmailInput', () => {
349
316
  })
350
317
  ```
351
318
 
352
- ### Serenity Reports
319
+ Explore the in-depth Serenity/JS and Playwright Test integration guide in the [Serenity/JS Handbook](https://serenity-js.org/handbook/test-runners/playwright-test/).
320
+
321
+ ## Reporting
353
322
 
354
323
  To use Serenity/JS reporting capabilities, register the `@serenity-js/playwright-test` reporter in your
355
324
  `playwright.config.ts` and define the appropriate reporting services (a.k.a. your "stage crew").
@@ -364,11 +333,12 @@ npm install --save-dev @serenity-js/console-reporter @serenity-js/serenity-bdd
364
333
  Next, configure your Playwright project as follows:
365
334
 
366
335
  ```typescript
367
- // playwright.conf.ts
336
+ // playwright.config.ts
368
337
 
369
- import type { PlaywrightTestConfig } from '@playwright/test'
338
+ import { defineConfig } from '@playwright/test';
339
+ import { SerenityFixtures, SerenityWorkerFixtures } from '@serenity-js/playwright-test';
370
340
 
371
- const config: PlaywrightTestConfig = {
341
+ export default defineConfig<SerenityFixtures, SerenityWorkerFixtures>({
372
342
  testDir: './spec',
373
343
 
374
344
  reporter: [
@@ -387,32 +357,45 @@ const config: PlaywrightTestConfig = {
387
357
 
388
358
  // Other configuration omitted for brevity
389
359
  // For details, see https://playwright.dev/docs/test-configuration
390
- }
391
-
392
- export default config
360
+ })
393
361
  ```
394
362
 
395
- Note that Serenity/JS reporters work well with the built-in [Playwright reporters](https://playwright.dev/docs/test-reporters).
363
+ Serenity/JS reporters work well with native [Playwright reporters](https://playwright.dev/docs/test-reporters).
396
364
 
397
- ### Reference implementation
365
+ ## Documentation
398
366
 
399
- You can find a reference implementation demonstrating how to integrate Serenity/JS with Playwright Test in the [Serenity/JS
400
- GitHub repository](https://github.com/serenity-js/serenity-js/tree/main/examples/playwright-test-todomvc).
367
+ - [API Reference](https://serenity-js.org/api/)
368
+ - [Screenplay Pattern Guide](https://serenity-js.org/handbook/design/screenplay-pattern/)
369
+ - [Serenity/JS Project Templates](https://serenity-js.org/handbook/project-templates/)
370
+ - [More examples and reference implementations](https://github.com/serenity-js/serenity-js/tree/main/examples)
371
+ - [Tutorial: First Web Scenario](https://serenity-js.org/handbook/tutorials/your-first-web-scenario/)
372
+ - [Tutorial: First API Scenario](https://serenity-js.org/handbook/tutorials/your-first-api-scenario/)
401
373
 
402
- ## 📣 Stay up to date
374
+ ## Contributing
403
375
 
404
- New features, tutorials, and demos are coming soon!
405
- Follow [Serenity/JS on LinkedIn](https://www.linkedin.com/company/serenity-js),
406
- subscribe to [Serenity/JS channel on YouTube](https://www.youtube.com/@serenity-js) and join the [Serenity/JS Community Chat](https://matrix.to/#/#serenity-js:gitter.im) to stay up to date!
407
- Please also make sure to star ⭐️ [Serenity/JS on GitHub](https://github.com/serenity-js/serenity-js) to help others discover the framework!
376
+ Contributions of all kinds are welcome! Get started with the [Contributing Guide](https://serenity-js.org/community/contributing/).
408
377
 
409
- [![Follow Serenity/JS on LinkedIn](https://img.shields.io/badge/Follow-Serenity%2FJS%20-0077B5?logo=linkedin)](https://www.linkedin.com/company/serenity-js)
410
- [![Watch Serenity/JS on YouTube](https://img.shields.io/badge/Watch-@serenity--js-E62117?logo=youtube)](https://www.youtube.com/@serenity-js)
411
- [![Join Serenity/JS Community Chat](https://img.shields.io/badge/Chat-Serenity%2FJS%20Community-FBD30B?logo=matrix)](https://matrix.to/#/#serenity-js:gitter.im)
412
- [![GitHub stars](https://img.shields.io/github/stars/serenity-js/serenity-js?label=Serenity%2FJS&logo=github&style=badge)](https://github.com/serenity-js/serenity-js)
378
+ ## Community
379
+
380
+ - [Community Chat](https://matrix.to/#/#serenity-js:gitter.im)
381
+ - [Discussions Forum](https://github.com/orgs/serenity-js/discussions)
382
+ - Visit the [💡How to... ?](https://github.com/orgs/serenity-js/discussions/categories/how-to) section for answers to common questions
383
+
384
+ If you enjoy using Serenity/JS, make sure to star ⭐️ [Serenity/JS on GitHub](https://github.com/serenity-js/serenity-js) to help others discover the framework!
385
+
386
+ ## License
413
387
 
414
- ## 💛 Support Serenity/JS
388
+ The Serenity/JS code base is licensed under the [Apache-2.0](https://opensource.org/license/apache-2-0) license,
389
+ while its documentation and the [Serenity/JS Handbook](https://serenity-js.org/handbook/) are licensed under the [Creative Commons BY-NC-SA 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/).
415
390
 
416
- If you appreciate all the effort that goes into making sophisticated tools easy to work with, please support our work and become a Serenity/JS GitHub Sponsor today!
391
+ See the [Serenity/JS License](https://serenity-js.org/legal/license/).
392
+
393
+ ## Support
394
+
395
+ Support ongoing development through [GitHub Sponsors](https://github.com/sponsors/serenity-js). Sponsors gain access to [Serenity/JS Playbooks](https://github.com/serenity-js/playbooks)
396
+ and priority help in the [Discussions Forum](https://github.com/orgs/serenity-js/discussions).
397
+
398
+ For corporate sponsorship or commercial support, please contact [Jan Molak](https://www.linkedin.com/in/janmolak/).
417
399
 
418
400
  [![GitHub Sponsors](https://img.shields.io/badge/Support%20@serenity%2FJS-703EC8?style=for-the-badge&logo=github&logoColor=white)](https://github.com/sponsors/serenity-js)
401
+