Repository: echobind/bisonapp
Pull request #267 (2022-07-06 00:53:57)

build(deps): bump parse-url from 6.0.0 to 6.0.2
Bumps [parse-url](https://github.com/IonicaBizau/parse-url) from 6.0.0 to 6.0.2.
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/IonicaBizau/parse-url/commits">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=parse-url&package-manager=npm_and_yarn&previous-version=6.0.0&new-version=6.0.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language
- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language
- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language
- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language

You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/echobind/bisonapp/network/alerts).

</details>


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7e6d497..4a21e80 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+### 1.12.1-canary.0 (2022-07-08)
+
+**Note:** Version bump only for package root
+
+
+
+
+
 ## [1.12.0](https://github.com/echobind/bisonapp/compare/v1.12.0-canary.17...v1.12.0) (2022-07-01)
 
 **Note:** Version bump only for package root
diff --git a/lerna.json b/lerna.json
index f485953..c5b1d17 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
 {
-  "version": "1.12.0",
+  "version": "1.12.1-canary.0",
   "npmClient": "yarn",
   "useWorkspaces": true,
   "packages": [
diff --git a/packages/create-bison-app/CHANGELOG.md b/packages/create-bison-app/CHANGELOG.md
index a613040..6a77d56 100644
--- a/packages/create-bison-app/CHANGELOG.md
+++ b/packages/create-bison-app/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+### 1.12.1-canary.0 (2022-07-08)
+
+**Note:** Version bump only for package create-bison-app
+
+
+
+
+
 ## [1.12.0](https://github.com/echobind/bisonapp/compare/v1.12.0-canary.17...v1.12.0) (2022-07-01)
 
 **Note:** Version bump only for package create-bison-app
diff --git a/packages/create-bison-app/package.json b/packages/create-bison-app/package.json
index a31cd58..7a4f872 100644
--- a/packages/create-bison-app/package.json
+++ b/packages/create-bison-app/package.json
@@ -1,6 +1,6 @@
 {
   "name": "create-bison-app",
-  "version": "1.12.0",
+  "version": "1.12.1-canary.0",
   "description": "Creates a production-ready full-stack Jamstack app",
   "license": "MIT",
   "repository": "echobind/bisonapp",
diff --git a/packages/create-bison-app/tasks/copyFiles.js b/packages/create-bison-app/tasks/copyFiles.js
index 8082a60..6f8f3ac 100644
--- a/packages/create-bison-app/tasks/copyFiles.js
+++ b/packages/create-bison-app/tasks/copyFiles.js
@@ -94,7 +94,7 @@ async function copyFiles({ variables, targetFolder }) {
         ".tool-versions",
         "codegen.yml",
         "constants.ts",
-        "cypress.json",
+        "cypress.config.ts",
         "jest.config.js",
         "next-env.d.ts",
         "prettier.config.js",
diff --git a/packages/create-bison-app/template/.github/workflows/main.js.yml.ejs b/packages/create-bison-app/template/.github/workflows/main.js.yml.ejs
index 0581fe2..f31441f 100644
--- a/packages/create-bison-app/template/.github/workflows/main.js.yml.ejs
+++ b/packages/create-bison-app/template/.github/workflows/main.js.yml.ejs
@@ -76,7 +76,7 @@ jobs:
 
       # E2E Tests via Cypress
       - name: Run Cypress E2E Tests
-        uses: cypress-io/github-action@v2
+        uses: cypress-io/github-action@v4
         with:
           # build: yarn build
           start: yarn test:server
diff --git a/packages/create-bison-app/template/cypress.config.ts b/packages/create-bison-app/template/cypress.config.ts
new file mode 100644
index 0000000..489c47e
--- /dev/null
+++ b/packages/create-bison-app/template/cypress.config.ts
@@ -0,0 +1,13 @@
+import { defineConfig } from 'cypress';
+
+import { setupNodeEvents } from './cypress/plugins';
+
+export default defineConfig({
+  fixturesFolder: false,
+  e2e: {
+    setupNodeEvents,
+    baseUrl: 'http://localhost:3001',
+    specPattern: 'tests/e2e/**/*.cy.{ts,tsx}',
+    excludeSpecPattern: ['tsconfig.json'],
+  },
+});
diff --git a/packages/create-bison-app/template/cypress.json b/packages/create-bison-app/template/cypress.json
deleted file mode 100644
index aebaefb..0000000
--- a/packages/create-bison-app/template/cypress.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "baseUrl": "http://localhost:3001",
-  "integrationFolder": "tests/e2e",
-  "fixturesFolder": false,
-  "ignoreTestFiles": ["tsconfig.json"]
-}
diff --git a/packages/create-bison-app/template/cypress/plugins/index.ts b/packages/create-bison-app/template/cypress/plugins/index.ts
index 29d15a8..ef2a4e6 100644
--- a/packages/create-bison-app/template/cypress/plugins/index.ts
+++ b/packages/create-bison-app/template/cypress/plugins/index.ts
@@ -1,6 +1,3 @@
-/// <reference types="cypress" />
-
-// import 'cypress';
 import path from 'path';
 
 import { User } from '@prisma/client';
@@ -10,27 +7,11 @@ import { LOGIN_TOKEN_KEY } from '@/constants';
 import { resetDB, disconnect, setupDB, graphQLRequest } from '@/tests/helpers';
 import * as Factories from '@/tests/factories';
 
-declare global {
-  // eslint-disable-next-line
-  namespace Cypress {
-    interface Chainable<Subject = any> {
-      task<T>(event: string, arg?: any, options?: Partial<Loggable & Timeoutable>): Chainable<T>;
-    }
-  }
+export interface LoginTaskObject {
+  token: string;
 }
 
-// ***********************************************************
-// This example plugins/index.js can be used to load plugins
-//
-// You can change the location of this file or turn off loading
-// the plugins file with the 'pluginsFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/plugins-guide
-// ***********************************************************
-
-// This function is called when a project is opened or re-opened (e.g. due to
-// the project's config changing)
+type FactoryNames = keyof typeof Factories extends `${infer T}Factory` ? T : never;
 
 if (process.env.CYPRESS_LOCAL) {
   console.log('--- WARNING --- RUNNING CYPRESS IN LOCAL MODE... database will not be cleaned');
@@ -43,15 +24,9 @@ if (process.env.CYPRESS_LOCAL) {
   require('dotenv').config({ path: envPath });
 }
 
-/**
- * @type {Cypress.PluginConfig}
- */
-export default (on, _config) => {
-  // `on` is used to hook into various events Cypress emits
-  // `config` is the resolved Cypress config
-
-  on('before:run', () => {
-    return setupDB();
+export const setupNodeEvents: Cypress.ConfigOptions['setupNodeEvents'] = (on, _config) => {
+  on('before:run', async () => {
+    await setupDB();
   });
 
   on('task', {
@@ -68,11 +43,12 @@ export default (on, _config) => {
     disconnectDB: () => {
       return disconnect();
     },
-    factory: ({ name, attrs }) => {
+    factory: ({ name, attrs }: { name: FactoryNames, attrs: any }) => {
       const Factory = Factories[`${name}Factory`];
+
       return Factory.create(attrs);
     },
-    login: (attrs: Pick<User, 'email' | 'password'>): Promise<LoginTaskObject> => {
+    login: async (attrs: Pick<User, 'email' | 'password'>): Promise<LoginTaskObject> => {
       const { email, password } = attrs;
       const variables = { email, password };
 
@@ -84,17 +60,10 @@ export default (on, _config) => {
         }
       `;
 
-      return graphQLRequest({ query, variables }).then((response) => {
-        const { token } = response.body.data.login;
-
-        cookies().set(LOGIN_TOKEN_KEY, token);
-
-        return { token };
-      });
+      const response = await graphQLRequest({ query, variables });
+      const { token } = response.body.data.login;
+      cookies().set(LOGIN_TOKEN_KEY, token);
+      return { token };
     },
   });
 };
-
-export interface LoginTaskObject {
-  token: string;
-}
diff --git a/packages/create-bison-app/template/cypress/support/commands.ts b/packages/create-bison-app/template/cypress/support/commands.ts
index fbffb8d..b990136 100644
--- a/packages/create-bison-app/template/cypress/support/commands.ts
+++ b/packages/create-bison-app/template/cypress/support/commands.ts
@@ -1,3 +1,10 @@
+/// <reference types="cypress" />
+// ***********************************************
+// For comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+
 import '@testing-library/cypress/add-commands';
 
 import { Prisma, User } from '@prisma/client';
@@ -6,29 +13,14 @@ import { LOGIN_TOKEN_KEY } from '@/constants';
 import { LoginTaskObject } from '@/cypress/plugins';
 
 declare global {
-  // eslint-disable-next-line
   namespace Cypress {
     interface Chainable {
       login: typeof login;
+      createUserAndLogin: typeof createUserAndLogin;
     }
   }
 }
 
-// -- This is a parent command --
-// Cypress.Commands.add("login", (email, password) => { ... })
-//
-//
-// -- This is a child command --
-// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
-//
-//
-// -- This is a dual command --
-// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
-//
-//
-// -- This will overwrite an existing command --
-// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
-
 /**
  *  Handles logging a user in via email and password.
  *  This should be used to login in future e2e tests instead of the login form.
@@ -46,13 +38,13 @@ function login(attrs: Pick<User, 'email' | 'password'>) {
  *  Handles creating and logging in a user with a set of attributes
  *  This should be used to login in future e2e tests instead of the login form.
  */
-function createUserAndLogin(args: Prisma.UserCreateInput) {
+function createUserAndLogin(args: Partial<Prisma.UserCreateInput> = {}) {
   const attrs = {
     ...args,
     password: args?.password || 'abcd1234',
   };
 
-  return cy.task('factory', { name: 'User', attrs }).then((user: User) => {
+  return cy.task<User>('factory', { name: 'User', attrs }).then((user) => {
     return login({ email: user.email, password: attrs.password }).then(() => user);
   });
 }
diff --git a/packages/create-bison-app/template/cypress/support/index.ts b/packages/create-bison-app/template/cypress/support/e2e.ts
similarity index 92%
rename from packages/create-bison-app/template/cypress/support/index.ts
rename to packages/create-bison-app/template/cypress/support/e2e.ts
index 310c761..e6ce68a 100644
--- a/packages/create-bison-app/template/cypress/support/index.ts
+++ b/packages/create-bison-app/template/cypress/support/e2e.ts
@@ -1,5 +1,5 @@
 // ***********************************************************
-// This example support/index.js is processed and
+// This example support/e2e.ts is processed and
 // loaded automatically before your test files.
 //
 // This is a great place to put global configuration and
diff --git a/packages/create-bison-app/template/cypress/tsconfig.json b/packages/create-bison-app/template/cypress/tsconfig.json
index 21c2f87..7c94e29 100644
--- a/packages/create-bison-app/template/cypress/tsconfig.json
+++ b/packages/create-bison-app/template/cypress/tsconfig.json
@@ -3,12 +3,8 @@
   "compilerOptions": {
     "target": "es2015",
     "lib": ["es5", "dom"],
-    "types": ["cypress", "@testing-library/cypress", "node"],
-    "module": "commonjs",
-    "sourceMap": false,
-    "inlineSourceMap": true,
-    "noImplicitAny": false
+    "types": ["cypress", "@testing-library/cypress", "node"]
   },
-  "include": ["**/*.ts"],
+  "include": ["**/*.ts", "../cypress.config.ts"],
   "exclude": []
 }
diff --git a/packages/create-bison-app/template/package.json.ejs b/packages/create-bison-app/template/package.json.ejs
index 6216dde..3244255 100644
--- a/packages/create-bison-app/template/package.json.ejs
+++ b/packages/create-bison-app/template/package.json.ejs
@@ -97,10 +97,10 @@
     "commander": "^8.1.0",
     "concurrently": "^7.1.0",
     "cross-env": "^7.0.3",
-    "cypress": "^9.6.0",
+    "cypress": "^10.3.0",
     "eslint": "^8.18.0",
     "eslint-config-next": "^12.1.6",
-    "eslint-plugin-cypress": "^2.11.1",
+    "eslint-plugin-cypress": "^2.12.1",
     "eslint-plugin-echobind": "^0.3.0",
     "eslint-plugin-import": "^2.26.0",
     "eslint-plugin-prettier": "^4.0.0",
diff --git a/packages/create-bison-app/template/tsconfig.json b/packages/create-bison-app/template/tsconfig.json
index f80df6d..849bc87 100644
--- a/packages/create-bison-app/template/tsconfig.json
+++ b/packages/create-bison-app/template/tsconfig.json
@@ -45,6 +45,8 @@
   ],
   "exclude": [
     "node_modules",
-    "cypress"
+    "cypress",
+    "cypress.config.ts",
+    "**/*.cy.ts"
   ]
 }
diff --git a/yarn.lock b/yarn.lock
index e3b3daf..f588911 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1988,10 +1988,10 @@ async-lock@^1.1.0:
   resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.3.0.tgz#0fba111bea8b9693020857eba4f9adca173df3e5"
   integrity sha512-8A7SkiisnEgME2zEedtDYPxUPzdv3x//E7n5IFktPAtMYSEAV7eNJF0rMwrVyUFj6d/8rgajLantbjcNRQYXIg==
 
-async@0.9.x:
-  version "0.9.2"
-  resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
-  integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=
+async@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9"
+  integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==
 
 asynckit@^0.4.0:
   version "0.4.0"
@@ -2323,7 +2323,7 @@ chalk@^1.0.0, chalk@^1.1.3:
     strip-ansi "^3.0.0"
     supports-color "^2.0.0"
 
-chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
+chalk@^2.0.0, chalk@^2.4.1:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
   integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -2332,7 +2332,7 @@ chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
     escape-string-regexp "^1.0.5"
     supports-color "^5.3.0"
 
-chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1:
+chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
   integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -2825,7 +2825,7 @@ decimal.js@^10.2.1:
 decode-uri-component@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
-  integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+  integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==
 
 decompress-response@^4.2.0:
   version "4.2.1"
@@ -3005,13 +3005,20 @@ ejs-lint@^1.1.0:
     syntax-error "^1.1.6"
     yargs "^16.0.0"
 
-ejs@3.1.6, ejs@^3.1.5:
+ejs@3.1.6:
   version "3.1.6"
   resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a"
   integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==
   dependencies:
     jake "^10.6.1"
 
+ejs@^3.1.5:
+  version "3.1.7"
+  resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.7.tgz#c544d9c7f715783dd92f0bddcf73a59e6962d006"
+  integrity sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==
+  dependencies:
+    jake "^10.8.5"
+
 electron-to-chromium@^1.3.846:
   version "1.3.846"
   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.846.tgz#a55fd59613dbcaed609e965e3e88f42b08c401d3"
@@ -3370,7 +3377,7 @@ fill-range@^7.0.1:
 filter-obj@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
-  integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs=
+  integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==
 
 find-up@^2.0.0:
   version "2.1.0"
@@ -3485,7 +3492,16 @@ get-caller-file@^2.0.5:
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
   integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
 
-get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
+get-intrinsic@^1.0.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
+  integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
+  dependencies:
+    function-bind "^1.1.1"
+    has "^1.0.3"
+    has-symbols "^1.0.3"
+
+get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
   integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
@@ -3725,6 +3741,11 @@ has-symbols@^1.0.1, has-symbols@^1.0.2:
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
   integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
 
+has-symbols@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+  integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
 has-tostringtag@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
@@ -4247,11 +4268,11 @@ is-regex@^1.1.4:
     has-tostringtag "^1.0.0"
 
 is-ssh@^1.3.0:
-  version "1.3.3"
-  resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.3.tgz#7f133285ccd7f2c2c7fc897b771b53d95a2b2c7e"
-  integrity sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ==
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2"
+  integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==
   dependencies:
-    protocols "^1.1.0"
+    protocols "^2.0.1"
 
 is-stream@^1.1.0:
   version "1.1.0"
@@ -4390,13 +4411,13 @@ istanbul-reports@^3.1.3:
     html-escaper "^2.0.0"
     istanbul-lib-report "^3.0.0"
 
-jake@^10.6.1:
-  version "10.8.2"
-  resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b"
-  integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==
+jake@^10.6.1, jake@^10.8.5:
+  version "10.8.5"
+  resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46"
+  integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==
   dependencies:
-    async "0.9.x"
-    chalk "^2.4.2"
+    async "^3.2.3"
+    chalk "^4.0.2"
     filelist "^1.0.1"
     minimatch "^3.0.4"
 
@@ -5768,11 +5789,16 @@ object-copy@^0.1.0:
     define-property "^0.2.5"
     kind-of "^3.0.3"
 
-object-inspect@^1.11.0, object-inspect@^1.9.0:
+object-inspect@^1.11.0:
   version "1.11.0"
   resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
   integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
 
+object-inspect@^1.9.0:
+  version "1.12.2"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
+  integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
+
 object-keys@^1.0.12, object-keys@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
@@ -6024,10 +6050,10 @@ parse-json@^5.0.0, parse-json@^5.2.0:
     json-parse-even-better-errors "^2.3.0"
     lines-and-columns "^1.1.6"
 
-parse-path@^4.0.0:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf"
-  integrity sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==
+parse-path@^4.0.4:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.4.tgz#4bf424e6b743fb080831f03b536af9fc43f0ffea"
+  integrity sha512-Z2lWUis7jlmXC1jeOG9giRO2+FsuyNipeQ43HAjqAZjwSe3SEf+q/84FGPHoso3kyntbxa4c4i77t3m6fGf8cw==
   dependencies:
     is-ssh "^1.3.0"
     protocols "^1.4.0"
@@ -6035,13 +6061,13 @@ parse-path@^4.0.0:
     query-string "^6.13.8"
 
 parse-url@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.0.tgz#f5dd262a7de9ec00914939220410b66cff09107d"
-  integrity sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw==
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.2.tgz#4a30b057bfc452af64512dfb1a7755c103db3ea1"
+  integrity sha512-uCSjOvD3T+6B/sPWhR+QowAZcU/o4bjPrVBQBGFxcDF6J6FraCGIaDBsdoQawiaaAVdHvtqBe3w3vKlfBKySOQ==
   dependencies:
     is-ssh "^1.3.0"
     normalize-url "^6.1.0"
-    parse-path "^4.0.0"
+    parse-path "^4.0.4"
     protocols "^1.4.0"
 
 parse5@6.0.1:
@@ -6210,11 +6236,16 @@ proto-list@~1.2.1:
   resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
   integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
 
-protocols@^1.1.0, protocols@^1.4.0:
+protocols@^1.4.0:
   version "1.4.8"
   resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8"
   integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==
 
+protocols@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86"
+  integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==
+
 psl@^1.1.28, psl@^1.1.33:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
@@ -6239,9 +6270,9 @@ q@^1.5.1:
   integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
 
 qs@^6.9.4:
-  version "6.10.1"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
-  integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+  version "6.11.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
+  integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
   dependencies:
     side-channel "^1.0.4"
 
@@ -6934,7 +6965,7 @@ static-extend@^0.1.1:
 strict-uri-encode@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
-  integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
+  integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==
 
 string-length@^4.0.1:
   version "4.0.2"


Test patch:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index b81a0a0..ebba065 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -107,7 +107,7 @@ jobs:
         run: yarn test:ci
 
       - name: Run bison app E2E tests
-        uses: cypress-io/github-action@v2
+        uses: cypress-io/github-action@v4
         with:
           start: yarn test:server
           wait-on: "http://localhost:3001"
diff --git a/packages/create-bison-app/template/tests/e2e/login.test.js b/packages/create-bison-app/template/tests/e2e/login.cy.ts
similarity index 74%
rename from packages/create-bison-app/template/tests/e2e/login.test.js
rename to packages/create-bison-app/template/tests/e2e/login.cy.ts
index dafe3c4..8991d0f 100644
--- a/packages/create-bison-app/template/tests/e2e/login.test.js
+++ b/packages/create-bison-app/template/tests/e2e/login.cy.ts
@@ -1,15 +1,20 @@
+import { User } from '@prisma/client';
+
 describe('Login', () => {
   describe('with an email that doesnt exist', () => {
     it('shows an error', () => {
       const email = 'nowayshouldIexist@wee.net';
       const password = 'test1234';
 
+      cy.intercept('POST', '/api/graphql').as('loginMutation');
       cy.visit('/');
       cy.findByText(/login/i).click();
 
+      cy.location('pathname').should('equal', '/login');
       cy.findByLabelText(/email/i).type(email);
       cy.findByLabelText(/password/i).type(password);
       cy.findAllByRole('button', { name: /login/i }).click();
+      cy.wait('@loginMutation');
 
       cy.findByText(/is invalid/i).should('exist');
     });
@@ -20,7 +25,8 @@ describe('Login', () => {
       const attrs = { password: 'superawesome' };
 
       // note: async/await breaks cypress 😭
-      cy.task('factory', { name: 'User', attrs }).then((user) => {
+      cy.task<User>('factory', { name: 'User', attrs }).then((user) => {
+        cy.intercept('POST', '/api/graphql').as('loginMutation');
         cy.visit('/');
         cy.findByText(/login/i).click();
 
@@ -28,6 +34,7 @@ describe('Login', () => {
         cy.findByLabelText(/email/i).type(user.email);
         cy.findByLabelText(/password/i).type(attrs.password);
         cy.findAllByRole('button', { name: /login/i }).click();
+        cy.wait('@loginMutation');
 
         cy.findByText(/logout/i).should('exist');
         cy.location('pathname').should('equal', '/');
diff --git a/packages/create-bison-app/template/tests/e2e/logout.test.js b/packages/create-bison-app/template/tests/e2e/logout.cy.ts
similarity index 100%
rename from packages/create-bison-app/template/tests/e2e/logout.test.js
rename to packages/create-bison-app/template/tests/e2e/logout.cy.ts
diff --git a/packages/create-bison-app/template/tests/e2e/tsconfig.json b/packages/create-bison-app/template/tests/e2e/tsconfig.json
index 5481021..688e4a1 100644
--- a/packages/create-bison-app/template/tests/e2e/tsconfig.json
+++ b/packages/create-bison-app/template/tests/e2e/tsconfig.json
@@ -1,4 +1,7 @@
 {
   "extends": "../../cypress/tsconfig.json",
-  "include": ["../**/*.ts"]
-}
+  "compilerOptions": {
+    "isolatedModules": false
+  },
+  "include": ["../../cypress/**/*.ts", "../../cypress.config.ts", "../**/*.ts"]
+}
\ No newline at end of file
diff --git a/packages/create-bison-app/test/tasks/copyFiles.test.js b/packages/create-bison-app/test/tasks/copyFiles.test.js
index e455e5e..7592f9f 100644
--- a/packages/create-bison-app/test/tasks/copyFiles.test.js
+++ b/packages/create-bison-app/test/tasks/copyFiles.test.js
@@ -80,7 +80,7 @@ describe("copyFiles", () => {
         ".tool-versions",
         "codegen.yml",
         "constants.ts",
-        "cypress.json",
+        "cypress.config.ts",
         "jest.config.js",
         "next-env.d.ts",
         "prettier.config.js",
@@ -158,7 +158,7 @@ describe("copyFiles", () => {
     });
 
     it("copies e2e tests", async () => {
-      const files = [".eslintrc.json", "login.test.js"];
+      const files = [".eslintrc.json", "login.cy.ts", "logout.cy.ts", "tsconfig.json"];
 
       files.forEach((file) => {
         const filePath = path.join(targetFolder, "tests", "e2e", file);