Understanding Zod Schema Validation
Zod Validation in React (Complete Tutorial)
Estimated read time: 1:20
Summary
In this comprehensive tutorial video by Cosden Solutions, you'll explore the complete process of using Zod for data validation within React applications. The creator starts by introducing Zod as a TypeScript-first schema validation library, emphasizing its compatibility with both TypeScript and JavaScript. The video guides viewers through the steps of creating and using schemas, including various types of properties and modifiers. It further demonstrates integrating Zod with real-world use cases, such as form validation using React Hook Form and secure API requests. The creator provides insightful tips and best practices for leveraging Zod, making it an essential tool for developers aiming to enhance their data validation processes.
Highlights
- Zod enhances data validation by integrating directly into your React applications. 🌟
- Schema validation with Zod prevents invalid data with clear, verbose error messaging. 🛠️
- Integrating Zod with React Hook Form simplifies the process of handling form data. ✨
- Use Zod's safeParse function to handle validation errors without crashing your app. 🚀
- Extract TypeScript types from Zod schemas for type-safe coding practices across projects. 🤖
- Utilize Zod in backend processes for a unified data validation strategy. 🔁
Key Takeaways
- Zod is a TypeScript-first schema validation library that works well with both TypeScript and JavaScript. 📜
- Zod can create and validate schemas with a variety of properties like strings, numbers, and booleans. 🎨
- The library supports modifiers for validations, such as checking if emails or URLs are valid. 🏷️
- Zod schemas can be integrated with React Hook Form to automate form validation. 🧙♂️
- Using safeParse prevents your application from crashing by handling validation errors smoothly. 🛡️
- Environment variables can be validated at runtime using Zod to ensure security and type safety. 🌍
Overview
The video kicks off with an introduction to Zod, a flexible schema validation library particularly well-suited to TypeScript users. It discusses the benefits of using Zod in both JavaScript and TypeScript contexts, explaining how to set up and handle different types of data schemas within your React applications.
Delving deeper, the tutorial illustrates specific examples of defining schemas, including optional and nullable fields, and using built-in modifiers for common data types. Viewers are shown how to apply these schemas in practical scenarios, such as form validation with React Hook Form, which automates and simplifies the data handling process.
Finally, the creator shares expert tips on using Zod for API requests and environment variable validation, highlighting how it fortifies application security and maintains data integrity. This tutorial empowers viewers to leverage Zod's extensive capabilities, ultimately enhancing their coding efficiency and application reliability.
Chapters
- 00:00 - 00:30: Introduction and Course Promotion In this chapter, the focus is on introducing the subject of data validation using Zot within a React application. Additionally, there's a promotion for the instructor's course, Project React, which promises comprehensive guidance in building complex React applications.
- 00:30 - 01:00: Introduction to Zod Validation The chapter introduces Zot validation in React, highlighting its unique application through a custom platform called Project React, which students have found valuable. The focus then shifts to Zot.dev, the official homepage, where Zot is described as a TypeScript-first schema validation library.
- 01:00 - 05:00: Basic Schema Definition The chapter discusses the use of a static type inference library for schema validation. It explains how you can create a schema, define property types, and validate data against this schema, with error notifications for invalid data. The library supports TypeScript, allowing automatic inference of types from the schema for application-wide use. It also clarifies that even though TypeScript is supported, the library works efficiently with JavaScript as well.
- 05:00 - 09:00: Advanced Schema Features The chapter delves into advanced schema features with a focus on using Zot for data validation. The author emphasizes the importance of combining Zot with TypeScript for optimal performance and compatibility. Since Zot supports TypeScript effectively, the guide suggests configuring TypeScript with strict mode enabled in the tsconfig.json file to ensure thorough validation and type-checking, which is typically the default setting in most TypeScript configurations.
- 09:00 - 12:00: Integrating Zod with TypeScript The chapter "Integrating Zod with TypeScript" focuses on the installation and basic setup of Zod in a TypeScript project. It begins with ensuring that strict mode is enabled in the tsconfig.json file. The speaker then demonstrates how to install Zod using the package manager pnpm. After installation, they rerun the development server using pnpm dev. The chapter aims to provide an understanding of the initial steps needed to integrate Zod with a TypeScript project before diving into more detailed aspects or usage of Zod.
- 12:00 - 29:00: Real World Applications of Zod in React The chapter introduces the concept of defining a schema and individual properties using Zot in a React application. It explores the practical application of Zot schemas in React development, emphasizing the importance of understanding where it's logical to use them. The chapter also discusses the scenarios in which validation is necessary within React projects and highlights the common uses of schemas. It provides insight into what React developers typically encounter when working on real-world projects in companies or teams. The chapter starts with a review of Zot basics before delving into specific applications within React.
- 29:00 - 30:00: Conclusion and Call to Action In this chapter, the focus is on setting up a schema for an application by using the library Zot. The chapter begins with the instructor showing how to import the necessary component, identified as 'Z', from Zot, which will be utilized for schema creation. The chapter proceeds by guiding the reader through the process of defining a simple user schema that represents a user within an application, using the imported 'Z' component. This chapter is crafted as a foundational step in understanding how to structure user data within an application context.
Zod Validation in React (Complete Tutorial) Transcription
- 00:00 - 00:30 In this video, I'm going to teach you everything that you need to know about validating your data with Zot in the context of a React application. But before we get into that, I just want to quickly mention that if you enjoy the way that I teach in my videos, and you're also serious about learning React, you should definitely check out my course Project React, which is going to teach you everything that you need to be able to be a great React developer. You are going to be building a built in complex application with a lot of moving parts, and you're going to be taught and showed how to do it every single step of the way. It's a course that is totally unique.
- 00:30 - 01:00 There's like a custom application that you get to work with that I haven't seen anyone else do. And all the students that have been on the course have been enjoying it, and they haven't regretted it. And I wish the same for you. If that sounds interesting, it's called Project React, and it's going to be the first link in the description. Cool. With that being said, now let's talk about Zot validation in React. All right, so let's begin. So over here, we have Zot.dev, which is the official homepage of Zot. So what is Zot? Zot is, as here, you can see a TypeScript first schema
- 01:00 - 01:30 validation with static type inference library. So essentially, you're able to create a schema, define what types of properties your schema has, and Zot is going to be able to validate any data that you pass against that schema and throw errors if it's not valid. And also it has TypeScript for support, which means that you can automatically infer all of the types directly from your schema to be able to use across your entire application. Now, it's important to note that you don't need to use TypeScript to be able to work with Zot. Zot also supports and works very well with JavaScript.
- 01:30 - 02:00 However, if you're going through the lengths of actually using Zot to validate your data, I would personally recommend that you also use TypeScript. And for the rest of this video, we are going to be working in TypeScript because it just makes sense and Zot supports it really well. So the first step for us to do is to come here and actually go to the installation. So we're going to click here. And let's see, it's going to take us to the installation. And then the only thing that you have to make sure is that if you are working in TypeScript, you have to enable the strict mode in tsconfig.json, which for the most part should already be enabled because most configurations
- 02:00 - 02:30 have strict mode enabled by default. But if it's not checking your tsconfig.json, and just enable it. And then we're going to come here. And we're going to take our command pnpm add Zot. And I'm going to come here into my editor, where is it, open up the terminal, cancel this, and we're just going to install Zot inside of our project. Now that we have Zot installed, I'm just going to rerun the dev server in case that we need it. So we're going to pnpm dev. And then we have here a working file, which I'm going to start by first showing you the basics of Zot,
- 02:30 - 03:00 right? So how to define a schema, how to define individual properties. And then I'm going to show you how you would actually use that in the context of a React application. So where does it make sense as a React developer who's working in building in React to have Zot schemas, right? What should you validate? What should you have a schema for? And what is most commonly used? And what are you most likely to see if you work in React in a real project at a company or some sort of team. So let's begin by just going over the basics of Zot. So over here at the top,
- 03:00 - 03:30 I'm going to make a new line. And then outside of the component, I'm just going to import here, I'm going to import Z from Zot like this Z is going to be what we're going to be used to be able to create a schema. And then here, I'm going to come here and start defining my schema, we're going to keep things simple, we're just going to do a user schema to represent a user that we would have in our application. So let's come here and we're going to do const user schema. And here we're going to do z. And then if I push dot over here, you're going to see all of the options
- 03:30 - 04:00 that we can actually add with z. And there's a lot of them, this might seem intimidating, you don't have to know all of them. So don't worry about that. But one that we're going to use right now, as you can see here, we have no we have nullable, we have number we have object, we're going to use the object property, because we're going to define an object to represent our user schema, which is pretty typical. So we're going to select object over here. And then we're going to call it with a parenthesis. And then we have to give it here the shape of the object. As you can see here, this is a Zot raw shape, this is going to define what properties is our user schema going to have,
- 04:00 - 04:30 right? What properties is our user going to have. So this is going to be an object over here. And we can come here. And we can start defining some properties. Now before we do that, look at this code right here. This is the basics of Zot, we created a user schema, usually you call it schema, because that's usually related to Zod. And then you define an object, if your schema is an object, which in most cases, it is going to be, it doesn't mean that it's always going to be. But in our case, a user is going to have properties, so an object makes sense. And then inside of here, you also use z dot something to define the individual properties of your schema,
- 04:30 - 05:00 which in our case, again, is an object. So for example, since we have a user, what we can do is we can do something like first name, right, and this is going to be z. And now instead of string, I'm going to instead of object, sorry, I'm going to do a string like this, right, we can call this as a string. And now we've defined that our user schema is going to have a first name property, which is going to be of type string, which means that we're going to be able to use this schema and pass any object into it as data. And then it's going to validate and check that that object has
- 05:00 - 05:30 a first name property, and that we're passing a string as a first name property, right. So that's how that works. So for example, we can come here and we can define our user. So we can do const user. And we can make this equal to an object over here. So now remember, I'm doing all of this outside of the component, because we're just going over the basics here. Afterwards, I'm going to integrate all of this with react specifically. And here we're going to do something we're going to do first name, and we're going to pass it here that is like this, which is my actual real first name.
- 05:30 - 06:00 And then if we want to actually check that this user that this object over here is valid against the user schema, we have to validate and we have to pass the schema to Zod and we have to parse it. And this is how that works. So we can come here and we can do something like console dot log. And here we can do user schema. And we can do dot parse, this is the parse function over here. And then we can pass here our user object like this, what this is going to do is this is going to take our user object, pass it to the user schema, parse it and Zod is going to automatically validate our
- 06:00 - 06:30 schema against all of these properties here. So for now, it's only going to check that it has a first name, and that this is a type string. That's all it's going to check. And because our user here has a first name property with a value of values, which is a string, this should pass and we should get our actual validation in our console. So let's check. So here I have the application running, we can see cause and solutions over here. If I now open up the console, we can see in our console, we have an object. And if I look at this object here, we have first name and then Darius, the reason
- 06:30 - 07:00 we're seeing this object is because our validation past whatever the validation passes, Zod is essentially just going to return the data that you pass into it, and then we're console logging it. So that's what we're seeing inside of the console. If however, I came in here and instead of Darius, I put a one over here, which is a number which no longer matches string, we should get an error in our console, which we can see if we come here, we have let's just refresh, we have an actual error, uncaught Zod error code, invalid type, expected string and received number instead, and the path
- 07:00 - 07:30 is first name. So these errors are very verbose, but they actually tell you exactly what's wrong with the schema, right? In this case, it told us it expected a string, but it got a number. And it expected that in the first name property, which matches exactly what we've done over here. So this is how schema validation works in Zod, you take an object, take any piece of data, and you validate it using the parse function against any schema. And Zod takes care of everything. Now, if you're using parse, this is actually going to throw an error inside of your application.
- 07:30 - 08:00 As we've seen here, this is an actual error. But sometimes you don't want to have an error thrown, you actually want to have and just know if the parse has been successful or not. And in that case, you would use a different function, you would use safe parse. So we'll come here, we remove this and we do safe parse. And this is going to do the same exact validation that we had with Zod. But it's instead not going to throw an error, it is going to return to us an object that has a success property or an error property if we have any errors. So let's come back here to
- 08:00 - 08:30 our application, let's reload. Let's make this a little bit like this. And you see now we have an object, we have a success property called false. And then we have an error property over here, which is a Zod error. And we have the same exact error as we had it before. So it hasn't thrown any error in terms of replication crashing or anything like that. Instead, it just puts the error in an object and then put success to false so that we can handle the error at a later point in our code without crashing our entire application. So if you need that, if you want to safely parse something, use the safe parse function. Now at the same time, if I come back here, and I also reput this to a
- 08:30 - 09:00 string, so we do that use again, and we save this and then come here and reload. Now you're going to see that we have success true. And then instead of an error over here, we have a data property, which is our object that has been parsed. And then we can use this to actually do something to it. This is great, because now you can pass any sort of data, any sort of value inside of any schema, you can validate it, either throw an error and crash the application or handle the error. Or you can actually have Zod return to an object with success true or false, and then handle the cases
- 09:00 - 09:30 success or not based off of that, this is really cool. It's really flexible. And you can do a lot with it. Now besides string, there's actually a lot more properties that we can do. For example, we can come here and we can do email like this. And we can do z dot string as well, we can also do string. But what I'm going to do here is I'm going to put dot email like this, what this is going to do is this is a modifier on the existing string, which will also check not only that it is a string, but also that it is a valid email. So this is going to do probably some regex
- 09:30 - 10:00 checks to make sure that the email is actually valid, right. So if I save this and go back here to our console, we're going to see that we have success false. And then the arrow over here, it's going to tell us that we're missing something because we did not provide our email inside of our user. So if I come here and I do email like this, and now if I do anything, for example, contact caused in solutions.io, which is my public email, and we do this, we are going to see that we have success true or data is actually valid. However, if I put something like let's runThis
- 10:00 - 10:30 is going to automatically validate this, because we're going to see that this is not a valid email, right? So the benefit of this is you can use email like this, and you don't have to do all of the validation yourself, you can just let Zot handle it. We can also do something like profile URL, right? And we can also do z.string, and then pass it here a string. And instead of email, we can do URL like this. And this is going to do the exact same thing this is going to check that
- 10:30 - 11:00 the string is a valid URL. So for example, if I come here and I do profile URL, and we're going to put HTTPS Google.com like this, now you're going to see that we have success because Oh, we don't we have false. Why not? Let's see. Oh, right, because our email is still invalid. Let's fix our email.io. There we go. Now we have success true, because we have an actual URL that matches the URL parameter, right? Again, if I put this and remove the.com, it is not going to be a valid URL.
- 11:00 - 11:30 I mean, I guess it is, I guess this is considered technically a valid URL. But let's see if I just remove this like this. There you go. Now it's considered a not valid URL. And our success is false, just like we could expect. So let's put back to a valid URL. And now we can also do more things than just strings. For example, we can do h and here we can put instead of z dot string, we can do z dot number like this. And now this is going to check that our age is an actual number. So if I put your age like this, and I put your 18, we're going to check that our age,
- 11:30 - 12:00 this is not actually my real age, but that the age is actually 18. Again, we're going to come here, we see that success is true. This is validating, we can also chain different things, just like we change email over here to the actual strings, we can do something with the numbers. For example, we can do min like this. And we can have min and here we can do one like this. So this is going to check that the age is actually minimum one, right. So if I come here, and I put 18, this is still going to be success true. If I come back here, and I put zero like this, this is going to be success false, because the minimum is no longer working, we can also do
- 12:00 - 12:30 other things. For example, we can do friends like this. And we can have this bz dot array, right, this is going to be an array type. And then we can pass it here an array of z dot string. So this is going to be an array of strings, right. So now this friends property over here friends is only going to be valid if we have friend one, friend two, and then friend three, like this, right, we go back here to our console. And then we have success false, because again, we have to
- 12:30 - 13:00 put our age to 18. Right, so let's put our age to 18. And now we have success true. And again, we validated that our data actually has a race. And of course, we can also chain a min or max here. So for example, we can do max like this, and we can put max three, this should still validate because we only have three entries in this array, which is the maximum success true. But if we came here, and we did max two like this, we're going to see that we have success false, right. And the last thing that I'm going to show you is the actual object because you can nest objects within each other,
- 13:00 - 13:30 right. So we can do something like settings, z dot object. And here we can pass another object and we can be is subscribe. And then we can do z dot Boolean, which is another property that we can do, right. So now this expects a setting object with a is subscribe property. So we can be here and we can come settings like this. And we can do an object is subscribe. And then we're gonna put, well, I don't know what we're gonna put, are you currently subscribed right now, because if you're watching this video, you should definitely subscribe to the channel, it's completely free,
- 13:30 - 14:00 and you're getting a ton of value. And you're learning really cool things about react. So hopefully, by now we can put subscribe to true. And you are now subscribed. And now if we validate the user schema, again, we're going to see that we have success false. Let's see why, because our array still expects three, again, I keep forgetting about these, but that just goes to show how Zod works. And it actually works. If I come here, now we have success true, because this object actually defines our shape correctly. Now, the last thing that I'm going to show you in
- 14:00 - 14:30 terms of the schema is optionals, because right now, every single property that we've defined over here is actually required. So if I omit any single property over here, it is going to throw success false not valid, right, but we can change that we can make this optional. For example, I can come here on any property and I can do optional like this and just make first name optional. And then if I comment this out, we are not going to see an error because the first name is optional, we can also instead of optional, we can do noble, which is actually going to make this instead of not being there, it's going to throw an error. But if we put the first name over here, and then
- 14:30 - 15:00 instead of this, we do know this is going to work because we've set our first name to be nullable, right, so we can do this. And you can also do something called knowledge like this, which is nullable, but it will also accept undefined like this right in the cases where you want to check and you're okay with undefined or null, you can put knowledge and then that is going to validate successfully even if it's undefined or null. So now we covered our schema. And this is pretty much enough to get you going. And if you want to look more on the other things that you can do, just
- 15:00 - 15:30 play around with it, get a feel for it, or you're welcome to check out these all documentation, they have a lot more than I've shown in this video, but I didn't want to overwhelm you with all of these properties. These right here, what we've shown here are pretty much the standard and most of the ones that you're going to use when you're working with this in your application. Now, if you're working in TypeScript, there's something really cool that you can do. Because as you can see here, we have this user schema over here, we have all of these types over here, which is great. But we also have this user object over here that is not typed, right, the type over here is just
- 15:30 - 16:00 inferred from the actual data that we have. But what we can do is we can actually extract the type of this user from the user schema to be able to use across our application. And the way that we do that is we can come here, if you're working in TypeScript, of course, we can do type user. And then we can make this equal to z dot infer. And that is going to infer the type of user schema like this, right. And now we have a user over here, which is an actual TypeScript type that is automatically inferred from our schema. As you can see here, we have email profile URL age friends,
- 16:00 - 16:30 everything is properly typed, our settings object or is subscribed, it's a Boolean, our first name, which is optional string null or undefined, right, everything is properly typed, which means that here in our user, we can actually define this as a user. And we're not going to have any problems. If I remove the first name over here, this is not going to give us any problems. If I remove the email over here, now we get an actual error, because the email is a required property on our user object. And this is really cool. I'm just going to put all of these back here. This is
- 16:30 - 17:00 really cool, because you can define this object, the schema object anywhere in your application, and then you can extract the type from it and then export this type and use it across your application. And the benefit of doing this is if your back end is also written TypeScript, you can actually share the user schema, you can use the user schema on the front end and use the types on the front end to define everything. And then on the back end, you're also using the same schema to validate all of the data that is received from the front end in terms of the API request, right.
- 17:00 - 17:30 So this is really useful, this is versatile. And it works really well on both the front end and the back end. So now what we're going to do, because now we understand how Zot works, I'm going to show you the most typical ways that you would use this schema in an actual real world React application. So the first and probably the most common use case that you're going to use this in your applications is whenever you're dealing with forms and user input data. So for this, what I'm going to do, I'm going to come here, and actually, we're going to install React hook form. And we're going to
- 17:30 - 18:00 install the hook from resolvers, because that is going to be the thing that allows us to connect Zot with React hook form. React hook form, if you don't know, is a form library that makes it really easy to build complex forms in React. It's not the only form library that you can use with React to build forms. But it's one that I prefer. And it's the one that I use. And I teach my course project react. And it's generally one that I recommend. So that's the example that I'm going to show you here. So what we need is we first need this library over here. And we also need the react hook from library. So I'm just going to come here to the editor and actually come back here to VS
- 18:00 - 18:30 code. And we're going to cancel this and I'm going to do pnpm add react hook form and then hook from resolvers. And here we're not going to install Zot because we already have Zot installed inside of this project, then I'm going to come back here to the application. And we're just going to use the user schema, I'm not actually going to build out an entire UI for the form, I'm just going to use it, I'm just going to show you how you would use this for an actual form, right. So what we can do is we can actually remove the user over here, we don't actually need this, we can remove the console lock, we don't actually need this, what we're going to do is we're just
- 18:30 - 19:00 going to set up our actual form. So we're going to do is const form equals use form, we're going to import this from react hook form, we're going to pass it here our user type, which is going to be the actual inferred type that we have here. And then we're just going to call it like this, at least for now, maybe here, we're just going to rename this to user form schema, let's pretend that we're editing the user form. So we're going to do a form like this. And then user form schema like this. And the last thing is past user form schema like this. Now to connect the Zot, we're
- 19:00 - 19:30 going to be able to use exactly this form schema, pass it to use form and actually validate our form directly without having to do anything, we don't have to check for knowledge, we don't have to check for email react hook form is going to do everything automatically through using Zot and this validation schema. So for that, we're going to have to come here pass an object and we're going to have to pass resolver and we're going to do Zot resolver. And we're going to import this from hook form slash resolvers, the library that we've installed. And here we're just going
- 19:30 - 20:00 to pass it user form schema like this, right. This is a great example and a simple example of how you would use an actual form schema in the context of a react application, you have a form over here and pretend that we have some UI that actually manages the form. If you want a real example of this, I have a bunch of videos and even have a whole tutorial video dedicated to react hook forum where we actually use Zot instead. So I'm not going to do that again, here, I'm just going to show you an illustrate the concept that you take the form, and then you pass it your form.And then you
- 20:00 - 20:30 validate the schema, the actual data in your form against that schema. Now, also, you don't have to use React Hook Form. You can use something else. You can do your own form validations as well. You can use the parse function. Let's say that, for example, you had a function handleSubmit. I'm again, now just kind of mixing examples. But let's say that you had handleSubmit with some data over here that was of type user form. You can take the data over here, and then you can do const success
- 20:30 - 21:00 and you can actually let's just do validation or result. I think that's more accurate. And then you can do user form schema dot safe, parse, and then pass it the data like this, right? And then you can do if result dot success, then handle success. Otherwise, you would handle error. Right? This is pseudocode of what you would actually do. You have a handleSubmit function that gets called whenever the form is submitted. And if you're doing this manually, you just call the user from schema,
- 21:00 - 21:30 pass it the data, safe, parse it, and then do something if it's successful, and do something else if it's not successful. Now the benefit of using React Hook Form is that it does all of this for you automatically, just by this line of code, you don't have to do all of this manually yourself, right? So that's why I recommend using something like React Hook Form, because you don't have to validate things yourself. But if you wanted to validate things yourself, then that's a perfectly valid way to do it. And it's a simple way using Zot as your validation library. Now another example where you might use a form schema like this from Zot actually validate data. Again,
- 21:30 - 22:00 any place that you would validate your data is a place that makes sense to use something like Zot. And that example is going to be here, an actual API. So let's say that we had a folder over here, let's call the API like this. And inside of here, we had API dot yes. And we had some sort of form, let's say export from async function, get users. And this function would perhaps take in some filters. Let's say for example, we have some filters over here. So we're going to do const, get
- 22:00 - 22:30 users schema like this, that is going to be Z, we can import this from Zot dot object, and we can do something like limit z dot number, and then offset z dot number like this, right? And we're going to keep these things basic, right, then we're going to do const, actually type users, filters, that is going to be z dot infer. And we're going to pass it here type of get users schema like this. And now we have the user filters over here, which we can do filters, users filters like
- 22:30 - 23:00 this. And now we can actually use the filters to do something with the right, this is a perfectly valid example, you have a schema over here that you define, you then extract your type, this type and gets here to the get users function, and it's going to get inferred whenever the get users function is actually used. And then you can take the filters over here. And you can just again, you can validate the filters, you can do something like const result equals get users schema dot safe
- 23:00 - 23:30 parse, and you can pass filters like this. And then you can do something with result, right, if success true, you can do something if success false. The benefit of doing this is that now the front end gets access to the schema and this type. So whenever you're designing the front end to actually put everything together, you know exactly what you're supposed to call this function with. And also, you have the actual protection in the back end, assume that this is running in the back end, you have the actual protection that this function is only going to work if it receives a
- 23:30 - 24:00 valid limit and a valid offset property, right, this is security on the back end. And you would use that for that, right. So again, great example of using this in a react application. If you have endpoints that you're going to call use a Zot schema validate those endpoints. And then in the front end, you have the types and you can just build your UI to make sure that it validates the schema. And finally, the last thing that I'm going to show you with Zot in the context of a react application is actually something that is really cool and really useful that people don't unfortunately talk about enough. And I'm going to give it to you for free as a bonus, because you've
- 24:00 - 24:30 watched this far into the video. And that is going to be using Zot to validate your environment variables at runtime in your application. This is something that is super simple, but super useful. So you know how in any react application, you can usually do something like compute your actual root project and do something like dot ENV over here. And then in here, you would have environment variables, for example, like secret key equals 123, right, something like this, right. And then let's say that you would want to use this inside of your application, it doesn't necessarily have to be a react front end application, but it could be but it can also be
- 24:30 - 25:00 in an OGS environment in your server in your back end API, you have an environment and you want to use that inside of your application, how would you do that efficiently? And how would you use Zot to make sure that your environment is correct and in exactly the correct shape that you expect? Well, let's say that you needed to use the secret key inside of this API over here, let's say that you had to use the secret key to be able to fetch some data from your API or something else. Usually what you would do is you would do something like secret key, for example, let's say fetch, right, we're going to pass the function, I'm just making some pseudocode slash API over here. And then we're
- 25:00 - 25:30 going to do headers like this. And we're going to do authorization bearer. And then we're going to do here the secret key. And now you would usually do something like env dot process, actually process dot env dot secret key like this, and you would pass the secret key here. Now the problem with this is that there's nothing guaranteeing you that the secret key is actually available, you're just assuming that it is available, right? And if you then run this function,
- 25:30 - 26:00 and you don't have process dot env dot secret key, this is going to throw an error, and it's actually going to land on the user, the user is going to see an error. And they're going to be like, why do I have an error, it's going to be hard to catch, because there's nothing preventing you from actually not having a secret key over here. So now if we do it with Zot, we can actually prevent that and get type safety inside of our environment variables. Because again, here, there's no type safety about any of these environment variables, they're all string or undefined, which means that they could be strings, or they could also not be there, we're not guaranteed. So in that case,
- 26:00 - 26:30 what I would do is I would come here inside of SRC, I would make a new folder over here called the details, which is one of the let's spell it correctly, utils like this, which is one of the most underrated folders generally in react. And inside of here, I'm going to do in v.ts. And here, I'm going to use Zot to actually parse the environment at runtime, and then export it and then make sure that the environment is exactly in the shape that I expect. So we can do our usual const and schema like this. And we can do z import this from Zot dot object. And here we
- 26:30 - 27:00 can pass it secret key, we can say this is going to be a string. So z dot string like this. And now we're going to do export const in V equals n schema dot parse, and then process dot in V, like this, right. So what this is going to do is this is going to export for us an environment variable that we can use, which is going to be the result of parsing our process dot in V
- 27:00 - 27:30 against our environment schema, this is going to make sure that we have a secret key over here that we can actually use it in a react application. And then we're going to get access to it here from this in V variable. If you want to make it easier, you can sometimes do in V like this to just make it more obvious, right? I don't like to do this, I just do in V like this. It's just simpler for me. And then here in the API, instead of doing process dot in V secret key, we just do here in V. And we import this from utils slash in V. And now the benefit of this is that now we're
- 27:30 - 28:00 guaranteed that the secret key here is going to be a string. And we also know its type because the environment has been validated at runtime against the schema over here. So if we have an environment where we actually don't have a secret key, or it's not in the right shape that we expect, our application is going to crash at runtime, and we'll know about it. And the user will never have to see that specific error. This is a great use case. And this is something that a lot of people don't talk about. But I pretty much do this in every single one of my applications. And
- 28:00 - 28:30 we also do this in project react, which again is a great pattern that I try to teach, which also goes to show that I really try to teach everything about good patterns, design patterns and best practices in my courses and also in my videos. So if you haven't checked out project react, again, I highly, highly recommend it. And with this, honestly, you're good to go, you're set up to be able to validate your data with Zot in the context of a react application, you know how to create a schema, how to define different properties for the schema of different types, you can work with objects, you can work with strings, you can work with numbers, booleans, objects, and all those,
- 28:30 - 29:00 you know how to also convert those to actual TypeScript types, and then use those types in your application, which is cool. And you also have seen some common and popular use cases for using these in an actual react application. The first example was a form example, this is what that looks like, at least the pseudocode of it. The second example was inside of an API function, again, very common example, pseudocode as well, right, we're not actually fetching anything. And then the third example inside of an environment, which again, is a very common use case. And something that again,
- 29:00 - 29:30 a lot of people don't talk about. And I hope that now you would apply this inside of your own applications. So now you're good to go, you know, Zot, you know, react, and you can use them together and become hopefully a better developer. If you want to play around with this, you're actually going to be able to find the codes for this inside of a repository, it's going to be linked in the description, take this code, play around with it, get a feel for Zot, and then start integrated into your react applications. I really hope that you've enjoyed this video. And I really hope that you've learned something. If you've enjoyed this video, make sure to leave this video a big thumbs up. You can also click here to subscribe. Or you
- 29:30 - 30:00 can click here to watch a different video of mine that YouTube seems to think that you're really going to enjoy. And with that being said, my name has been Darius Cosden. This is Cosden Solutions. Thank you so much for watching, and I will see you in the next video. Ciao, ciao.