cypress 10.3.1 → 10.4.0
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/exec/open.js +6 -0
- package/mount-utils/CHANGELOG.md +0 -1
- package/mount-utils/README.md +7 -0
- package/package.json +10 -5
- package/react/CHANGELOG.md +0 -19
- package/react/README.md +28 -323
- package/react/dist/createMount.d.ts +30 -0
- package/react/dist/cypress-react.cjs.js +59 -78
- package/react/dist/cypress-react.esm-bundler.js +51 -74
- package/react/dist/getDisplayName.d.ts +1 -1
- package/react/dist/index.d.ts +2 -0
- package/react/dist/mount.d.ts +5 -141
- package/react/dist/types.d.ts +50 -0
- package/react/package.json +1 -5
- package/react18/dist/cypress-react.cjs.js +422 -0
- package/react18/dist/cypress-react.esm-bundler.js +394 -0
- package/react18/dist/index.d.ts +5 -0
- package/react18/package.json +59 -0
- package/types/cypress.d.ts +9 -0
- package/types/index.d.ts +1 -1
- package/types/{net-stubbing.ts → net-stubbing.d.ts} +0 -0
- package/vue/CHANGELOG.md +2 -17
- package/vue/README.md +17 -608
- package/vue/dist/@vue/test-utils/baseWrapper.d.ts +3 -1
- package/vue/dist/@vue/test-utils/config.d.ts +4 -2
- package/vue/dist/@vue/test-utils/emit.d.ts +1 -0
- package/vue/dist/@vue/test-utils/index.d.ts +2 -1
- package/vue/dist/@vue/test-utils/interfaces/wrapperLike.d.ts +2 -2
- package/vue/dist/@vue/test-utils/mount.d.ts +2 -0
- package/vue/dist/@vue/test-utils/stubs.d.ts +2 -6
- package/vue/dist/@vue/test-utils/types.d.ts +1 -1
- package/vue/dist/@vue/test-utils/vueWrapper.d.ts +2 -1
- package/vue/dist/cypress-vue.cjs.js +5379 -5090
- package/vue/dist/cypress-vue.esm-bundler.js +5380 -5091
- package/vue/dist/index.d.ts +1 -0
- package/vue/package.json +2 -2
- package/vue2/README.md +11 -627
- package/vue2/dist/cypress-vue2.browser.js +251 -260
- package/vue2/dist/cypress-vue2.cjs.js +250 -259
- package/vue2/dist/cypress-vue2.esm-bundler.js +248 -257
- package/react/dist/cypress-react.browser.js +0 -512
@@ -12,6 +12,8 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
12
12
|
var React = require('react');
|
13
13
|
var ReactDOM = require('react-dom');
|
14
14
|
|
15
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
16
|
+
|
15
17
|
function _interopNamespace(e) {
|
16
18
|
if (e && e.__esModule) return e;
|
17
19
|
var n = Object.create(null);
|
@@ -31,7 +33,7 @@ function _interopNamespace(e) {
|
|
31
33
|
}
|
32
34
|
|
33
35
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
34
|
-
var
|
36
|
+
var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
|
35
37
|
|
36
38
|
/******************************************************************************
|
37
39
|
Copyright (c) Microsoft Corporation.
|
@@ -255,37 +257,21 @@ var injectStyles = function (options) {
|
|
255
257
|
return injectStylesBeforeElement(options, document, el);
|
256
258
|
};
|
257
259
|
};
|
260
|
+
exports.lastMountedReactDom = void 0;
|
258
261
|
/**
|
259
|
-
*
|
260
|
-
*
|
261
|
-
*
|
262
|
-
*
|
263
|
-
*
|
264
|
-
*
|
265
|
-
*
|
266
|
-
* @example
|
267
|
-
```
|
268
|
-
import Hello from './hello.jsx'
|
269
|
-
import { mount } from '@cypress/react'
|
270
|
-
it('works', () => {
|
271
|
-
mount(<Hello onClick={cy.stub()} />)
|
272
|
-
// use Cypress commands
|
273
|
-
cy.contains('Hello').click()
|
274
|
-
})
|
275
|
-
```
|
276
|
-
**/
|
277
|
-
var mount = function (jsx, options) {
|
278
|
-
if (options === void 0) { options = {}; }
|
279
|
-
return _mount('mount', jsx, options);
|
280
|
-
};
|
281
|
-
var lastMountedReactDom;
|
282
|
-
/**
|
283
|
-
* @see `mount`
|
284
|
-
* @param type The type of mount executed
|
285
|
-
* @param rerenderKey If specified, use the provided key rather than generating a new one
|
262
|
+
* Create an `mount` function. Performs all the non-React-version specific
|
263
|
+
* behavior related to mounting. The React-version-specific code
|
264
|
+
* is injected. This helps us to maintain a consistent public API
|
265
|
+
* and handle breaking changes in React's rendering API.
|
266
|
+
*
|
267
|
+
* This is designed to be consumed by `npm/react{16,17,18}`, and other React adapters,
|
268
|
+
* or people writing adapters for third-party, custom adapters.
|
286
269
|
*/
|
287
|
-
var
|
270
|
+
var makeMountFn = function (type, jsx, options, rerenderKey, internalMountOptions) {
|
288
271
|
if (options === void 0) { options = {}; }
|
272
|
+
if (!internalMountOptions) {
|
273
|
+
throw Error('internalMountOptions must be provided with `render` and `reactDom` parameters');
|
274
|
+
}
|
289
275
|
// Get the display name property via the component constructor
|
290
276
|
// @ts-ignore FIXME
|
291
277
|
var componentName = getDisplayName(jsx.type, options.alias);
|
@@ -298,8 +284,8 @@ var _mount = function (type, jsx, options, rerenderKey) {
|
|
298
284
|
.then(injectStyles(options))
|
299
285
|
.then(function () {
|
300
286
|
var _a, _b, _c;
|
301
|
-
var reactDomToUse =
|
302
|
-
lastMountedReactDom = reactDomToUse;
|
287
|
+
var reactDomToUse = internalMountOptions.reactDom;
|
288
|
+
exports.lastMountedReactDom = reactDomToUse;
|
303
289
|
var el = getContainerEl();
|
304
290
|
if (!el) {
|
305
291
|
throw new Error([
|
@@ -316,7 +302,7 @@ var _mount = function (type, jsx, options, rerenderKey) {
|
|
316
302
|
// since we always surround the component with a fragment
|
317
303
|
// let's get back the original component
|
318
304
|
var userComponent = reactComponent.props.children;
|
319
|
-
|
305
|
+
internalMountOptions.render(reactComponent, el, reactDomToUse);
|
320
306
|
if (options.log !== false) {
|
321
307
|
Cypress.log({
|
322
308
|
name: type,
|
@@ -341,8 +327,8 @@ var _mount = function (type, jsx, options, rerenderKey) {
|
|
341
327
|
.then(function () {
|
342
328
|
return cy.wrap({
|
343
329
|
component: userComponent,
|
344
|
-
rerender: function (newComponent) { return
|
345
|
-
unmount:
|
330
|
+
rerender: function (newComponent) { return makeMountFn('rerender', newComponent, options, key, internalMountOptions); },
|
331
|
+
unmount: internalMountOptions.unmount,
|
346
332
|
}, { log: false });
|
347
333
|
})
|
348
334
|
// by waiting, we delaying test execution for the next tick of event loop
|
@@ -353,32 +339,19 @@ var _mount = function (type, jsx, options, rerenderKey) {
|
|
353
339
|
});
|
354
340
|
};
|
355
341
|
/**
|
356
|
-
*
|
357
|
-
*
|
358
|
-
*
|
359
|
-
*
|
360
|
-
*
|
361
|
-
```
|
362
|
-
import { mount, unmount } from '@cypress/react'
|
363
|
-
it('works', () => {
|
364
|
-
mount(...)
|
365
|
-
// interact with the component using Cypress commands
|
366
|
-
// whenever you want to unmount
|
367
|
-
unmount()
|
368
|
-
})
|
369
|
-
```
|
342
|
+
* Create an `unmount` function. Performs all the non-React-version specific
|
343
|
+
* behavior related to unmounting.
|
344
|
+
*
|
345
|
+
* This is designed to be consumed by `npm/react{16,17,18}`, and other React adapters,
|
346
|
+
* or people writing adapters for third-party, custom adapters.
|
370
347
|
*/
|
371
|
-
|
372
|
-
var unmount = function (options) {
|
373
|
-
if (options === void 0) { options = { log: true }; }
|
374
|
-
return _unmount(options);
|
375
|
-
};
|
376
|
-
var _unmount = function (options) {
|
348
|
+
var makeUnmountFn = function (options, internalUnmountOptions) {
|
377
349
|
return cy.then(function () {
|
378
350
|
return cy.get(ROOT_SELECTOR, { log: false }).then(function ($el) {
|
379
351
|
var _a;
|
380
|
-
if (lastMountedReactDom) {
|
381
|
-
|
352
|
+
if (exports.lastMountedReactDom) {
|
353
|
+
internalUnmountOptions.unmount($el[0]);
|
354
|
+
var wasUnmounted = internalUnmountOptions.unmount($el[0]);
|
382
355
|
if (wasUnmounted && options.log) {
|
383
356
|
Cypress.log({
|
384
357
|
name: 'unmount',
|
@@ -402,32 +375,17 @@ var _unmount = function (options) {
|
|
402
375
|
// we are not in the context of a test
|
403
376
|
var preMountCleanup = function () {
|
404
377
|
var el = getContainerEl();
|
405
|
-
if (el && lastMountedReactDom) {
|
406
|
-
lastMountedReactDom.unmountComponentAtNode(el);
|
378
|
+
if (el && exports.lastMountedReactDom) {
|
379
|
+
exports.lastMountedReactDom.unmountComponentAtNode(el);
|
407
380
|
}
|
408
381
|
};
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
* @returns new instance of `mount` with assigned options
|
414
|
-
* @example
|
415
|
-
* ```
|
416
|
-
* import Hello from './hello.jsx'
|
417
|
-
* import { createMount } from '@cypress/react'
|
418
|
-
*
|
419
|
-
* const mount = createMount({ strict: true, cssFile: 'path/to/any/css/file.css' })
|
420
|
-
*
|
421
|
-
* it('works', () => {
|
422
|
-
* mount(<Hello />)
|
423
|
-
* // use Cypress commands
|
424
|
-
* cy.get('button').should('have.css', 'color', 'rgb(124, 12, 109)')
|
425
|
-
* })
|
426
|
-
```
|
427
|
-
**/
|
382
|
+
var _mount = function (jsx, options) {
|
383
|
+
if (options === void 0) { options = {}; }
|
384
|
+
return makeMountFn('mount', jsx, options);
|
385
|
+
};
|
428
386
|
var createMount = function (defaultOptions) {
|
429
387
|
return function (element, options) {
|
430
|
-
return
|
388
|
+
return _mount(element, __assign(__assign({}, defaultOptions), options));
|
431
389
|
};
|
432
390
|
};
|
433
391
|
// Side effects from "import { mount } from '@cypress/<my-framework>'" are annoying, we should avoid doing this
|
@@ -443,6 +401,27 @@ var createMount = function (defaultOptions) {
|
|
443
401
|
// @see npm/react/cypress/component/advanced/set-timeout-example/loading-indicator-spec.js
|
444
402
|
setupHooks(preMountCleanup);
|
445
403
|
|
404
|
+
function mount(jsx, options, rerenderKey) {
|
405
|
+
if (options === void 0) { options = {}; }
|
406
|
+
var internalOptions = {
|
407
|
+
reactDom: ReactDOM__default["default"],
|
408
|
+
render: function (reactComponent, el, reactDomToUse) {
|
409
|
+
return (reactDomToUse || ReactDOM__default["default"]).render(reactComponent, el);
|
410
|
+
},
|
411
|
+
unmount: unmount,
|
412
|
+
};
|
413
|
+
return makeMountFn('mount', jsx, __assign({ ReactDom: ReactDOM__default["default"] }, options), rerenderKey, internalOptions);
|
414
|
+
}
|
415
|
+
function unmount(options) {
|
416
|
+
if (options === void 0) { options = { log: true }; }
|
417
|
+
var internalOptions = {
|
418
|
+
unmount: function (el) {
|
419
|
+
return (exports.lastMountedReactDom || ReactDOM__default["default"]).unmountComponentAtNode(el);
|
420
|
+
},
|
421
|
+
};
|
422
|
+
return makeUnmountFn(options, internalOptions);
|
423
|
+
}
|
424
|
+
|
446
425
|
// mounting hooks inside a test component mostly copied from
|
447
426
|
// https://github.com/testing-library/react-hooks-testing-library/blob/master/src/pure.js
|
448
427
|
function resultContainer() {
|
@@ -505,6 +484,8 @@ var mountHook = function (hookFn) {
|
|
505
484
|
};
|
506
485
|
|
507
486
|
exports.createMount = createMount;
|
487
|
+
exports.makeMountFn = makeMountFn;
|
488
|
+
exports.makeUnmountFn = makeUnmountFn;
|
508
489
|
exports.mount = mount;
|
509
490
|
exports.mountHook = mountHook;
|
510
491
|
exports.unmount = unmount;
|
@@ -6,7 +6,7 @@
|
|
6
6
|
*/
|
7
7
|
|
8
8
|
import * as React from 'react';
|
9
|
-
import
|
9
|
+
import ReactDOM from 'react-dom';
|
10
10
|
|
11
11
|
/******************************************************************************
|
12
12
|
Copyright (c) Microsoft Corporation.
|
@@ -230,37 +230,21 @@ var injectStyles = function (options) {
|
|
230
230
|
return injectStylesBeforeElement(options, document, el);
|
231
231
|
};
|
232
232
|
};
|
233
|
-
/**
|
234
|
-
* Mount a React component in a blank document; register it as an alias
|
235
|
-
* To access: use an alias or original component reference
|
236
|
-
* @function mount
|
237
|
-
* @param {React.ReactElement} jsx - component to mount
|
238
|
-
* @param {MountOptions} [options] - options, like alias, styles
|
239
|
-
* @see https://github.com/bahmutov/@cypress/react
|
240
|
-
* @see https://glebbahmutov.com/blog/my-vision-for-component-tests/
|
241
|
-
* @example
|
242
|
-
```
|
243
|
-
import Hello from './hello.jsx'
|
244
|
-
import { mount } from '@cypress/react'
|
245
|
-
it('works', () => {
|
246
|
-
mount(<Hello onClick={cy.stub()} />)
|
247
|
-
// use Cypress commands
|
248
|
-
cy.contains('Hello').click()
|
249
|
-
})
|
250
|
-
```
|
251
|
-
**/
|
252
|
-
var mount = function (jsx, options) {
|
253
|
-
if (options === void 0) { options = {}; }
|
254
|
-
return _mount('mount', jsx, options);
|
255
|
-
};
|
256
233
|
var lastMountedReactDom;
|
257
234
|
/**
|
258
|
-
*
|
259
|
-
*
|
260
|
-
*
|
235
|
+
* Create an `mount` function. Performs all the non-React-version specific
|
236
|
+
* behavior related to mounting. The React-version-specific code
|
237
|
+
* is injected. This helps us to maintain a consistent public API
|
238
|
+
* and handle breaking changes in React's rendering API.
|
239
|
+
*
|
240
|
+
* This is designed to be consumed by `npm/react{16,17,18}`, and other React adapters,
|
241
|
+
* or people writing adapters for third-party, custom adapters.
|
261
242
|
*/
|
262
|
-
var
|
243
|
+
var makeMountFn = function (type, jsx, options, rerenderKey, internalMountOptions) {
|
263
244
|
if (options === void 0) { options = {}; }
|
245
|
+
if (!internalMountOptions) {
|
246
|
+
throw Error('internalMountOptions must be provided with `render` and `reactDom` parameters');
|
247
|
+
}
|
264
248
|
// Get the display name property via the component constructor
|
265
249
|
// @ts-ignore FIXME
|
266
250
|
var componentName = getDisplayName(jsx.type, options.alias);
|
@@ -273,7 +257,7 @@ var _mount = function (type, jsx, options, rerenderKey) {
|
|
273
257
|
.then(injectStyles(options))
|
274
258
|
.then(function () {
|
275
259
|
var _a, _b, _c;
|
276
|
-
var reactDomToUse =
|
260
|
+
var reactDomToUse = internalMountOptions.reactDom;
|
277
261
|
lastMountedReactDom = reactDomToUse;
|
278
262
|
var el = getContainerEl();
|
279
263
|
if (!el) {
|
@@ -291,7 +275,7 @@ var _mount = function (type, jsx, options, rerenderKey) {
|
|
291
275
|
// since we always surround the component with a fragment
|
292
276
|
// let's get back the original component
|
293
277
|
var userComponent = reactComponent.props.children;
|
294
|
-
|
278
|
+
internalMountOptions.render(reactComponent, el, reactDomToUse);
|
295
279
|
if (options.log !== false) {
|
296
280
|
Cypress.log({
|
297
281
|
name: type,
|
@@ -316,8 +300,8 @@ var _mount = function (type, jsx, options, rerenderKey) {
|
|
316
300
|
.then(function () {
|
317
301
|
return cy.wrap({
|
318
302
|
component: userComponent,
|
319
|
-
rerender: function (newComponent) { return
|
320
|
-
unmount:
|
303
|
+
rerender: function (newComponent) { return makeMountFn('rerender', newComponent, options, key, internalMountOptions); },
|
304
|
+
unmount: internalMountOptions.unmount,
|
321
305
|
}, { log: false });
|
322
306
|
})
|
323
307
|
// by waiting, we delaying test execution for the next tick of event loop
|
@@ -328,32 +312,19 @@ var _mount = function (type, jsx, options, rerenderKey) {
|
|
328
312
|
});
|
329
313
|
};
|
330
314
|
/**
|
331
|
-
*
|
332
|
-
*
|
333
|
-
*
|
334
|
-
*
|
335
|
-
*
|
336
|
-
```
|
337
|
-
import { mount, unmount } from '@cypress/react'
|
338
|
-
it('works', () => {
|
339
|
-
mount(...)
|
340
|
-
// interact with the component using Cypress commands
|
341
|
-
// whenever you want to unmount
|
342
|
-
unmount()
|
343
|
-
})
|
344
|
-
```
|
315
|
+
* Create an `unmount` function. Performs all the non-React-version specific
|
316
|
+
* behavior related to unmounting.
|
317
|
+
*
|
318
|
+
* This is designed to be consumed by `npm/react{16,17,18}`, and other React adapters,
|
319
|
+
* or people writing adapters for third-party, custom adapters.
|
345
320
|
*/
|
346
|
-
|
347
|
-
var unmount = function (options) {
|
348
|
-
if (options === void 0) { options = { log: true }; }
|
349
|
-
return _unmount(options);
|
350
|
-
};
|
351
|
-
var _unmount = function (options) {
|
321
|
+
var makeUnmountFn = function (options, internalUnmountOptions) {
|
352
322
|
return cy.then(function () {
|
353
323
|
return cy.get(ROOT_SELECTOR, { log: false }).then(function ($el) {
|
354
324
|
var _a;
|
355
325
|
if (lastMountedReactDom) {
|
356
|
-
|
326
|
+
internalUnmountOptions.unmount($el[0]);
|
327
|
+
var wasUnmounted = internalUnmountOptions.unmount($el[0]);
|
357
328
|
if (wasUnmounted && options.log) {
|
358
329
|
Cypress.log({
|
359
330
|
name: 'unmount',
|
@@ -381,28 +352,13 @@ var preMountCleanup = function () {
|
|
381
352
|
lastMountedReactDom.unmountComponentAtNode(el);
|
382
353
|
}
|
383
354
|
};
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
* @returns new instance of `mount` with assigned options
|
389
|
-
* @example
|
390
|
-
* ```
|
391
|
-
* import Hello from './hello.jsx'
|
392
|
-
* import { createMount } from '@cypress/react'
|
393
|
-
*
|
394
|
-
* const mount = createMount({ strict: true, cssFile: 'path/to/any/css/file.css' })
|
395
|
-
*
|
396
|
-
* it('works', () => {
|
397
|
-
* mount(<Hello />)
|
398
|
-
* // use Cypress commands
|
399
|
-
* cy.get('button').should('have.css', 'color', 'rgb(124, 12, 109)')
|
400
|
-
* })
|
401
|
-
```
|
402
|
-
**/
|
355
|
+
var _mount = function (jsx, options) {
|
356
|
+
if (options === void 0) { options = {}; }
|
357
|
+
return makeMountFn('mount', jsx, options);
|
358
|
+
};
|
403
359
|
var createMount = function (defaultOptions) {
|
404
360
|
return function (element, options) {
|
405
|
-
return
|
361
|
+
return _mount(element, __assign(__assign({}, defaultOptions), options));
|
406
362
|
};
|
407
363
|
};
|
408
364
|
// Side effects from "import { mount } from '@cypress/<my-framework>'" are annoying, we should avoid doing this
|
@@ -418,6 +374,27 @@ var createMount = function (defaultOptions) {
|
|
418
374
|
// @see npm/react/cypress/component/advanced/set-timeout-example/loading-indicator-spec.js
|
419
375
|
setupHooks(preMountCleanup);
|
420
376
|
|
377
|
+
function mount(jsx, options, rerenderKey) {
|
378
|
+
if (options === void 0) { options = {}; }
|
379
|
+
var internalOptions = {
|
380
|
+
reactDom: ReactDOM,
|
381
|
+
render: function (reactComponent, el, reactDomToUse) {
|
382
|
+
return (reactDomToUse || ReactDOM).render(reactComponent, el);
|
383
|
+
},
|
384
|
+
unmount: unmount,
|
385
|
+
};
|
386
|
+
return makeMountFn('mount', jsx, __assign({ ReactDom: ReactDOM }, options), rerenderKey, internalOptions);
|
387
|
+
}
|
388
|
+
function unmount(options) {
|
389
|
+
if (options === void 0) { options = { log: true }; }
|
390
|
+
var internalOptions = {
|
391
|
+
unmount: function (el) {
|
392
|
+
return (lastMountedReactDom || ReactDOM).unmountComponentAtNode(el);
|
393
|
+
},
|
394
|
+
};
|
395
|
+
return makeUnmountFn(options, internalOptions);
|
396
|
+
}
|
397
|
+
|
421
398
|
// mounting hooks inside a test component mostly copied from
|
422
399
|
// https://github.com/testing-library/react-hooks-testing-library/blob/master/src/pure.js
|
423
400
|
function resultContainer() {
|
@@ -479,4 +456,4 @@ var mountHook = function (hookFn) {
|
|
479
456
|
return mount(componentTest).then(function () { return result; });
|
480
457
|
};
|
481
458
|
|
482
|
-
export { createMount, mount, mountHook, unmount };
|
459
|
+
export { createMount, lastMountedReactDom, makeMountFn, makeUnmountFn, mount, mountHook, unmount };
|
package/react/dist/index.d.ts
CHANGED
package/react/dist/mount.d.ts
CHANGED
@@ -1,143 +1,7 @@
|
|
1
1
|
/// <reference types="cypress" />
|
2
|
-
import
|
3
|
-
import
|
4
|
-
|
5
|
-
|
6
|
-
* Mount a React component in a blank document; register it as an alias
|
7
|
-
* To access: use an alias or original component reference
|
8
|
-
* @function mount
|
9
|
-
* @param {React.ReactElement} jsx - component to mount
|
10
|
-
* @param {MountOptions} [options] - options, like alias, styles
|
11
|
-
* @see https://github.com/bahmutov/@cypress/react
|
12
|
-
* @see https://glebbahmutov.com/blog/my-vision-for-component-tests/
|
13
|
-
* @example
|
14
|
-
```
|
15
|
-
import Hello from './hello.jsx'
|
16
|
-
import { mount } from '@cypress/react'
|
17
|
-
it('works', () => {
|
18
|
-
mount(<Hello onClick={cy.stub()} />)
|
19
|
-
// use Cypress commands
|
20
|
-
cy.contains('Hello').click()
|
21
|
-
})
|
22
|
-
```
|
23
|
-
**/
|
24
|
-
export declare const mount: (jsx: React.ReactNode, options?: MountOptions) => globalThis.Cypress.Chainable<MountReturn>;
|
25
|
-
/**
|
26
|
-
* Removes the mounted component. Notice this command automatically
|
27
|
-
* queues up the `unmount` into Cypress chain, thus you don't need `.then`
|
28
|
-
* to call it.
|
29
|
-
* @see https://github.com/cypress-io/cypress/tree/develop/npm/react/cypress/component/basic/unmount
|
30
|
-
* @example
|
31
|
-
```
|
32
|
-
import { mount, unmount } from '@cypress/react'
|
33
|
-
it('works', () => {
|
34
|
-
mount(...)
|
35
|
-
// interact with the component using Cypress commands
|
36
|
-
// whenever you want to unmount
|
37
|
-
unmount()
|
38
|
-
})
|
39
|
-
```
|
40
|
-
*/
|
41
|
-
export declare const unmount: (options?: {
|
2
|
+
import React from 'react';
|
3
|
+
import type { MountOptions } from './types';
|
4
|
+
export declare function mount(jsx: React.ReactNode, options?: MountOptions, rerenderKey?: string): Cypress.Chainable<import("./types").MountReturn>;
|
5
|
+
export declare function unmount(options?: {
|
42
6
|
log: boolean;
|
43
|
-
})
|
44
|
-
/**
|
45
|
-
* Creates new instance of `mount` function with default options
|
46
|
-
* @function createMount
|
47
|
-
* @param {MountOptions} [defaultOptions] - defaultOptions for returned `mount` function
|
48
|
-
* @returns new instance of `mount` with assigned options
|
49
|
-
* @example
|
50
|
-
* ```
|
51
|
-
* import Hello from './hello.jsx'
|
52
|
-
* import { createMount } from '@cypress/react'
|
53
|
-
*
|
54
|
-
* const mount = createMount({ strict: true, cssFile: 'path/to/any/css/file.css' })
|
55
|
-
*
|
56
|
-
* it('works', () => {
|
57
|
-
* mount(<Hello />)
|
58
|
-
* // use Cypress commands
|
59
|
-
* cy.get('button').should('have.css', 'color', 'rgb(124, 12, 109)')
|
60
|
-
* })
|
61
|
-
```
|
62
|
-
**/
|
63
|
-
export declare const createMount: (defaultOptions: MountOptions) => (element: React.ReactElement, options?: Partial<StyleOptions & MountReactComponentOptions> | undefined) => globalThis.Cypress.Chainable<MountReturn>;
|
64
|
-
/** @deprecated Should be removed in the next major version */
|
65
|
-
export default mount;
|
66
|
-
export interface ReactModule {
|
67
|
-
name: string;
|
68
|
-
type: string;
|
69
|
-
location: string;
|
70
|
-
source: string;
|
71
|
-
}
|
72
|
-
export interface MountReactComponentOptions {
|
73
|
-
alias: string;
|
74
|
-
ReactDom: typeof ReactDOM;
|
75
|
-
/**
|
76
|
-
* Log the mounting command into Cypress Command Log,
|
77
|
-
* true by default.
|
78
|
-
*/
|
79
|
-
log: boolean;
|
80
|
-
/**
|
81
|
-
* Render component in React [strict mode](https://reactjs.org/docs/strict-mode.html)
|
82
|
-
* It activates additional checks and warnings for child components.
|
83
|
-
*/
|
84
|
-
strict: boolean;
|
85
|
-
}
|
86
|
-
export declare type MountOptions = Partial<StyleOptions & MountReactComponentOptions>;
|
87
|
-
export interface MountReturn {
|
88
|
-
/**
|
89
|
-
* The component that was rendered.
|
90
|
-
*/
|
91
|
-
component: React.ReactNode;
|
92
|
-
/**
|
93
|
-
* Rerenders the specified component with new props. This allows testing of components that store state (`setState`)
|
94
|
-
* or have asynchronous updates (`useEffect`, `useLayoutEffect`).
|
95
|
-
*/
|
96
|
-
rerender: (component: React.ReactNode) => globalThis.Cypress.Chainable<MountReturn>;
|
97
|
-
/**
|
98
|
-
* Removes the mounted component.
|
99
|
-
* @see `unmount`
|
100
|
-
*/
|
101
|
-
unmount: () => globalThis.Cypress.Chainable<JQuery<HTMLElement>>;
|
102
|
-
}
|
103
|
-
/**
|
104
|
-
* The `type` property from the transpiled JSX object.
|
105
|
-
* @example
|
106
|
-
* const { type } = React.createElement('div', null, 'Hello')
|
107
|
-
* const { type } = <div>Hello</div>
|
108
|
-
*/
|
109
|
-
export interface JSX extends Function {
|
110
|
-
displayName: string;
|
111
|
-
}
|
112
|
-
export declare namespace Cypress {
|
113
|
-
interface Cypress {
|
114
|
-
stylesCache: any;
|
115
|
-
React: string;
|
116
|
-
ReactDOM: string;
|
117
|
-
Styles: string;
|
118
|
-
modules: ReactModule[];
|
119
|
-
}
|
120
|
-
interface Chainable<Subject> {
|
121
|
-
state: (key: string) => any;
|
122
|
-
/**
|
123
|
-
* Mount a React component in a blank document; register it as an alias
|
124
|
-
* To access: use an alias or original component reference
|
125
|
-
* @function cy.mount
|
126
|
-
* @param {Object} jsx - component to mount
|
127
|
-
* @param {string} [Component] - alias to use later
|
128
|
-
* @example
|
129
|
-
```
|
130
|
-
import Hello from './hello.jsx'
|
131
|
-
// mount and access by alias
|
132
|
-
cy.mount(<Hello />, 'Hello')
|
133
|
-
// using default alias
|
134
|
-
cy.get('@Component')
|
135
|
-
// using specified alias
|
136
|
-
cy.get('@Hello').its('state').should(...)
|
137
|
-
// using original component
|
138
|
-
cy.get(Hello)
|
139
|
-
```
|
140
|
-
**/
|
141
|
-
get<S = any>(alias: string | symbol | Function, options?: Partial<any>): Chainable<any>;
|
142
|
-
}
|
143
|
-
}
|
7
|
+
}): Cypress.Chainable<JQuery<HTMLElement>>;
|
@@ -0,0 +1,50 @@
|
|
1
|
+
/// <reference types="cypress" />
|
2
|
+
import type React from 'react';
|
3
|
+
import type { StyleOptions } from '@cypress/mount-utils';
|
4
|
+
export interface UnmountArgs {
|
5
|
+
log: boolean;
|
6
|
+
boundComponentMessage?: string;
|
7
|
+
}
|
8
|
+
export interface InternalUnmountOptionsReact {
|
9
|
+
unmount: (el: HTMLElement) => boolean;
|
10
|
+
}
|
11
|
+
export interface InternalUnmountOptionsReact18 {
|
12
|
+
unmount: () => boolean;
|
13
|
+
}
|
14
|
+
export declare type InternalUnmountOptions = InternalUnmountOptionsReact | InternalUnmountOptionsReact18;
|
15
|
+
export declare type MountOptions = Partial<StyleOptions & MountReactComponentOptions>;
|
16
|
+
export interface MountReactComponentOptions {
|
17
|
+
alias: string;
|
18
|
+
ReactDom: typeof import('react-dom');
|
19
|
+
/**
|
20
|
+
* Log the mounting command into Cypress Command Log,
|
21
|
+
* true by default.
|
22
|
+
*/
|
23
|
+
log: boolean;
|
24
|
+
/**
|
25
|
+
* Render component in React [strict mode](https://reactjs.org/docs/strict-mode.html)
|
26
|
+
* It activates additional checks and warnings for child components.
|
27
|
+
*/
|
28
|
+
strict: boolean;
|
29
|
+
}
|
30
|
+
export interface InternalMountOptions {
|
31
|
+
reactDom: typeof import('react-dom');
|
32
|
+
render: (reactComponent: ReturnType<typeof React.createElement>, el: HTMLElement, reactDomToUse: typeof import('react-dom')) => void;
|
33
|
+
unmount: (options: UnmountArgs) => void;
|
34
|
+
}
|
35
|
+
export interface MountReturn {
|
36
|
+
/**
|
37
|
+
* The component that was rendered.
|
38
|
+
*/
|
39
|
+
component: React.ReactNode;
|
40
|
+
/**
|
41
|
+
* Rerenders the specified component with new props. This allows testing of components that store state (`setState`)
|
42
|
+
* or have asynchronous updates (`useEffect`, `useLayoutEffect`).
|
43
|
+
*/
|
44
|
+
rerender: (component: React.ReactNode) => globalThis.Cypress.Chainable<MountReturn>;
|
45
|
+
/**
|
46
|
+
* Removes the mounted component.
|
47
|
+
* @see `unmount`
|
48
|
+
*/
|
49
|
+
unmount: (payload: UnmountArgs) => void;
|
50
|
+
}
|
package/react/package.json
CHANGED
@@ -14,9 +14,6 @@
|
|
14
14
|
"test": "yarn cy:run",
|
15
15
|
"watch": "yarn build --watch --watch.exclude ./dist/**/*"
|
16
16
|
},
|
17
|
-
"dependencies": {
|
18
|
-
"debug": "^4.3.2"
|
19
|
-
},
|
20
17
|
"devDependencies": {
|
21
18
|
"@cypress/mount-utils": "0.0.0-development",
|
22
19
|
"@rollup/plugin-commonjs": "^17.1.0",
|
@@ -24,7 +21,6 @@
|
|
24
21
|
"@vitejs/plugin-react": "1.3.1",
|
25
22
|
"axios": "0.21.2",
|
26
23
|
"cypress": "0.0.0-development",
|
27
|
-
"cypress-plugin-snapshots": "1.4.4",
|
28
24
|
"prop-types": "15.7.2",
|
29
25
|
"react": "16.8.6",
|
30
26
|
"react-dom": "16.8.6",
|
@@ -33,7 +29,7 @@
|
|
33
29
|
"rollup": "^2.38.5",
|
34
30
|
"rollup-plugin-typescript2": "^0.29.0",
|
35
31
|
"typescript": "^4.2.3",
|
36
|
-
"vite": "
|
32
|
+
"vite": "3.0.3",
|
37
33
|
"vite-plugin-require-transform": "1.0.3"
|
38
34
|
},
|
39
35
|
"peerDependencies": {
|