<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nathan Sheryak</title>
    <description>The latest articles on DEV Community by Nathan Sheryak (@nathan_sheryak).</description>
    <link>https://dev.to/nathan_sheryak</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F621749%2Fb5de11de-7144-45d9-9cff-0d007457ffbb.jpeg</url>
      <title>DEV Community: Nathan Sheryak</title>
      <link>https://dev.to/nathan_sheryak</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nathan_sheryak"/>
    <language>en</language>
    <item>
      <title>How to test a TypeScript Express API with Jest (for Dummies... like me)</title>
      <dc:creator>Nathan Sheryak</dc:creator>
      <pubDate>Sat, 26 Mar 2022 20:19:32 +0000</pubDate>
      <link>https://dev.to/nathan_sheryak/how-to-test-a-typescript-express-api-with-jest-for-dummies-like-me-4epd</link>
      <guid>https://dev.to/nathan_sheryak/how-to-test-a-typescript-express-api-with-jest-for-dummies-like-me-4epd</guid>
      <description>&lt;p&gt;&lt;em&gt;Don't like reading? Only want to see code? Here is the &lt;a href="https://github.com/N8ers/ts-express-jest-supertest" rel="noopener noreferrer"&gt;github repo&lt;/a&gt; :)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Opening
&lt;/h2&gt;

&lt;p&gt;If you've been scratching your head trying to test your new TypeScript Express API - I've been there. And I'd love to save you some time.&lt;/p&gt;

&lt;p&gt;I was trying my hand at converting a Node and Express api to use TypeScript. All was going well until I got to testing and I started having all of these existential questions. Like &lt;code&gt;do I need to 'build' my test files?&lt;/code&gt;, &lt;code&gt;do my config files need to be 'built'?&lt;/code&gt;, and &lt;code&gt;why did i decide to use TypeScript when my API already worked!?&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This article can answer &lt;em&gt;some&lt;/em&gt; of those questions. It also assumes you know a little bit about the technologies the project uses (&lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt;, &lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;Node&lt;/a&gt;, &lt;a href="https://expressjs.com/" rel="noopener noreferrer"&gt;Express&lt;/a&gt;, &lt;a href="https://github.com/visionmedia/supertest#readme" rel="noopener noreferrer"&gt;SuperTest&lt;/a&gt;, and &lt;a href="https://jestjs.io/" rel="noopener noreferrer"&gt;Jest&lt;/a&gt;) - this is more of a project structure guide than an in-depth look at the technologies used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Initialize project and import the imports
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a directory for your project and &lt;code&gt;cd&lt;/code&gt; into it.&lt;/li&gt;
&lt;li&gt;Use &lt;a href="https://docs.npmjs.com/" rel="noopener noreferrer"&gt;NPM&lt;/a&gt; to initialize the project &lt;code&gt;npm init -y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Import dependencies &lt;code&gt;npm i express&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Import dev-dependencies &lt;code&gt;npm i --save-dev typescript supertest nodemon jest ts-jest ts-node @types/jest @types/supertest @types/express&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Initialize TypeScript
&lt;/h2&gt;

&lt;p&gt;Now let's add TypeScript to our project.&lt;br&gt;
&lt;code&gt;npx tsc --init&lt;/code&gt;&lt;br&gt;
The above command will generate a &lt;code&gt;tsconfig.json&lt;/code&gt; file. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkheeahvk0ljkfbg7hca0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkheeahvk0ljkfbg7hca0.jpg" alt="Image description" width="248" height="117"&gt;&lt;/a&gt;&lt;br&gt;
You'll want to modify it with the below. Not every item is necessary, feel free to further configure it to match your needs.&lt;br&gt;
A quick note on the &lt;code&gt;exclude&lt;/code&gt; value, these are files that the build will ignore. Not all of them exist yet ;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "exclude": ["./coverage", "./dist", "__tests__", "jest.config.js"],
  "ts-node": {
    "transpileOnly": true,
    "files": true
  },
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs",
    "rootDir": "./src",
    "moduleResolution": "node",
    "checkJs": true,
    "outDir": "./dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "noImplicitAny": true,
    "skipLibCheck": true
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Initialize Jest
&lt;/h2&gt;

&lt;p&gt;Up next, we want to add the Jest testing framework to our project.&lt;br&gt;
&lt;code&gt;npx ts-jest config:init&lt;/code&gt;&lt;br&gt;
The above command will generate a &lt;code&gt;jest.config.js&lt;/code&gt; file. You'll want to modify it with the below, so it works with &lt;code&gt;ts-jest&lt;/code&gt; (this is what makes jest work with TypeScript).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1i5t0rifj57h9nqdw8zj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1i5t0rifj57h9nqdw8zj.jpg" alt="Image description" width="245" height="125"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = {
  preset: "ts-jest",
  testEnvironment: "node",
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create a basic Express app with TypeScript
&lt;/h2&gt;

&lt;p&gt;We'll need to create a &lt;code&gt;src&lt;/code&gt; directory with two TypeScript files in it: &lt;code&gt;app.ts&lt;/code&gt; and &lt;code&gt;server.ts&lt;/code&gt;. In the &lt;code&gt;src&lt;/code&gt; directory, we want to add another directory: &lt;code&gt;routes&lt;/code&gt;. In the &lt;code&gt;routes&lt;/code&gt; directory we want to add a &lt;code&gt;user.routes.ts&lt;/code&gt; file.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbin9bkrumyvs3p85zcd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbin9bkrumyvs3p85zcd.jpg" alt="Image description" width="244" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;app.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import express, { Application, Request, Response, NextFunction } from "express";

import { router as userRoutes } from "./routes/user.routes";

const app: Application = express();

app.use("/users", userRoutes);

app.use("/", (req: Request, res: Response, next: NextFunction): void =&amp;gt; {
  res.json({ message: "Allo! Catch-all route." });
});

export default app;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;server.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import app from "./app";

const PORT: Number = 5050;

app.listen(PORT, (): void =&amp;gt; console.log(`running on port ${PORT}`));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;user.routes.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Router, Request, Response } from "express";

const router = Router();

router.get("/", (req: Request, res: Response): void =&amp;gt; {
  let users = ["Goon", "Tsuki", "Joe"];
  res.status(200).send(users);
});

export { router };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configure &lt;code&gt;package.json&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Let's configure our &lt;code&gt;package.json&lt;/code&gt; to use our new tools! To the &lt;code&gt;scripts&lt;/code&gt; section add the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scripts: {
  "test": "jest --coverage",
  "dev": "nodemon ./src/server.ts",
  "build": "tsc"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Making sure our API is working
&lt;/h2&gt;

&lt;p&gt;Now let's be sure we haven't made any mistakes so far. Run the command &lt;code&gt;npm run dev&lt;/code&gt;. Open a browser and go to &lt;code&gt;http://localhost:5050/&lt;/code&gt;. You should be greeted with the welcome message we defined on line 10 of app.js &lt;code&gt;Allo! Catch-all route.&lt;/code&gt;. Now try out our user route &lt;code&gt;http://localhost:5050/users&lt;/code&gt;, where you should find a list of our users from user.routes.ts &lt;code&gt;["Goon", "Tsuki", "Joe"]&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing our tests
&lt;/h2&gt;

&lt;p&gt;Now for the moment you've been waiting for... testing.&lt;br&gt;
in our project add a &lt;code&gt;__tests__&lt;/code&gt; directory. In that directory we'll duplicate the file structure we made in the &lt;code&gt;src&lt;/code&gt; directory. Creating a &lt;code&gt;app.test.ts&lt;/code&gt;, &lt;code&gt;server.test.ts&lt;/code&gt;, and &lt;code&gt;routes/user.routes.test.ts&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2issq2hp0kshqlu9z2dr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2issq2hp0kshqlu9z2dr.jpg" alt="Image description" width="209" height="305"&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's write our first test, just to make sure jest is working.&lt;br&gt;
&lt;code&gt;server.test.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;describe("Server.ts tests", () =&amp;gt; {
  test("Math test", () =&amp;gt; {
    expect(2 + 2).toBe(4);
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we'll us SuperTest to make a network request test.&lt;br&gt;
&lt;code&gt;app.test.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import request from "supertest";

import app from "../src/app";

describe("Test app.ts", () =&amp;gt; {
  test("Catch-all route", async () =&amp;gt; {
    const res = await request(app).get("/");
    expect(res.body).toEqual({ message: "Allo! Catch-all route." });
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now our last test will test our &lt;code&gt;users&lt;/code&gt; route.&lt;br&gt;
&lt;code&gt;user.routes.test.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import request from "supertest";

import app from "../../src/app";

describe("User routes", () =&amp;gt; {
  test("Get all users", async () =&amp;gt; {
    const res = await request(app).get("/users");
    expect(res.body).toEqual(["Goon", "Tsuki", "Joe"]);
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add a &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Now as a git cleanliness note, create a &lt;code&gt;.gitignore&lt;/code&gt; file.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvni2im2ojblvbnv05b7y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvni2im2ojblvbnv05b7y.jpg" alt="Image description" width="217" height="324"&gt;&lt;/a&gt;&lt;br&gt;
In there we can add some files that we want git to ignore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
coverage
jest.config.js
dist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Setting up testing in a TypeScript/Express API took me a considerable amount of time. And I was really surprised how few resources I found. I hope this helps you in any TypeScript testing predicament you might find your self in. &lt;br&gt;
I'm not a TypeScript authority, I'm just happy I was able to get this working. So if you have notes on what your own setup is like, or advice on making this setup better - feel free to reach out or comment :)&lt;/p&gt;

&lt;p&gt;If you liked the article or want to see more of my work, feel free to check out my &lt;a href="https://nathansheryak.com/" rel="noopener noreferrer"&gt;portfolio&lt;/a&gt; and &lt;a href="https://github.com/N8ers" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>jest</category>
      <category>express</category>
      <category>node</category>
    </item>
    <item>
      <title>Crafting a Dark Mode switch with Vuetify</title>
      <dc:creator>Nathan Sheryak</dc:creator>
      <pubDate>Wed, 28 Apr 2021 11:24:18 +0000</pubDate>
      <link>https://dev.to/nathan_sheryak/crafting-a-dark-mode-switch-with-vuetify-2ea8</link>
      <guid>https://dev.to/nathan_sheryak/crafting-a-dark-mode-switch-with-vuetify-2ea8</guid>
      <description>&lt;p&gt;This tutorial will show how to create a dark mode toggle using &lt;a href="https://vuetifyjs.com/en/"&gt;Vuetify&lt;/a&gt;. This tutorial assumes you already have a Vue2 app with Vuetify. At the time of writing this article Vuetify doesn't fully support Vue3. &lt;br&gt;
Here is an accompanying &lt;a href="https://github.com/N8ers/vuetify-dark-mode"&gt;GitHub repository&lt;/a&gt; if you'd like to have a working copy to clone.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Modifying vuetify.js
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;vuetify.js&lt;/code&gt; is a file that gets created when you first add Vuetify to your Vue application. It can be found here: &lt;code&gt;src/plugins/vuetify.js&lt;/code&gt;. We will make the modifications below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Vue&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Vuetify&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vuetify/lib/framework&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;colors&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vuetify/lib/util/colors&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;Vue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Vuetify&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Vuetify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;themes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;green&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accent3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deepOrange&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lighten1&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#90CAF9&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#E91E63&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can set these colors to be what ever you'd like, just make sure if you have a &lt;code&gt;primary&lt;/code&gt; color for your &lt;code&gt;light theme&lt;/code&gt; that you have one for your &lt;code&gt;dark theme&lt;/code&gt; as well.&lt;/p&gt;

&lt;p&gt;If you want to use the colors built into Vuetify, make sure you import the color library on line 3. You can always use hex instead, but you will need to place it in quotes (I did that in the dark theme as an example).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Adding a toggle
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://vuetifyjs.com/en/components/switches/"&gt;documentation on vuetify switches&lt;/a&gt; uses a &lt;code&gt;v-model&lt;/code&gt; to bind the data. We want to break that &lt;code&gt;v-model&lt;/code&gt; out into a &lt;code&gt;:value=""&lt;/code&gt; that reads the data from the data object, and an &lt;code&gt;@change=""&lt;/code&gt; that will trigger a method. This setup allows for greater flexibility on &lt;em&gt;what&lt;/em&gt; the switch will do.&lt;br&gt;
Inside of the &lt;code&gt;toggleDarkMode()&lt;/code&gt; we want to switch the Vuetify theme. We can access the Vuetify theme using &lt;code&gt;this.$vuetify.theme&lt;/code&gt;, here is the documentation for it: &lt;a href="https://vuetifyjs.com/en/features/theme/#light-and-dark"&gt;this.$vuetify.theme&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;v-app&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;v-app-bar&lt;/span&gt; &lt;span class="na"&gt;app&lt;/span&gt; &lt;span class="na"&gt;color=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Dark Mode Toggle&lt;span class="nt"&gt;&amp;lt;/v-app-bar&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;v-main&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;v-container&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;v-switch&lt;/span&gt; 
          &lt;span class="na"&gt;:value=&lt;/span&gt;&lt;span class="s"&gt;"darkMode"&lt;/span&gt; 
          &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;change=&lt;/span&gt;&lt;span class="s"&gt;"toggleDarkMode"&lt;/span&gt; 
          &lt;span class="na"&gt;:label=&lt;/span&gt;&lt;span class="s"&gt;"`toggle $&lt;/span&gt;{switchLabel} mode`"
        &amp;gt;&lt;span class="nt"&gt;&amp;lt;/v-switch&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;v-col&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;I am a primary card&lt;span class="nt"&gt;&amp;lt;/v-col&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;v-col&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"secondary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;I am a secondary card&lt;span class="nt"&gt;&amp;lt;/v-col&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/v-container&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/v-main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/v-app&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; 
      &lt;span class="na"&gt;darkMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;toggleDarkMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$vuetify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$vuetify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;darkMode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;darkMode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;switchLabel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;darkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There you have it! A switch that toggles between a light and dark theme!&lt;/p&gt;

&lt;p&gt;Vuetify is a living, changing UI Library. Specifics of this article may change over time. If you notice something is out of date, feel free to contact me. Happy designing!&lt;/p&gt;

</description>
      <category>vue</category>
      <category>vuetify</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
