cypress 10.5.0 → 10.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. package/angular/CHANGELOG.md +43 -0
  2. package/angular/README.md +43 -112
  3. package/angular/dist/index.js +8 -6
  4. package/angular/dist/mount.d.ts +1 -0
  5. package/angular/package.json +6 -8
  6. package/lib/tasks/download.js +4 -3
  7. package/mount-utils/CHANGELOG.md +7 -0
  8. package/mount-utils/package.json +5 -1
  9. package/package.json +11 -5
  10. package/react/CHANGELOG.md +14 -0
  11. package/react/dist/createMount.d.ts +5 -2
  12. package/react/dist/cypress-react.cjs.js +80 -115
  13. package/react/dist/cypress-react.esm-bundler.js +66 -101
  14. package/react/dist/mount.d.ts +1 -0
  15. package/react/dist/mountHook.d.ts +1 -0
  16. package/react/dist/types.d.ts +1 -0
  17. package/react/package.json +3 -7
  18. package/react18/CHANGELOG.md +14 -0
  19. package/react18/dist/cypress-react.cjs.js +63 -89
  20. package/react18/dist/cypress-react.esm-bundler.js +49 -75
  21. package/react18/dist/index.d.ts +1 -0
  22. package/react18/package.json +2 -2
  23. package/svelte/CHANGELOG.md +6 -0
  24. package/svelte/README.md +83 -0
  25. package/svelte/dist/cypress-svelte.cjs.js +213 -0
  26. package/svelte/dist/cypress-svelte.esm-bundler.js +209 -0
  27. package/svelte/dist/index.d.ts +1 -0
  28. package/svelte/dist/mount.d.ts +30 -0
  29. package/svelte/package.json +43 -0
  30. package/types/cypress-type-helpers.d.ts +3 -1
  31. package/types/cypress.d.ts +61 -12
  32. package/vue/CHANGELOG.md +7 -0
  33. package/vue/dist/cypress-vue.cjs.js +30 -38
  34. package/vue/dist/cypress-vue.esm-bundler.js +30 -38
  35. package/vue/dist/index.d.ts +1 -0
  36. package/vue/package.json +3 -8
  37. package/vue2/CHANGELOG.md +7 -0
  38. package/vue2/dist/cypress-vue2.cjs.js +53 -84
  39. package/vue2/dist/cypress-vue2.esm-bundler.js +53 -84
  40. package/vue2/dist/index.d.ts +1 -0
  41. package/vue2/package.json +2 -5
  42. package/vue2/dist/cypress-vue2.browser.js +0 -20197
@@ -0,0 +1,213 @@
1
+
2
+ /**
3
+ * @cypress/svelte v0.0.0-development
4
+ * (c) 2022 Cypress.io
5
+ * Released under the MIT License
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ Object.defineProperty(exports, '__esModule', { value: true });
11
+
12
+ const ROOT_SELECTOR = '[data-cy-root]';
13
+ const getContainerEl = () => {
14
+ const el = document.querySelector(ROOT_SELECTOR);
15
+ if (el) {
16
+ return el;
17
+ }
18
+ throw Error(`No element found that matches selector ${ROOT_SELECTOR}. Please add a root element with data-cy-root attribute to your "component-index.html" file so that Cypress can attach your component to the DOM.`);
19
+ };
20
+ /**
21
+ * Remove any style or extra link elements from the iframe placeholder
22
+ * left from any previous test
23
+ *
24
+ */
25
+ function cleanupStyles() {
26
+ const styles = document.body.querySelectorAll('[data-cy=injected-style-tag]');
27
+ styles.forEach((styleElement) => {
28
+ if (styleElement.parentElement) {
29
+ styleElement.parentElement.removeChild(styleElement);
30
+ }
31
+ });
32
+ const links = document.body.querySelectorAll('[data-cy=injected-stylesheet]');
33
+ links.forEach((link) => {
34
+ if (link.parentElement) {
35
+ link.parentElement.removeChild(link);
36
+ }
37
+ });
38
+ }
39
+ /**
40
+ * Insert links to external style resources.
41
+ */
42
+ function insertStylesheets(stylesheets, document, el) {
43
+ stylesheets.forEach((href) => {
44
+ const link = document.createElement('link');
45
+ link.type = 'text/css';
46
+ link.rel = 'stylesheet';
47
+ link.href = href;
48
+ link.dataset.cy = 'injected-stylesheet';
49
+ document.body.insertBefore(link, el);
50
+ });
51
+ }
52
+ /**
53
+ * Inserts a single stylesheet element
54
+ */
55
+ function insertStyles(styles, document, el) {
56
+ styles.forEach((style) => {
57
+ const styleElement = document.createElement('style');
58
+ styleElement.dataset.cy = 'injected-style-tag';
59
+ styleElement.appendChild(document.createTextNode(style));
60
+ document.body.insertBefore(styleElement, el);
61
+ });
62
+ }
63
+ function insertSingleCssFile(cssFilename, document, el, log) {
64
+ return cy.readFile(cssFilename, { log }).then((css) => {
65
+ const style = document.createElement('style');
66
+ style.appendChild(document.createTextNode(css));
67
+ document.body.insertBefore(style, el);
68
+ });
69
+ }
70
+ /**
71
+ * Reads the given CSS file from local file system
72
+ * and adds the loaded style text as an element.
73
+ */
74
+ function insertLocalCssFiles(cssFilenames, document, el, log) {
75
+ return Cypress.Promise.mapSeries(cssFilenames, (cssFilename) => {
76
+ return insertSingleCssFile(cssFilename, document, el, log);
77
+ });
78
+ }
79
+ /**
80
+ * Injects custom style text or CSS file or 3rd party style resources
81
+ * into the given document.
82
+ */
83
+ const injectStylesBeforeElement = (options, document, el) => {
84
+ if (!el)
85
+ return;
86
+ // first insert all stylesheets as Link elements
87
+ let stylesheets = [];
88
+ if (typeof options.stylesheet === 'string') {
89
+ stylesheets.push(options.stylesheet);
90
+ }
91
+ else if (Array.isArray(options.stylesheet)) {
92
+ stylesheets = stylesheets.concat(options.stylesheet);
93
+ }
94
+ if (typeof options.stylesheets === 'string') {
95
+ options.stylesheets = [options.stylesheets];
96
+ }
97
+ if (options.stylesheets) {
98
+ stylesheets = stylesheets.concat(options.stylesheets);
99
+ }
100
+ insertStylesheets(stylesheets, document, el);
101
+ // insert any styles as <style>...</style> elements
102
+ let styles = [];
103
+ if (typeof options.style === 'string') {
104
+ styles.push(options.style);
105
+ }
106
+ else if (Array.isArray(options.style)) {
107
+ styles = styles.concat(options.style);
108
+ }
109
+ if (typeof options.styles === 'string') {
110
+ styles.push(options.styles);
111
+ }
112
+ else if (Array.isArray(options.styles)) {
113
+ styles = styles.concat(options.styles);
114
+ }
115
+ insertStyles(styles, document, el);
116
+ // now load any css files by path and add their content
117
+ // as <style>...</style> elements
118
+ let cssFiles = [];
119
+ if (typeof options.cssFile === 'string') {
120
+ cssFiles.push(options.cssFile);
121
+ }
122
+ else if (Array.isArray(options.cssFile)) {
123
+ cssFiles = cssFiles.concat(options.cssFile);
124
+ }
125
+ if (typeof options.cssFiles === 'string') {
126
+ cssFiles.push(options.cssFiles);
127
+ }
128
+ else if (Array.isArray(options.cssFiles)) {
129
+ cssFiles = cssFiles.concat(options.cssFiles);
130
+ }
131
+ return insertLocalCssFiles(cssFiles, document, el, options.log);
132
+ };
133
+ function setupHooks(optionalCallback) {
134
+ // Consumed by the framework "mount" libs. A user might register their own mount in the scaffolded 'commands.js'
135
+ // file that is imported by e2e and component support files by default. We don't want CT side effects to run when e2e
136
+ // testing so we early return.
137
+ // System test to verify CT side effects do not pollute e2e: system-tests/test/e2e_with_mount_import_spec.ts
138
+ if (Cypress.testingType !== 'component') {
139
+ return;
140
+ }
141
+ // When running component specs, we cannot allow "cy.visit"
142
+ // because it will wipe out our preparation work, and does not make much sense
143
+ // thus we overwrite "cy.visit" to throw an error
144
+ Cypress.Commands.overwrite('visit', () => {
145
+ throw new Error('cy.visit from a component spec is not allowed');
146
+ });
147
+ // @ts-ignore
148
+ Cypress.on('test:before:run', () => {
149
+ optionalCallback === null || optionalCallback === void 0 ? void 0 : optionalCallback();
150
+ cleanupStyles();
151
+ });
152
+ }
153
+
154
+ const DEFAULT_COMP_NAME = 'unknown';
155
+ let componentInstance;
156
+ const cleanup = () => {
157
+ componentInstance === null || componentInstance === void 0 ? void 0 : componentInstance.$destroy();
158
+ };
159
+ // Extract the component name from the object passed to mount
160
+ const getComponentDisplayName = (Component) => {
161
+ if (Component.name) {
162
+ const [_, match] = /Proxy\<(\w+)\>/.exec(Component.name) || [];
163
+ return match || Component.name;
164
+ }
165
+ return DEFAULT_COMP_NAME;
166
+ };
167
+ /**
168
+ * Mounts a Svelte component inside the Cypress browser
169
+ *
170
+ * @param {SvelteConstructor<T>} Component Svelte component being mounted
171
+ * @param {MountReturn<T extends SvelteComponent>} options options to customize the component being mounted
172
+ * @returns Cypress.Chainable<MountReturn>
173
+ *
174
+ * @example
175
+ * import Counter from './Counter.svelte'
176
+ * import { mount } from 'cypress/svelte'
177
+ *
178
+ * it('should render', () => {
179
+ * mount(Counter, { props: { count: 42 } })
180
+ * cy.get('button').contains(42)
181
+ * })
182
+ */
183
+ function mount(Component, options = {}) {
184
+ return cy.then(() => {
185
+ const target = getContainerEl();
186
+ injectStylesBeforeElement(options, document, target);
187
+ const ComponentConstructor = (Component.default || Component);
188
+ componentInstance = new ComponentConstructor(Object.assign({ target }, options));
189
+ // by waiting, we are delaying test execution for the next tick of event loop
190
+ // and letting hooks and component lifecycle methods to execute mount
191
+ return cy.wait(0, { log: false }).then(() => {
192
+ if (options.log !== false) {
193
+ const mountMessage = `<${getComponentDisplayName(Component)} ... />`;
194
+ Cypress.log({
195
+ name: 'mount',
196
+ message: [mountMessage],
197
+ }).snapshot('mounted').end();
198
+ }
199
+ })
200
+ .wrap({ component: componentInstance }, { log: false });
201
+ });
202
+ }
203
+ // Side effects from "import { mount } from '@cypress/<my-framework>'" are annoying, we should avoid doing this
204
+ // by creating an explicit function/import that the user can register in their 'component.js' support file,
205
+ // such as:
206
+ // import 'cypress/<my-framework>/support'
207
+ // or
208
+ // import { registerCT } from 'cypress/<my-framework>'
209
+ // registerCT()
210
+ // Note: This would be a breaking change
211
+ setupHooks(cleanup);
212
+
213
+ exports.mount = mount;
@@ -0,0 +1,209 @@
1
+
2
+ /**
3
+ * @cypress/svelte v0.0.0-development
4
+ * (c) 2022 Cypress.io
5
+ * Released under the MIT License
6
+ */
7
+
8
+ const ROOT_SELECTOR = '[data-cy-root]';
9
+ const getContainerEl = () => {
10
+ const el = document.querySelector(ROOT_SELECTOR);
11
+ if (el) {
12
+ return el;
13
+ }
14
+ throw Error(`No element found that matches selector ${ROOT_SELECTOR}. Please add a root element with data-cy-root attribute to your "component-index.html" file so that Cypress can attach your component to the DOM.`);
15
+ };
16
+ /**
17
+ * Remove any style or extra link elements from the iframe placeholder
18
+ * left from any previous test
19
+ *
20
+ */
21
+ function cleanupStyles() {
22
+ const styles = document.body.querySelectorAll('[data-cy=injected-style-tag]');
23
+ styles.forEach((styleElement) => {
24
+ if (styleElement.parentElement) {
25
+ styleElement.parentElement.removeChild(styleElement);
26
+ }
27
+ });
28
+ const links = document.body.querySelectorAll('[data-cy=injected-stylesheet]');
29
+ links.forEach((link) => {
30
+ if (link.parentElement) {
31
+ link.parentElement.removeChild(link);
32
+ }
33
+ });
34
+ }
35
+ /**
36
+ * Insert links to external style resources.
37
+ */
38
+ function insertStylesheets(stylesheets, document, el) {
39
+ stylesheets.forEach((href) => {
40
+ const link = document.createElement('link');
41
+ link.type = 'text/css';
42
+ link.rel = 'stylesheet';
43
+ link.href = href;
44
+ link.dataset.cy = 'injected-stylesheet';
45
+ document.body.insertBefore(link, el);
46
+ });
47
+ }
48
+ /**
49
+ * Inserts a single stylesheet element
50
+ */
51
+ function insertStyles(styles, document, el) {
52
+ styles.forEach((style) => {
53
+ const styleElement = document.createElement('style');
54
+ styleElement.dataset.cy = 'injected-style-tag';
55
+ styleElement.appendChild(document.createTextNode(style));
56
+ document.body.insertBefore(styleElement, el);
57
+ });
58
+ }
59
+ function insertSingleCssFile(cssFilename, document, el, log) {
60
+ return cy.readFile(cssFilename, { log }).then((css) => {
61
+ const style = document.createElement('style');
62
+ style.appendChild(document.createTextNode(css));
63
+ document.body.insertBefore(style, el);
64
+ });
65
+ }
66
+ /**
67
+ * Reads the given CSS file from local file system
68
+ * and adds the loaded style text as an element.
69
+ */
70
+ function insertLocalCssFiles(cssFilenames, document, el, log) {
71
+ return Cypress.Promise.mapSeries(cssFilenames, (cssFilename) => {
72
+ return insertSingleCssFile(cssFilename, document, el, log);
73
+ });
74
+ }
75
+ /**
76
+ * Injects custom style text or CSS file or 3rd party style resources
77
+ * into the given document.
78
+ */
79
+ const injectStylesBeforeElement = (options, document, el) => {
80
+ if (!el)
81
+ return;
82
+ // first insert all stylesheets as Link elements
83
+ let stylesheets = [];
84
+ if (typeof options.stylesheet === 'string') {
85
+ stylesheets.push(options.stylesheet);
86
+ }
87
+ else if (Array.isArray(options.stylesheet)) {
88
+ stylesheets = stylesheets.concat(options.stylesheet);
89
+ }
90
+ if (typeof options.stylesheets === 'string') {
91
+ options.stylesheets = [options.stylesheets];
92
+ }
93
+ if (options.stylesheets) {
94
+ stylesheets = stylesheets.concat(options.stylesheets);
95
+ }
96
+ insertStylesheets(stylesheets, document, el);
97
+ // insert any styles as <style>...</style> elements
98
+ let styles = [];
99
+ if (typeof options.style === 'string') {
100
+ styles.push(options.style);
101
+ }
102
+ else if (Array.isArray(options.style)) {
103
+ styles = styles.concat(options.style);
104
+ }
105
+ if (typeof options.styles === 'string') {
106
+ styles.push(options.styles);
107
+ }
108
+ else if (Array.isArray(options.styles)) {
109
+ styles = styles.concat(options.styles);
110
+ }
111
+ insertStyles(styles, document, el);
112
+ // now load any css files by path and add their content
113
+ // as <style>...</style> elements
114
+ let cssFiles = [];
115
+ if (typeof options.cssFile === 'string') {
116
+ cssFiles.push(options.cssFile);
117
+ }
118
+ else if (Array.isArray(options.cssFile)) {
119
+ cssFiles = cssFiles.concat(options.cssFile);
120
+ }
121
+ if (typeof options.cssFiles === 'string') {
122
+ cssFiles.push(options.cssFiles);
123
+ }
124
+ else if (Array.isArray(options.cssFiles)) {
125
+ cssFiles = cssFiles.concat(options.cssFiles);
126
+ }
127
+ return insertLocalCssFiles(cssFiles, document, el, options.log);
128
+ };
129
+ function setupHooks(optionalCallback) {
130
+ // Consumed by the framework "mount" libs. A user might register their own mount in the scaffolded 'commands.js'
131
+ // file that is imported by e2e and component support files by default. We don't want CT side effects to run when e2e
132
+ // testing so we early return.
133
+ // System test to verify CT side effects do not pollute e2e: system-tests/test/e2e_with_mount_import_spec.ts
134
+ if (Cypress.testingType !== 'component') {
135
+ return;
136
+ }
137
+ // When running component specs, we cannot allow "cy.visit"
138
+ // because it will wipe out our preparation work, and does not make much sense
139
+ // thus we overwrite "cy.visit" to throw an error
140
+ Cypress.Commands.overwrite('visit', () => {
141
+ throw new Error('cy.visit from a component spec is not allowed');
142
+ });
143
+ // @ts-ignore
144
+ Cypress.on('test:before:run', () => {
145
+ optionalCallback === null || optionalCallback === void 0 ? void 0 : optionalCallback();
146
+ cleanupStyles();
147
+ });
148
+ }
149
+
150
+ const DEFAULT_COMP_NAME = 'unknown';
151
+ let componentInstance;
152
+ const cleanup = () => {
153
+ componentInstance === null || componentInstance === void 0 ? void 0 : componentInstance.$destroy();
154
+ };
155
+ // Extract the component name from the object passed to mount
156
+ const getComponentDisplayName = (Component) => {
157
+ if (Component.name) {
158
+ const [_, match] = /Proxy\<(\w+)\>/.exec(Component.name) || [];
159
+ return match || Component.name;
160
+ }
161
+ return DEFAULT_COMP_NAME;
162
+ };
163
+ /**
164
+ * Mounts a Svelte component inside the Cypress browser
165
+ *
166
+ * @param {SvelteConstructor<T>} Component Svelte component being mounted
167
+ * @param {MountReturn<T extends SvelteComponent>} options options to customize the component being mounted
168
+ * @returns Cypress.Chainable<MountReturn>
169
+ *
170
+ * @example
171
+ * import Counter from './Counter.svelte'
172
+ * import { mount } from 'cypress/svelte'
173
+ *
174
+ * it('should render', () => {
175
+ * mount(Counter, { props: { count: 42 } })
176
+ * cy.get('button').contains(42)
177
+ * })
178
+ */
179
+ function mount(Component, options = {}) {
180
+ return cy.then(() => {
181
+ const target = getContainerEl();
182
+ injectStylesBeforeElement(options, document, target);
183
+ const ComponentConstructor = (Component.default || Component);
184
+ componentInstance = new ComponentConstructor(Object.assign({ target }, options));
185
+ // by waiting, we are delaying test execution for the next tick of event loop
186
+ // and letting hooks and component lifecycle methods to execute mount
187
+ return cy.wait(0, { log: false }).then(() => {
188
+ if (options.log !== false) {
189
+ const mountMessage = `<${getComponentDisplayName(Component)} ... />`;
190
+ Cypress.log({
191
+ name: 'mount',
192
+ message: [mountMessage],
193
+ }).snapshot('mounted').end();
194
+ }
195
+ })
196
+ .wrap({ component: componentInstance }, { log: false });
197
+ });
198
+ }
199
+ // Side effects from "import { mount } from '@cypress/<my-framework>'" are annoying, we should avoid doing this
200
+ // by creating an explicit function/import that the user can register in their 'component.js' support file,
201
+ // such as:
202
+ // import 'cypress/<my-framework>/support'
203
+ // or
204
+ // import { registerCT } from 'cypress/<my-framework>'
205
+ // registerCT()
206
+ // Note: This would be a breaking change
207
+ setupHooks(cleanup);
208
+
209
+ export { mount };
@@ -0,0 +1 @@
1
+ export * from './mount';
@@ -0,0 +1,30 @@
1
+ /// <reference types="cypress" />
2
+ /// <reference types="cypress" />
3
+ import { StyleOptions } from '@cypress/mount-utils';
4
+ import type { ComponentConstructorOptions, ComponentProps, SvelteComponent } from 'svelte';
5
+ declare type SvelteConstructor<T> = new (...args: any[]) => T;
6
+ declare type SvelteComponentOptions<T extends SvelteComponent> = Omit<ComponentConstructorOptions<ComponentProps<T>>, 'hydrate' | 'target' | '$$inline'>;
7
+ export interface MountOptions<T extends SvelteComponent> extends SvelteComponentOptions<T>, Partial<StyleOptions> {
8
+ log?: boolean;
9
+ }
10
+ export interface MountReturn<T extends SvelteComponent> {
11
+ component: T;
12
+ }
13
+ /**
14
+ * Mounts a Svelte component inside the Cypress browser
15
+ *
16
+ * @param {SvelteConstructor<T>} Component Svelte component being mounted
17
+ * @param {MountReturn<T extends SvelteComponent>} options options to customize the component being mounted
18
+ * @returns Cypress.Chainable<MountReturn>
19
+ *
20
+ * @example
21
+ * import Counter from './Counter.svelte'
22
+ * import { mount } from 'cypress/svelte'
23
+ *
24
+ * it('should render', () => {
25
+ * mount(Counter, { props: { count: 42 } })
26
+ * cy.get('button').contains(42)
27
+ * })
28
+ */
29
+ export declare function mount<T extends SvelteComponent>(Component: SvelteConstructor<T>, options?: MountOptions<T>): Cypress.Chainable<MountReturn<T>>;
30
+ export {};
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@cypress/svelte",
3
+ "version": "0.0.0-development",
4
+ "description": "Browser-based Component Testing for Svelte.js with Cypress.io 🧡",
5
+ "main": "dist/cypress-svelte.cjs.js",
6
+ "scripts": {
7
+ "prebuild": "rimraf dist",
8
+ "build": "rollup -c rollup.config.mjs",
9
+ "postbuild": "node ../../scripts/sync-exported-npm-with-cli.js",
10
+ "build-prod": "yarn build",
11
+ "check-ts": "tsc --noEmit"
12
+ },
13
+ "devDependencies": {
14
+ "@cypress/mount-utils": "0.0.0-development",
15
+ "svelte": "^3.49.0",
16
+ "typescript": "^4.7.4"
17
+ },
18
+ "peerDependencies": {
19
+ "cypress": ">=10.6.0",
20
+ "svelte": ">=3.0.0"
21
+ },
22
+ "files": [
23
+ "dist/**/*"
24
+ ],
25
+ "types": "dist/index.d.ts",
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/cypress-io/cypress.git"
30
+ },
31
+ "homepage": "https://github.com/cypress-io/cypress/blob/master/npm/svelte/#readme",
32
+ "bugs": "https://github.com/cypress-io/cypress/issues/new?assignees=&labels=npm%3A%20%40cypress%2Fsvelte&template=1-bug-report.md&title=",
33
+ "keywords": [
34
+ "cypress",
35
+ "svelte",
36
+ "testing",
37
+ "component testing"
38
+ ],
39
+ "module": "dist/cypress-svelte.esm-bundler.js",
40
+ "publishConfig": {
41
+ "access": "public"
42
+ }
43
+ }
@@ -1,2 +1,4 @@
1
1
  // type helpers
2
- type Nullable<T> = T | null
2
+ declare namespace Cypress {
3
+ type Nullable<T> = T | null
4
+ }
@@ -1,5 +1,6 @@
1
1
  /// <reference path="./cypress-npm-api.d.ts" />
2
2
  /// <reference path="./cypress-eventemitter.d.ts" />
3
+ /// <reference path="./cypress-type-helpers.d.ts" />
3
4
 
4
5
  declare namespace Cypress {
5
6
  type FileContents = string | any[] | object
@@ -81,7 +82,7 @@ declare namespace Cypress {
81
82
 
82
83
  type BrowserChannel = 'stable' | 'canary' | 'beta' | 'dev' | 'nightly' | string
83
84
 
84
- type BrowserFamily = 'chromium' | 'firefox'
85
+ type BrowserFamily = 'chromium' | 'firefox' | 'webkit'
85
86
 
86
87
  /**
87
88
  * Describes a browser Cypress can control
@@ -2719,6 +2720,13 @@ declare namespace Cypress {
2719
2720
  * @default 60000
2720
2721
  */
2721
2722
  pageLoadTimeout: number
2723
+ /**
2724
+ * Whether Cypress will search for and replace
2725
+ * obstructive JS code in .js or .html files.
2726
+ *
2727
+ * @see https://on.cypress.io/configuration#modifyObstructiveCode
2728
+ */
2729
+ modifyObstructiveCode: boolean
2722
2730
  /**
2723
2731
  * Time, in milliseconds, to wait for an XHR request to go out in a [cy.wait()](https://on.cypress.io/wait) command
2724
2732
  * @default 5000
@@ -2866,10 +2874,20 @@ declare namespace Cypress {
2866
2874
  */
2867
2875
  experimentalModifyObstructiveThirdPartyCode: boolean
2868
2876
  /**
2869
- * Generate and save commands directly to your test suite by interacting with your app as an end user would.
2877
+ * Enables AST-based JS/HTML rewriting. This may fix issues caused by the existing regex-based JS/HTML replacement algorithm.
2870
2878
  * @default false
2871
2879
  */
2872
2880
  experimentalSourceRewriting: boolean
2881
+ /**
2882
+ * Generate and save commands directly to your test suite by interacting with your app as an end user would.
2883
+ * @default false
2884
+ */
2885
+ experimentalStudio: boolean
2886
+ /**
2887
+ * Adds support for testing in the WebKit browser engine used by Safari. See https://on.cypress.io/webkit-experiment for more information.
2888
+ * @default false
2889
+ */
2890
+ experimentalWebKitSupport: boolean
2873
2891
  /**
2874
2892
  * Number of times to retry a failed test.
2875
2893
  * If a number is set, tests will retry in both runMode and openMode.
@@ -2962,13 +2980,6 @@ declare namespace Cypress {
2962
2980
  * Whether Cypress was launched via 'cypress open' (interactive mode)
2963
2981
  */
2964
2982
  isInteractive: boolean
2965
- /**
2966
- * Whether Cypress will search for and replace
2967
- * obstructive JS code in .js or .html files.
2968
- *
2969
- * @see https://on.cypress.io/configuration#modifyObstructiveCode
2970
- */
2971
- modifyObstructiveCode: boolean
2972
2983
  /**
2973
2984
  * The platform Cypress is running on.
2974
2985
  */
@@ -3047,21 +3058,39 @@ declare namespace Cypress {
3047
3058
 
3048
3059
  type PickConfigOpt<T> = T extends keyof DefineDevServerConfig ? DefineDevServerConfig[T] : any
3049
3060
 
3061
+ interface AngularDevServerProjectConfig {
3062
+ root: string,
3063
+ sourceRoot: string,
3064
+ buildOptions: Record<string, any>
3065
+ }
3066
+
3050
3067
  type DevServerFn<ComponentDevServerOpts = any> = (cypressDevServerConfig: DevServerConfig, devServerConfig: ComponentDevServerOpts) => ResolvedDevServerConfig | Promise<ResolvedDevServerConfig>
3051
3068
 
3052
3069
  type DevServerConfigOptions = {
3053
3070
  bundler: 'webpack'
3054
- framework: 'react' | 'vue' | 'vue-cli' | 'nuxt' | 'create-react-app' | 'next' | 'angular'
3071
+ framework: 'react' | 'vue' | 'vue-cli' | 'nuxt' | 'create-react-app' | 'next' | 'svelte'
3055
3072
  webpackConfig?: PickConfigOpt<'webpackConfig'>
3056
3073
  } | {
3057
3074
  bundler: 'vite'
3058
- framework: 'react' | 'vue'
3075
+ framework: 'react' | 'vue' | 'svelte'
3059
3076
  viteConfig?: Omit<Exclude<PickConfigOpt<'viteConfig'>, undefined>, 'base' | 'root'>
3077
+ } | {
3078
+ bundler: 'webpack',
3079
+ framework: 'angular',
3080
+ webpackConfig?: PickConfigOpt<'webpackConfig'>,
3081
+ options?: {
3082
+ projectConfig: AngularDevServerProjectConfig
3083
+ }
3060
3084
  }
3061
3085
 
3062
- interface ComponentConfigOptions<ComponentDevServerOpts = any> extends Omit<CoreConfigOptions, 'baseUrl' | 'experimentalSessionAndOrigin'> {
3086
+ interface ComponentConfigOptions<ComponentDevServerOpts = any> extends Omit<CoreConfigOptions, 'baseUrl' | 'experimentalSessionAndOrigin' | 'experimentalStudio'> {
3063
3087
  devServer: DevServerFn<ComponentDevServerOpts> | DevServerConfigOptions
3064
3088
  devServerConfig?: ComponentDevServerOpts
3089
+ /**
3090
+ * Runs all component specs in a single tab, trading spec isolation for faster run mode execution.
3091
+ * @default false
3092
+ */
3093
+ experimentalSingleTabRunMode?: boolean
3065
3094
  }
3066
3095
 
3067
3096
  /**
@@ -5778,6 +5807,26 @@ declare namespace Cypress {
5778
5807
  * cy.clock().invoke('restore')
5779
5808
  */
5780
5809
  restore(): void
5810
+ /**
5811
+ * Change the time without invoking any timers.
5812
+ *
5813
+ * Default value with no argument or undefined is 0.
5814
+ *
5815
+ * This can be useful if you need to change the time by an hour
5816
+ * while there is a setInterval registered that may otherwise run thousands
5817
+ * of times.
5818
+ * @see https://on.cypress.io/clock
5819
+ * @example
5820
+ * cy.clock()
5821
+ * cy.visit('/')
5822
+ * ...
5823
+ * cy.clock().then(clock => {
5824
+ * clock.setSystemTime(60 * 60 * 1000)
5825
+ * })
5826
+ * // or use this shortcut
5827
+ * cy.clock().invoke('setSystemTime', 60 * 60 * 1000)
5828
+ */
5829
+ setSystemTime(now?: number | Date): void
5781
5830
  }
5782
5831
 
5783
5832
  interface Cookie {
package/vue/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [@cypress/vue-v4.2.0](https://github.com/cypress-io/cypress/compare/@cypress/vue-v4.1.0...@cypress/vue-v4.2.0) (2022-08-30)
2
+
3
+
4
+ ### Features
5
+
6
+ * adding svelte component testing support ([#23553](https://github.com/cypress-io/cypress/issues/23553)) ([f6eaad4](https://github.com/cypress-io/cypress/commit/f6eaad40e1836fa9db87c60defa5ae6f390c8fd8))
7
+
1
8
  # [@cypress/vue-v4.1.0](https://github.com/cypress-io/cypress/compare/@cypress/vue-v4.0.0...@cypress/vue-v4.1.0) (2022-08-11)
2
9
 
3
10