diff --git a/cli/types/cypress.d.ts b/cli/types/cypress.d.ts index 9c800f56ad..600867676e 100644 --- a/cli/types/cypress.d.ts +++ b/cli/types/cypress.d.ts @@ -2571,7 +2571,9 @@ declare namespace Cypress { */ withArgs(...args: any[]): Omit & Agent - callsFake(func: (...args: any[]) => any): Omit & Agent + callsFake(func: (...args: any[]) => any): Agent + + callThroughWithNew(): Agent } type Agent = SinonSpyAgent & T @@ -6446,6 +6448,7 @@ declare namespace Cypress { } interface Log { + id: string end(): Log error(error: Error): Log finish(): void diff --git a/packages/driver/cypress/e2e/commands/agents.cy.js b/packages/driver/cypress/e2e/commands/agents.cy.ts similarity index 98% rename from packages/driver/cypress/e2e/commands/agents.cy.js rename to packages/driver/cypress/e2e/commands/agents.cy.ts index 410c127b71..253bf9ca4f 100644 --- a/packages/driver/cypress/e2e/commands/agents.cy.js +++ b/packages/driver/cypress/e2e/commands/agents.cy.ts @@ -1,4 +1,4 @@ -const { assertLogLength } = require('../../support/utils') +import { assertLogLength } from '../../support/utils' const { _ } = Cypress @@ -72,6 +72,7 @@ describe('src/cy/commands/agents', () => { }, } + // @ts-expect-error TODO: deprecated: Figure out how to handle types here cy.stub(this.obj, 'bar', 'baz') this.replacementCalled = false @@ -124,6 +125,7 @@ describe('src/cy/commands/agents', () => { return obj .foo() + // @ts-expect-error TODO: Figure out how to handle types here .delay(1) }) }) @@ -340,6 +342,7 @@ describe('src/cy/commands/agents', () => { _.each([null, undefined, {}, [], 123], (value) => { it(`throws when passed: ${value}`, () => { expect(() => { + // @ts-expect-error Testing invalid inputs cy.stub().as(value) }).to.throw('`cy.as()` can only accept a string.') }) @@ -417,6 +420,7 @@ describe('src/cy/commands/agents', () => { _.each([null, undefined, {}, [], 123], (value) => { it(`throws when passed: ${value}`, () => { expect(() => { + // @ts-expect-error Testing invalid inputs cy.stub().as(value) }).to.throw('`cy.as()` can only accept a string.') }) diff --git a/packages/driver/cypress/e2e/commands/aliasing.cy.js b/packages/driver/cypress/e2e/commands/aliasing.cy.ts similarity index 92% rename from packages/driver/cypress/e2e/commands/aliasing.cy.js rename to packages/driver/cypress/e2e/commands/aliasing.cy.ts index a862d3fdff..e1220a212d 100644 --- a/packages/driver/cypress/e2e/commands/aliasing.cy.js +++ b/packages/driver/cypress/e2e/commands/aliasing.cy.ts @@ -1,4 +1,4 @@ -const { assertLogLength } = require('../../support/utils') +import { assertLogLength } from '../../support/utils' const { _ } = Cypress describe('src/cy/commands/aliasing', () => { @@ -40,13 +40,15 @@ describe('src/cy/commands/aliasing', () => { const li = cy.$$('#list li').eq(0) cy.get('#list li').eq(0).as('firstLi').then(($li) => { - expect($li).to.match(li) + expect($li[0]).to.eq(li[0]) }) }) it('retries previous commands invoked inside custom commands', () => { - Cypress.Commands.add('get2', (selector) => cy.get(selector)) + // @ts-expect-error TODO: add types need updating to not error with string here + Cypress.Commands.add('get2', (selector: string) => cy.get(selector)) + // @ts-expect-error - we are testing custom command, ignore types for now cy.get2('body').children('div').as('divs') cy.visit('/fixtures/dom.html') @@ -54,7 +56,7 @@ describe('src/cy/commands/aliasing', () => { }) it('retries primitives and assertions', () => { - const obj = {} + const obj: any = {} cy.on('command:retry', _.after(2, () => { obj.foo = 'bar' @@ -105,8 +107,10 @@ describe('src/cy/commands/aliasing', () => { }) it('retries previous commands invoked inside custom commands', () => { - Cypress.Commands.add('get2', (selector) => cy.get(selector)) + // @ts-expect-error TODO: add types need updating to not error with string here + Cypress.Commands.add('get2', (selector: string) => cy.get(selector)) + // @ts-expect-error - we are testing custom command, ignore types for now cy.get2('body').children('div').as('divs') cy.visit('/fixtures/dom.html') @@ -120,6 +124,7 @@ describe('src/cy/commands/aliasing', () => { afterEach(function () { if (!this.foo) { + // @ts-expect-error TODO: mocha Runnable is not expecting error here this.test.error(new Error('this.foo not defined')) } }) @@ -140,10 +145,12 @@ describe('src/cy/commands/aliasing', () => { describe('nested hooks', () => { afterEach(function () { if (!this.bar) { + // @ts-expect-error TODO: mocha Runnable is not expecting error here this.test.error(new Error('this.bar not defined')) } if (!this.foo) { + // @ts-expect-error TODO: mocha Runnable is not expecting error here this.test.error(new Error('this.foo not defined')) } }) @@ -162,6 +169,7 @@ describe('src/cy/commands/aliasing', () => { afterEach(function () { if (!this.quux) { + // @ts-expect-error TODO: mocha Runnable is not expecting error here this.test.error(new Error('this.quux not defined')) } }) @@ -195,6 +203,7 @@ describe('src/cy/commands/aliasing', () => { done() }) + // @ts-expect-error - testing invalid value cy.get('div:first').as(value) }) }) @@ -259,6 +268,7 @@ describe('src/cy/commands/aliasing', () => { done() }) + // @ts-expect-error - testing invalid options cy.wrap({}).as('value', 'wut?') }) @@ -270,6 +280,7 @@ describe('src/cy/commands/aliasing', () => { done() }) + // @ts-expect-error - testing invalid options cy.wrap({}).as('value', { type: 'wut?' }) }) }) @@ -309,13 +320,14 @@ describe('src/cy/commands/aliasing', () => { const cmd = Cypress.log({}) cy.get('ul:first li', { log: false }).first({ log: false }).then(($li) => { - cmd.snapshot().end() + cmd?.snapshot().end() return undefined }) }, }) + // @ts-expect-error - testing custom command so not worried about types here cy.foo().as('foo').then(function () { const { lastLog } = this @@ -436,6 +448,7 @@ describe('src/cy/commands/aliasing', () => { it('works with .then function overwrite', () => { // use explicit arguments and Function.prototype.call Cypress.Commands.overwrite('then', function (originalCommand, subject, fn, options = {}) { + // @ts-expect-error TODO: not expecting 4 args here return originalCommand.call(null, subject, options, fn) }) diff --git a/packages/driver/cypress/e2e/commands/sessions/sessions.cy.js b/packages/driver/cypress/e2e/commands/sessions/sessions.cy.ts similarity index 94% rename from packages/driver/cypress/e2e/commands/sessions/sessions.cy.js rename to packages/driver/cypress/e2e/commands/sessions/sessions.cy.ts index e9a6cd07c9..2e0733fed6 100644 --- a/packages/driver/cypress/e2e/commands/sessions/sessions.cy.js +++ b/packages/driver/cypress/e2e/commands/sessions/sessions.cy.ts @@ -1,14 +1,14 @@ const baseUrl = Cypress.config('baseUrl') -before(() => { +before(async () => { // sessions has logic built in to persists sessions on UI refresh - Cypress.session.clearAllSavedSessions() + await Cypress.session.clearAllSavedSessions() }) const expectCurrentSessionData = async (obj) => { return Cypress.session.getCurrentSessionData() .then((result) => { - expect(result.cookies.map((v) => v.name)).members(obj.cookies || []) + expect(result.cookies?.map((v) => v.name)).members(obj.cookies || []) expect(result.localStorage).deep.members(obj.localStorage || []) expect(result.sessionStorage).deep.members(obj.sessionStorage || []) }) @@ -99,6 +99,7 @@ describe('cy.session', { retries: 0 }, () => { it('clears the browser cookie after each run', () => { cy.window() .then((win) => { + // @ts-expect-error TODO: cookie doesn't exist on win, usually cookie is set on document win.cookie = 'key=value; SameSite=Strict; Secure; Path=/fixtures' }) .then(async () => { @@ -113,6 +114,7 @@ describe('cy.session', { retries: 0 }, () => { it('does not clear the browser cookie after each run if the next test has test isolation off', () => { cy.window() .then((win) => { + // @ts-expect-error TODO: cookie doesn't exist on win, usually cookie is set on document win.cookie = 'key=value; SameSite=Strict; Secure; Path=/fixtures' }) .then(async () => { @@ -169,7 +171,7 @@ describe('cy.session', { retries: 0 }, () => { }) describe('session flows', () => { - let logs = [] + let logs: Cypress.Log[] = [] let clearPageCount = 0 let sessionGroupId let setup @@ -305,7 +307,12 @@ describe('cy.session', { retries: 0 }, () => { }) it('has session details in the consoleProps', () => { - const consoleProps = logs[0].get('consoleProps')() + let consoleProps + const getConsoleProps = logs[0].get('consoleProps') + + if (getConsoleProps) { + consoleProps = getConsoleProps() + } expect(consoleProps.name).to.eq('session') expect(consoleProps.type).to.eq('command') @@ -620,7 +627,7 @@ describe('cy.session', { retries: 0 }, () => { return Promise.reject(false) } - handleValidate() + return handleValidate() }) }) @@ -686,7 +693,7 @@ describe('cy.session', { retries: 0 }, () => { }) // this error is associated with the group since the validation rejected - expect(logs[4].get('error').message).to.contain('This error occurred while validating the restored session') + expect(logs[4].get('error')?.message).to.contain('This error occurred while validating the restored session') expect(logs[6].get()).to.contain({ name: 'Clear page', @@ -793,7 +800,7 @@ describe('cy.session', { retries: 0 }, () => { }) // this error is associated with the group since the validation rejected - expect(logs[4].get('error').message).to.contain('Your `cy.session` **validate** promise rejected with false.') + expect(logs[4].get('error')?.message).to.contain('Your `cy.session` **validate** promise rejected with false.') expect(logs[6].get()).to.contain({ name: 'Clear page', @@ -860,7 +867,8 @@ describe('cy.session', { retries: 0 }, () => { expect(Cypress.action).not.to.be.calledWith('cy:url:changed') expect(Cypress.action).not.to.be.calledWith('cy:visit:blank') }) - .url('/fixtures/form.html') + + cy.url().should('include', '/fixtures/form.html') }) it('does not clear session data before each run', async () => { @@ -888,6 +896,7 @@ describe('cy.session', { retries: 0 }, () => { it('does not clear the browser context before each run', () => { cy.window() .then((win) => { + // @ts-expect-error TODO: cookie doesn't exist on win, usually cookie is set on document win.cookie = 'key=value; SameSite=Strict; Secure; Path=/fixtures' win.localStorage.setItem('animal', 'bear') win.sessionStorage.setItem('food', 'burgers') @@ -911,7 +920,7 @@ describe('cy.session', { retries: 0 }, () => { }) describe('session flows', () => { - let logs = [] + let logs: Cypress.Log[] = [] let clearPageCount = 0 let sessionGroupId let setup @@ -1047,7 +1056,12 @@ describe('cy.session', { retries: 0 }, () => { }) it('has session details in the consoleProps', () => { - const consoleProps = logs[0].get('consoleProps')() + let consoleProps + const getConsoleProps = logs[0].get('consoleProps') + + if (getConsoleProps) { + consoleProps = getConsoleProps() + } expect(consoleProps.name).to.eq('session') expect(consoleProps.type).to.eq('command') @@ -1130,7 +1144,12 @@ describe('cy.session', { retries: 0 }, () => { }) it('has session details in the consoleProps', () => { - const consoleProps = logs[0].get('consoleProps')() + let consoleProps + const getConsoleProps = logs[0].get('consoleProps') + + if (getConsoleProps) { + consoleProps = getConsoleProps() + } expect(consoleProps.name).to.eq('session') expect(consoleProps.type).to.eq('command') @@ -1353,7 +1372,7 @@ describe('cy.session', { retries: 0 }, () => { return Promise.reject(false) } - handleValidate() + return handleValidate() }) }) @@ -1413,7 +1432,7 @@ describe('cy.session', { retries: 0 }, () => { }) // this error is associated with the group since the validation rejected - expect(logs[3].get('error').message).to.contain('Your `cy.session` **validate** promise rejected with false.') + expect(logs[3].get('error')?.message).to.contain('Your `cy.session` **validate** promise rejected with false.') expect(logs[5].get()).to.contain({ displayName: 'Clear cookies, localStorage and sessionStorage', @@ -1505,7 +1524,7 @@ describe('cy.session', { retries: 0 }, () => { }) // this error is associated with the group since the validation rejected - expect(logs[3].get('error').message).to.contain('Your `cy.session` **validate** promise rejected with false.') + expect(logs[3].get('error')?.message).to.contain('Your `cy.session` **validate** promise rejected with false.') expect(logs[5].get()).to.contain({ displayName: 'Clear cookies, localStorage and sessionStorage', @@ -1548,9 +1567,9 @@ describe('cy.session', { retries: 0 }, () => { }) describe('errors', () => { - let lastLog = null - let lastSessionLog = null - const handleAddLog = (attrs, log) => { + let lastLog: Cypress.Log | null = null + let lastSessionLog: Cypress.Log | null = null + const handleAddLog = (attrs, log: Cypress.Log) => { lastLog = log if (attrs.name === 'session') { lastSessionLog = log @@ -1570,91 +1589,97 @@ describe('cy.session', { retries: 0 }, () => { it('throws when sessionId argument was not provided', function (done) { cy.once('fail', (err) => { expect(lastSessionLog).to.eq(lastLog) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') + expect(lastLog?.get('error')).to.eq(err) + expect(lastLog?.get('state')).to.eq('failed') expect(err.message).to.eq('`cy.session()` was passed an invalid argument. The first argument `id` must be an string or serializable object.') expect(err.docsUrl).to.eq('https://on.cypress.io/session') done() }) + // @ts-expect-error - testing invalid arg cy.session() }) it('throws when setup function is not provided', function (done) { cy.once('fail', (err) => { - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') + expect(lastLog?.get('error')).to.eq(err) + expect(lastLog?.get('state')).to.eq('failed') expect(err.message).to.eq('In order to use `cy.session()`, provide a `setup` as the second argument:\n\n`cy.session(id, setup)`') expect(err.docsUrl).to.eq('https://on.cypress.io/session') done() }) + // @ts-expect-error - testing invalid arg cy.session('some-session') }) it('throws when sessionId argument is not an object', function (done) { cy.once('fail', (err) => { expect(lastSessionLog).to.eq(lastLog) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') + expect(lastLog?.get('error')).to.eq(err) + expect(lastLog?.get('state')).to.eq('failed') expect(err.message).to.eq('`cy.session()` was passed an invalid argument. The first argument `id` must be an string or serializable object.') expect(err.docsUrl).to.eq('https://on.cypress.io/session') done() }) + // @ts-expect-error - testing invalid arg cy.session(1) }) it('throws when options argument is provided and is not an object', function (done) { cy.once('fail', (err) => { expect(lastSessionLog).to.eq(lastLog) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') + expect(lastLog?.get('error')).to.eq(err) + expect(lastLog?.get('state')).to.eq('failed') expect(err.message).to.eq('`cy.session()` was passed an invalid argument. The optional third argument `options` must be an object.') expect(err.docsUrl).to.eq('https://on.cypress.io/session') done() }) + // @ts-expect-error - testing invalid arg cy.session('some-session', () => {}, 'invalid_arg') }) it('throws when options argument has an invalid option', function (done) { cy.once('fail', (err) => { expect(lastSessionLog).to.eq(lastLog) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') + expect(lastLog?.get('error')).to.eq(err) + expect(lastLog?.get('state')).to.eq('failed') expect(err.message).to.eq('`cy.session()` was passed an invalid option: **invalid_key**\nAvailable options are: `validate`') expect(err.docsUrl).to.eq('https://on.cypress.io/session') done() }) + // @ts-expect-error - testing invalid arg cy.session('some-session', () => {}, { invalid_key: 2 }) }) it('throws when options argument has an option with an invalid type', function (done) { cy.once('fail', (err) => { expect(lastSessionLog).to.eq(lastLog) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') + expect(lastLog?.get('error')).to.eq(err) + expect(lastLog?.get('state')).to.eq('failed') expect(err.message).to.eq('`cy.session()` was passed an invalid option value. **validate** must be of type **function** but was **number**.') expect(err.docsUrl).to.eq('https://on.cypress.io/session') done() }) + // @ts-expect-error - testing invalid arg cy.session('some-session', () => {}, { validate: 2 }) }) it('throws when multiple session calls with same sessionId but different setup', function (done) { cy.once('fail', async (err) => { expect(lastSessionLog).to.eq(lastLog) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') + expect(lastLog?.get('error')).to.eq(err) + expect(lastLog?.get('state')).to.eq('failed') expect(err.message).to.eq('This session already exists. You may not create a new session with a previously used identifier. If you want to create a new session with a different setup function, please call `cy.session()` with a unique identifier other than **duplicate-session**.') expect(err.docsUrl).to.eq('https://on.cypress.io/session') @@ -1683,8 +1708,8 @@ describe('cy.session', { retries: 0 }, () => { it('throws when multiple session calls with same sessionId but different validate opt', function (done) { cy.once('fail', async (err) => { expect(lastSessionLog).to.eq(lastLog) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') + expect(lastLog?.get('error')).to.eq(err) + expect(lastLog?.get('state')).to.eq('failed') expect(err.message).to.eq('This session already exists. You may not create a new session with a previously used identifier. If you want to create a new session with a different validate function, please call `cy.session()` with a unique identifier other than **duplicate-sess**.') expect(err.docsUrl).to.eq('https://on.cypress.io/session') @@ -1699,8 +1724,8 @@ describe('cy.session', { retries: 0 }, () => { it('throws when multiple session calls with same sessionId but different cacheAcrossSpec opt', function (done) { cy.once('fail', async (err) => { expect(lastSessionLog).to.eq(lastLog) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') + expect(lastLog?.get('error')).to.eq(err) + expect(lastLog?.get('state')).to.eq('failed') expect(err.message).to.eq('This session already exists. You may not create a new session with a previously used identifier. If you want to create a new session with a different persistence, please call `cy.session()` with a unique identifier other than **duplicate-sess**.') expect(err.docsUrl).to.eq('https://on.cypress.io/session') @@ -1715,10 +1740,10 @@ describe('cy.session', { retries: 0 }, () => { describe('setup function failures', () => { it('throws when setup function has a failing Cypress command', function (done) { cy.once('fail', (err) => { - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') + expect(lastLog?.get('error')).to.eq(err) + expect(lastLog?.get('state')).to.eq('failed') expect(err.message).to.contain('This error occurred while creating the session. Because the session setup failed, we failed the test.') - expect(lastSessionLog.get('state')).to.eq('failed') + expect(lastSessionLog?.get('state')).to.eq('failed') done() }) @@ -1729,10 +1754,10 @@ describe('cy.session', { retries: 0 }, () => { it('throws when setup function has a failing assertion', function (done) { cy.once('fail', (err) => { - expect(err.message).to.contain(lastLog.get('error').message) - expect(lastLog.get('state')).to.eq('failed') + expect(err.message).to.contain(lastLog?.get('error')?.message) + expect(lastLog?.get('state')).to.eq('failed') expect(err.message).to.contain('This error occurred while creating the session. Because the session setup failed, we failed the test.') - expect(lastSessionLog.get('state')).to.eq('failed') + expect(lastSessionLog?.get('state')).to.eq('failed') done() }) @@ -1845,6 +1870,7 @@ describe('cy.session', { retries: 0 }, () => { cy.session(['mock-session', 'Chainer'], () => { cy.log('setup') }, { + // @ts-expect-error - testing invalid arg validate () { return cy.wrap(false) }, diff --git a/packages/driver/cypress/e2e/commands/sessions/utils.cy.js b/packages/driver/cypress/e2e/commands/sessions/utils.cy.ts similarity index 89% rename from packages/driver/cypress/e2e/commands/sessions/utils.cy.js rename to packages/driver/cypress/e2e/commands/sessions/utils.cy.ts index 459c68d2dd..dcc52da2df 100644 --- a/packages/driver/cypress/e2e/commands/sessions/utils.cy.js +++ b/packages/driver/cypress/e2e/commands/sessions/utils.cy.ts @@ -1,7 +1,7 @@ -const { +import { getConsoleProps, navigateAboutBlank, -} = require('@packages/driver/src/cy/commands/sessions/utils') +} from '../../../../src/cy/commands/sessions/utils' describe('src/cy/commands/sessions/utils.ts', () => { const logForDebugging = (consoleProps) => { @@ -17,6 +17,9 @@ describe('src/cy/commands/sessions/utils.ts', () => { it('for one domain with neither cookies or localStorage set', () => { const sessionState = { id: 'session1', + hydrated: false, + cacheAcrossSpecs: false, + setup: () => {}, } const consoleProps = getConsoleProps(sessionState) @@ -30,6 +33,9 @@ describe('src/cy/commands/sessions/utils.ts', () => { it('for one domain with only cookies set', () => { const sessionState = { id: 'session1', + hydrated: true, + cacheAcrossSpecs: false, + setup: () => {}, cookies: [ { name: 'foo', value: 'f', path: '/', domain: 'localhost', secure: true, httpOnly: true, expiry: 123 }, ], @@ -55,6 +61,9 @@ describe('src/cy/commands/sessions/utils.ts', () => { it('for one domain with only localStorage set', () => { const sessionState = { id: 'session1', + hydrated: true, + cacheAcrossSpecs: false, + setup: () => {}, localStorage: [ { origin: 'localhost', value: { 'stor-foo': 's-f' } }, ], @@ -79,6 +88,9 @@ describe('src/cy/commands/sessions/utils.ts', () => { it('for one domain with only sessionStorage set', () => { const sessionState = { id: 'session1', + hydrated: true, + cacheAcrossSpecs: false, + setup: () => {}, sessionStorage: [ { origin: 'localhost', value: { 'stor-foo': 's-f' } }, ], @@ -103,6 +115,9 @@ describe('src/cy/commands/sessions/utils.ts', () => { it('for one domain with both cookies and localStorage set', () => { const sessionState = { id: 'session1', + hydrated: true, + cacheAcrossSpecs: false, + setup: () => {}, cookies: [ { name: 'foo', value: 'f', path: '/', domain: 'localhost', secure: true, httpOnly: true, expiry: 123 }, ], @@ -135,6 +150,9 @@ describe('src/cy/commands/sessions/utils.ts', () => { it('for multiple domains', () => { const sessionState = { id: 'session1', + hydrated: true, + cacheAcrossSpecs: false, + setup: () => {}, cookies: [ { name: 'foo', value: 'f', path: '/', domain: 'localhost', secure: true, httpOnly: true, expiry: 123 }, { name: 'bar', value: 'b', path: '/', domain: 'localhost', secure: false, httpOnly: false, expiry: 456 }, @@ -145,6 +163,7 @@ describe('src/cy/commands/sessions/utils.ts', () => { ], } + // @ts-expect-error TODO: sessionState needs more accurate types or this test data needs updating. const consoleProps = getConsoleProps(sessionState) logForDebugging(consoleProps) @@ -180,9 +199,9 @@ describe('src/cy/commands/sessions/utils.ts', () => { const spy = cy.spy(Cypress, 'action').log(false) .withArgs('cy:visit:blank') - cy.then(() => { - navigateAboutBlank() - navigateAboutBlank(true) + cy.then(async () => { + await navigateAboutBlank() + await navigateAboutBlank({ inBetweenTestsAndNextTestHasTestIsolationOn: true }) expect(spy).to.have.been.calledTwice expect(spy.args[0]).to.deep.eq(['cy:visit:blank', { testIsolation: true }]) expect(spy.args[1]).to.deep.eq(['cy:visit:blank', { testIsolation: true }]) diff --git a/packages/driver/cypress/tsconfig.json b/packages/driver/cypress/tsconfig.json index 3674b72ac8..941076a60b 100644 --- a/packages/driver/cypress/tsconfig.json +++ b/packages/driver/cypress/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "es5", - "lib": ["es5", "dom"], + "target": "es2020", + "lib": ["es2020", "dom"], "types": [ "cypress", "node" diff --git a/packages/driver/src/cy/aliases.ts b/packages/driver/src/cy/aliases.ts index 30ae2565e2..ab88f6ec5f 100644 --- a/packages/driver/src/cy/aliases.ts +++ b/packages/driver/src/cy/aliases.ts @@ -29,7 +29,7 @@ export const create = (cy: $Cy) => ({ ctx[alias] = cy.getSubjectFromChain(aliasObj.subjectChain) }, - getAlias (name, cmd, log) { + getAlias (name: string, cmd?: string, log?: any) { const aliases = cy.state('aliases') || {} // bail if the name doesn't reference an alias diff --git a/packages/driver/types/cypress/log.d.ts b/packages/driver/types/cypress/log.d.ts index 72875cadc4..2a793a3b70 100644 --- a/packages/driver/types/cypress/log.d.ts +++ b/packages/driver/types/cypress/log.d.ts @@ -26,6 +26,14 @@ declare namespace Cypress { } type ConsoleProps = { + name?: string + type?: string + error?: Error + snapshot?: string + args?: any + groups?: any + table?: any + props?: any Command?: string Snapshot?: string Elements?: number diff --git a/packages/driver/types/internal-types-lite.d.ts b/packages/driver/types/internal-types-lite.d.ts index cca93dcc11..c616ae4d58 100644 --- a/packages/driver/types/internal-types-lite.d.ts +++ b/packages/driver/types/internal-types-lite.d.ts @@ -47,6 +47,7 @@ declare namespace Cypress { /** * If `as` is chained to the current command, return the alias name used. */ + getAlias: IAliases['getAlias'] getNextAlias: IAliases['getNextAlias'] noop: (v?: T) => Cypress.Chainable now: (string, v: T) => Cypress.Chainable diff --git a/packages/driver/types/internal-types.d.ts b/packages/driver/types/internal-types.d.ts index f3593777a3..d89eef9434 100644 --- a/packages/driver/types/internal-types.d.ts +++ b/packages/driver/types/internal-types.d.ts @@ -66,6 +66,7 @@ declare namespace Cypress { interface CypressUtils { getDistanceBetween: (point1: { x: number, y: number }, point2: { x: number, y: number }) => number + isInstanceOf: (instance: any, constructor: any) => boolean throwErrByPath: (path: string, obj?: { args: object }) => void warnByPath: (path: string, obj?: { args: object }) => void warning: (message: string) => void