import faker from "@faker-js/faker"; declare global { namespace Cypress { interface Chainable { /** * Logs in with a random user. Yields the user and adds an alias to the user * * @returns {typeof login} * @memberof Chainable * @example * cy.login() * @example * cy.login({ email: 'whatever@example.com' }) */ login: typeof login; /** * Deletes the current @user * * @returns {typeof cleanupUser} * @memberof Chainable * @example * cy.cleanupUser() * @example * cy.cleanupUser({ email: 'whatever@example.com' }) */ cleanupUser: typeof cleanupUser; } } } function login({ email = faker.internet.email(undefined, undefined, "example.com"), }: { email?: string; } = {}) { cy.then(() => ({ email })).as("user"); cy.exec( `node --require esbuild-register ./cypress/support/create-user.ts "${email}"` ).then(({ stdout }) => { const cookieValue = stdout .replace(/.*(?.*)<\/cookie>.*/s, "$") .trim(); cy.setCookie("__session", cookieValue); }); return cy.get("@user"); } function cleanupUser({ email }: { email?: string } = {}) { if (email) { deleteUserByEmail(email); } else { cy.get("@user").then((user) => { const email = (user as { email?: string }).email; if (email) { deleteUserByEmail(email); } }); } cy.clearCookie("__session"); } function deleteUserByEmail(email: string) { cy.exec( `node --require esbuild-register ./cypress/support/delete-user.ts "${email}"` ); cy.clearCookie("__session"); } Cypress.Commands.add("login", login); Cypress.Commands.add("cleanupUser", cleanupUser); /* eslint @typescript-eslint/no-namespace: "off", */