Skip to content

Commit 4bc420b

Browse files
authored
fix: revert types resolution from @jest/globals (#604)
1 parent 130c640 commit 4bc420b

File tree

14 files changed

+402
-288
lines changed

14 files changed

+402
-288
lines changed

README.md

Lines changed: 333 additions & 191 deletions
Large diffs are not rendered by default.

packages/expect-puppeteer/README.md

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Modify your Jest configuration:
2424

2525
Writing integration test is very hard, especially when you are testing a Single Page Applications. Data are loaded asynchronously and it is difficult to know exactly when an element will be displayed in the page.
2626

27-
[Puppeteer API](https://pptr.dev/api) is great, but it is low level and not designed for integration testing.
27+
[Puppeteer API](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md) is great, but it is low level and not designed for integration testing.
2828

2929
This API is designed for integration testing:
3030

@@ -81,11 +81,11 @@ await expect(page).toMatchElement("div.inner", { text: "some text" });
8181

8282
Expect an element to be in the page or element, then click on it.
8383

84-
- `instance` <[Page]|[Frame]|[ElementHandle]> Context
84+
- `instance` <[Page]|[ElementHandle]> Context
8585
- `selector` <[string]|[MatchSelector](#MatchSelector)> A [selector] or a [MatchSelector](#MatchSelector) to click on.
8686
- `options` <[Object]> Optional parameters
8787
- `button` <"left"|"right"|"middle"> Defaults to `left`.
88-
- `count` <[number]> defaults to 1. See [UIEvent.detail].
88+
- `clickCount` <[number]> defaults to 1. See [UIEvent.detail].
8989
- `delay` <[number]> Time to wait between `mousedown` and `mouseup` in milliseconds. Defaults to 0.
9090
- `text` <[string]|[RegExp]> A text or a RegExp to match in element `textContent`.
9191

@@ -111,8 +111,8 @@ const dialog = await expect(page).toDisplayDialog(async () => {
111111

112112
Expect a control to be in the page or element, then fill it with text.
113113

114-
- `instance` <[Page]|[Frame]|[ElementHandle]> Context
115-
- `selector` <[string]|[MatchSelector](#MatchSelector)> A [selector] or a [MatchSelector](#MatchSelector) to match field
114+
- `instance` <[Page]|[ElementHandle]> Context
115+
- `selector` <[string]> A [selector] to match field
116116
- `value` <[string]> Value to fill
117117
- `options` <[Object]> Optional parameters
118118
- `delay` <[number]> delay to pass to [the puppeteer `element.type` API](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#elementhandletypetext-options)
@@ -125,8 +125,8 @@ await expect(page).toFill('input[name="firstName"]', "James");
125125

126126
Expect a form to be in the page or element, then fill its controls.
127127

128-
- `instance` <[Page]|[Frame]|[ElementHandle]> Context
129-
- `selector` <[string]|[MatchSelector](#MatchSelector)> A [selector] or a [MatchSelector](#MatchSelector) to match form
128+
- `instance` <[Page]|[ElementHandle]> Context
129+
- `selector` <[string]> A [selector] to match form
130130
- `values` <[Object]> Values to fill
131131
- `options` <[Object]> Optional parameters
132132
- `delay` <[number]> delay to pass to [the puppeteer `element.type` API](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#elementhandletypetext-options)
@@ -142,7 +142,7 @@ await expect(page).toFillForm('form[name="myForm"]', {
142142

143143
Expect a text or a string RegExp to be present in the page or element.
144144

145-
- `instance` <[Page]|[Frame]|[ElementHandle]> Context
145+
- `instance` <[Page]|[ElementHandle]> Context
146146
- `matcher` <[string]|[RegExp]> A text or a RegExp to match in page
147147
- `options` <[Object]> Optional parameters
148148
- `polling` <[string]|[number]> An interval at which the `pageFunction` is executed, defaults to `raf`. If `polling` is a number, then it is treated as an interval in milliseconds at which the function would be executed. If `polling` is a string, then it can be one of the following values:
@@ -162,8 +162,8 @@ await expect(page).toMatchTextContent(/lo.*/);
162162

163163
Expect an element be present in the page or element.
164164

165-
- `instance` <[Page]|[Frame]|[ElementHandle]> Context
166-
- `selector` <[string]|[MatchSelector](#MatchSelector)> A [selector] or a [MatchSelector](#MatchSelector) to match element
165+
- `instance` <[Page]|[ElementHandle]> Context
166+
- `selector` <[string]> A [selector] to match element
167167
- `options` <[Object]> Optional parameters
168168
- `polling` <[string]|[number]> An interval at which the `pageFunction` is executed, defaults to `raf`. If `polling` is a number, then it is treated as an interval in milliseconds at which the function would be executed. If `polling` is a string, then it can be one of the following values:
169169
- `raf` - to constantly execute `pageFunction` in `requestAnimationFrame` callback. This is the tightest polling mode which is suitable to observe styling changes.
@@ -183,8 +183,8 @@ await expect(row).toClick("td:nth-child(3) a");
183183

184184
Expect a select control to be present in the page or element, then select the specified option.
185185

186-
- `instance` <[Page]|[Frame]|[ElementHandle]> Context
187-
- `selector` <[string]|[MatchSelector](#MatchSelector)> A [selector] or a [MatchSelector](#MatchSelector) to match select [element]
186+
- `instance` <[Page]|[ElementHandle]> Context
187+
- `selector` <[string]> A [selector] to match select [element]
188188
- `valueOrText` <[string]> Value or text matching option
189189

190190
```js
@@ -195,9 +195,9 @@ await expect(page).toSelect('select[name="choices"]', "Choice 1");
195195

196196
Expect a input file control to be present in the page or element, then fill it with a local file.
197197

198-
- `instance` <[Page]|[Frame]|[ElementHandle]> Context
199-
- `selector` <[string]|[MatchSelector](#MatchSelector)> A [selector] or a [MatchSelector](#MatchSelector) to match input [element]
200-
- `filePath` <[string]|[Array]<[string]>> A file path or array of file paths
198+
- `instance` <[Page]|[ElementHandle]> Context
199+
- `selector` <[string]> A [selector] to match input [element]
200+
- `filePath` <[string]> A file path
201201

202202
```js
203203
import { join } from "node:path";
@@ -208,7 +208,7 @@ await expect(page).toUploadFile(
208208
);
209209
```
210210

211-
### <a name="MatchSelector"></a>Match Selector
211+
### <a name="MatchSelector"></a>{type: [string], value: [string]}
212212

213213
An object used as parameter in order to select an element.
214214

@@ -242,7 +242,6 @@ setDefaultOptions({ timeout: 1000 });
242242
[element]: https://developer.mozilla.org/en-US/docs/Web/API/element "Element"
243243
[map]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map "Map"
244244
[selector]: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors "selector"
245-
[page]: https://pptr.dev/api/puppeteer.page "Page"
246-
[frame]: https://pptr.dev/api/puppeteer.frame "Frame"
247-
[elementhandle]: https://pptr.dev/api/puppeteer.elementhandle/ "ElementHandle"
245+
[page]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-page "Page"
246+
[elementhandle]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-elementhandle "ElementHandle"
248247
[uievent.detail]: https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail

packages/expect-puppeteer/src/index.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { getDefaultOptions, setDefaultOptions } from "expect-puppeteer";
22

33
// import globals
44
import "jest-puppeteer";
5+
import "expect-puppeteer";
56

67
expect.addSnapshotSerializer({
78
print: () => "hello",

packages/expect-puppeteer/src/index.ts

Lines changed: 41 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ type Wrapper<T> = T extends (
4444
? (...args: A) => R
4545
: never;
4646

47-
// declare common matchers list
48-
type InstanceMatchers<T> = T extends PuppeteerInstance
47+
// declare matchers list
48+
type PuppeteerMatchers<T> = T extends PuppeteerInstance
4949
? {
5050
// common
5151
toClick: Wrapper<typeof toClick>;
@@ -64,24 +64,24 @@ type InstanceMatchers<T> = T extends PuppeteerInstance
6464
: never;
6565

6666
// declare page matchers list
67-
interface PageMatchers extends InstanceMatchers<Page> {
67+
interface PageMatchers extends PuppeteerMatchers<Page> {
6868
// instance specific
6969
toDisplayDialog: Wrapper<typeof toDisplayDialog>;
7070
// inverse matchers
71-
not: InstanceMatchers<Page>[`not`] & {};
71+
not: PuppeteerMatchers<Page>[`not`] & {};
7272
}
7373

7474
// declare frame matchers list
75-
interface FrameMatchers extends InstanceMatchers<Frame> {
75+
interface FrameMatchers extends PuppeteerMatchers<Frame> {
7676
// inverse matchers
77-
not: InstanceMatchers<Frame>[`not`] & {};
77+
not: PuppeteerMatchers<Frame>[`not`] & {};
7878
}
7979

8080
// declare element matchers list
8181
interface ElementHandleMatchers
82-
extends InstanceMatchers<ElementHandle<Element>> {
82+
extends PuppeteerMatchers<ElementHandle<Element>> {
8383
// inverse matchers
84-
not: InstanceMatchers<ElementHandle<Element>>[`not`] & {};
84+
not: PuppeteerMatchers<ElementHandle<Element>>[`not`] & {};
8585
}
8686

8787
// declare matchers per instance type
@@ -103,50 +103,43 @@ type GlobalWithExpect = typeof globalThis & { expect: PuppeteerExpect };
103103

104104
// ---------------------------
105105

106-
// not possible to use PMatchersPerType directly ...
107-
interface PuppeteerMatchers<T> {
108-
// common
109-
toClick: T extends PuppeteerInstance ? Wrapper<typeof toClick> : never;
110-
toFill: T extends PuppeteerInstance ? Wrapper<typeof toFill> : never;
111-
toFillForm: T extends PuppeteerInstance ? Wrapper<typeof toFillForm> : never;
112-
toMatchTextContent: T extends PuppeteerInstance
113-
? Wrapper<typeof toMatchTextContent>
114-
: never;
115-
toMatchElement: T extends PuppeteerInstance
116-
? Wrapper<typeof toMatchElement>
117-
: never;
118-
toSelect: T extends PuppeteerInstance ? Wrapper<typeof toSelect> : never;
119-
toUploadFile: T extends PuppeteerInstance
120-
? Wrapper<typeof toUploadFile>
121-
: never;
122-
// page
123-
toDisplayDialog: T extends Page ? Wrapper<typeof toDisplayDialog> : never;
124-
// inverse matchers
125-
not: {
126-
toMatchTextContent: T extends PuppeteerInstance
127-
? Wrapper<typeof notToMatchTextContent>
128-
: never;
129-
toMatchElement: T extends PuppeteerInstance
130-
? Wrapper<typeof notToMatchElement>
131-
: never;
132-
};
133-
}
134-
135-
// support for @types/jest
106+
// extend global jest object
136107
declare global {
137108
// eslint-disable-next-line @typescript-eslint/no-namespace
138109
namespace jest {
139-
// eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-unused-vars
140-
interface Matchers<R, T> extends PuppeteerMatchers<T> {}
110+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
111+
interface Matchers<R, T> {
112+
// common
113+
toClick: T extends PuppeteerInstance ? Wrapper<typeof toClick> : never;
114+
toFill: T extends PuppeteerInstance ? Wrapper<typeof toFill> : never;
115+
toFillForm: T extends PuppeteerInstance
116+
? Wrapper<typeof toFillForm>
117+
: never;
118+
toMatchTextContent: T extends PuppeteerInstance
119+
? Wrapper<typeof toMatchTextContent>
120+
: never;
121+
toMatchElement: T extends PuppeteerInstance
122+
? Wrapper<typeof toMatchElement>
123+
: never;
124+
toSelect: T extends PuppeteerInstance ? Wrapper<typeof toSelect> : never;
125+
toUploadFile: T extends PuppeteerInstance
126+
? Wrapper<typeof toUploadFile>
127+
: never;
128+
// page
129+
toDisplayDialog: T extends Page ? Wrapper<typeof toDisplayDialog> : never;
130+
// inverse matchers
131+
not: {
132+
toMatchTextContent: T extends PuppeteerInstance
133+
? Wrapper<typeof notToMatchTextContent>
134+
: never;
135+
toMatchElement: T extends PuppeteerInstance
136+
? Wrapper<typeof notToMatchElement>
137+
: never;
138+
};
139+
}
141140
}
142141
}
143142

144-
// support for @jest/types
145-
declare module "@jest/expect" {
146-
// eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-unused-vars
147-
interface Matchers<R, T> extends PuppeteerMatchers<T> {}
148-
}
149-
150143
// ---------------------------
151144
// @ts-expect-error global node object w/ initial jest expect prop attached
152145
const jestExpect = global.expect as JestExpect;
@@ -158,7 +151,7 @@ const wrapMatcher = <T extends PuppeteerInstance>(
158151
instance: T,
159152
) =>
160153
async function throwingMatcher(...args: unknown[]): Promise<unknown> {
161-
// update the assertions counter
154+
// ???
162155
jestExpect.getState().assertionCalls += 1;
163156
try {
164157
// run async matcher
@@ -183,9 +176,7 @@ const puppeteerExpect = <T extends PuppeteerInstance>(instance: T) => {
183176
];
184177

185178
if (!isPage && !isFrame && !isHandle)
186-
throw new Error(
187-
`${String(instance?.constructor?.name ?? `current instance`)} is not supported`,
188-
);
179+
throw new Error(`${instance} is not supported`);
189180

190181
// retrieve matchers
191182
const expectation = {

packages/expect-puppeteer/src/matchers/toClick.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export async function toClick(
99
selector: Selector | string,
1010
options: ToClickOptions = {},
1111
) {
12-
const { delay, button, count, offset, ...otherOptions } = options;
12+
const { delay, button, clickCount, offset, ...otherOptions } = options;
1313
const element = await toMatchElement(instance, selector, otherOptions);
14-
await element.click({ delay, button, count, offset });
14+
await element.click({ delay, button, clickCount, offset });
1515
}

packages/jest-environment-puppeteer/CHANGELOG.md

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,6 @@
33
All notable changes to this project will be documented in this file.
44
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
55

6-
## [10.1.3](https://github.com/argos-ci/jest-puppeteer/compare/v10.1.2...v10.1.3) (2024-10-22)
7-
8-
9-
### Bug Fixes
10-
11-
* fix types resolution when importing jest types from @jest/globals ([#602](https://github.com/argos-ci/jest-puppeteer/issues/602)) ([e5b2e1a](https://github.com/argos-ci/jest-puppeteer/commit/e5b2e1a7c0282aba496ffe2806201778b84a96fc))
12-
13-
14-
15-
16-
176
## [10.1.2](https://github.com/argos-ci/jest-puppeteer/compare/v10.1.1...v10.1.2) (2024-10-10)
187

198

packages/jest-environment-puppeteer/README.md

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,6 @@ describe("Google", () => {
3737
});
3838
```
3939

40-
## Use with TypeScript
41-
42-
_Note : If you have upgraded to version v10.1.2 or above, we strongly recommend that you uninstall the community provided types :_
43-
44-
```bash
45-
npm uninstall --save-dev @types/jest-environment-puppeteer @types/expect-puppeteer
46-
```
47-
48-
If using TypeScript, jest-puppeteer has to be explicitly imported in order to expose the global API :
49-
50-
```ts
51-
// import jest-puppeteer globals
52-
import "jest-puppeteer";
53-
```
54-
5540
## API
5641

5742
### `global.browser`

packages/jest-environment-puppeteer/tests/basic.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// import globals
22
import "jest-puppeteer";
3+
import "expect-puppeteer";
34

45
describe("Basic", () => {
56
beforeAll(async () => {

packages/jest-environment-puppeteer/tests/browserContext-1.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// import globals
22
import "jest-puppeteer";
3+
import "expect-puppeteer";
34

45
describe("browserContext", () => {
56
const test = process.env.INCOGNITO ? it : it.skip;

packages/jest-environment-puppeteer/tests/browserContext-2.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// import globals
22
import "jest-puppeteer";
3+
import "expect-puppeteer";
34

45
describe("browserContext", () => {
56
const test = process.env.INCOGNITO ? it : it.skip;

0 commit comments

Comments
 (0)