End-To-End Type Safety with React, GraphQL & Prisma

Rate this content
Bookmark

In this workshop, you will get a first-hand look at what end-to-end type safety is and why it is important. To accomplish this, you’ll be building a GraphQL API using modern, relevant tools which will be consumed by a React client.


Prerequisites: 

- Node.js installed on your machine (12.2.X / 14.X)

- It is recommended (but not required) to use VS Code for the practical tasks

- An IDE installed (VSCode recommended)

- (Good to have)*A basic understanding of Node.js, React, and TypeScript

This workshop has been presented at React Advanced 2022, check out the latest edition of this React Conference.

FAQ

GraphQL Codegen is a tool that analyzes GraphQL queries and generates corresponding TypeScript types and query objects. It ensures type safety by validating queries against the GraphQL schema, ensuring that the queries are correct and the expected data types are returned. This bridges the gap between frontend and backend, ensuring consistency and reducing errors.

To configure GraphQL Codegen, create a 'codegen.yml' file in your project's root directory. Specify the GraphQL API's schema URL, the directory of GraphQL documents, and the output location for generated files. Include plugins like 'typescript' and 'typescript-operations' to generate TypeScript definitions and operations.

Prisma provides a powerful ORM for handling database operations with support for strong typing and model relations. It simplifies data access and manipulation, integrates seamlessly with GraphQL, and automatically handles migrations. Prisma enhances developer productivity and application reliability by ensuring type safety and simplifying database workflows.

The workshop materials, including the Notion document and relevant code, are openly available for reuse. You can use these resources to host your own workshop, teach others, or integrate the knowledge into your projects. The materials are designed to be accessible and adaptable for various educational and development purposes.

The useQuery hook from URQL is used to execute GraphQL queries in a React application. It requires a GraphQL query and returns an object with properties like 'data' and 'error' to manage the query's results and state. It leverages the React context provided by the URQL Provider to access the GraphQL client configuration.

The workshop utilizes Prisma for database management, GraphQL for API queries, and GraphQL Codegen to generate TypeScript types from GraphQL queries. Together, these tools ensure that types are consistent across the database, server, and client, enhancing reliability and developer experience.

Sabin Adams
Sabin Adams
95 min
12 Oct, 2022

Comments

Sign in or register to post your comment.
Video Summary and Transcription
This Workshop is about building a full-stack application with end-to-end type safety. It covers setting up a SQLite database, creating a GraphQL server, and connecting the client. The focus is on using Prisma, Pathos, and GraphQL Codegen to ensure type safety and improve the developer experience. The Workshop provides step-by-step instructions and resources for participants to follow along and ask questions. It emphasizes the importance of type safety in both the backend and frontend development process.

1. Full-Stack Application Workshop Introduction

Short description:

Thank you for joining me for this full-stack application workshop. We'll be building an application with end-to-end type safety. I'll provide you with all the information and resources you need. Make sure you have Node.js installed and consider using VS Code as your IDE. Basic knowledge of Node.js, React, and TypeScript is recommended. Today's agenda includes building a SQLite database, setting up a GraphQL server, and connecting the client. There will be a repository available. Let's get started!

♪ Thank you guys for joining me here. I see that there's a couple participants and people are still filtering in. So that's super cool to see. I'm glad you could all join me this morning. It's morning here. I'm in California. But I know this is a remote global conference, so you never know where people are from. So good morning, good afternoon, good night to everybody. I hope you're ready to jump into some coding.

We're going to be looking at a full-stack application, and we're going to be building, basically, an application that has full end-to-end type safety, and we're going to do it from the ground up and just sort of talk about all the different pieces that you need to worry about and that you need to think about when you're implementing end-to-end type safety, and we're going to look at how a couple of these tools make it pretty easy for us to do and make it actually quite a joy to do. Once you set up an application like this, if you're anything like me, you're going to end up nerding out about it afterwards and just have a whole lot of fun setting all of this stuff up.

I see there's a question already, what's the link to the Discord server? The one on the email doesn't work. Let me see if I can get you a link there as more people are filtering in. Let's see. Not like people. There is the link there. I've posted it. So if anyone else needs the Discord link, I have posted it in the answered questions, so it should be there. But, OK, moving on a little bit more on the agenda for today, I'm going to post a link in the chat, and this is just going to be a link to a Notion document. And what this is going to be is sort of the source of truth for this whole workshop that we've got going here. And this is going to be where we have all the information about what we're going to be doing. And I've actually split up this workshop into different lessons, so we'll take them one at a time. We'll start off with this databases section and we'll slowly move on to the bottom. But just some information about this, about the workshop. Here's the resources up here. This is the link just to this notion doc that I just posted. If you have any issues opening it, please let me know in the chat or in the questions and I can help you out with that. And this is going to be the GitHub repository that we're going to be working with. So we can, if you pop that open, just be able to get that ready once we get going. You can't see my screen. That's probably an issue. Let's see. How's that? Is that better? I see chats disabled for some people, let's see. Here's the link to that Notion documentation and themes for how you can get around your GitHub repository. Here's the link to that Notion document in the public channel. Cool, great. I see that people are chatting on the Discord about the screen. So, that's perfect. You can all see me now. Yeah, I'll send the link there. We could just default to the Discord chat if that other chat isn't working. There you go. Sweet. Looks like people are thumbs upping that, so the link's working. So, I'll just continue to talk through this first page as people get that open and get going.

There are some prerequisites to this. The prerequisites are just that you need to have Node.js installed on your machine. Everything that we're going to be doing is going to use Node. So, we'll just want to make sure we have that installed. And I'll give you time to install that if you don't have it already as we move forward. And then, it is recommended that you use VS Code for this. There are a couple plugins that just make life a little bit easier with working with Prisma, specifically. So, VS Code is sort of my suggested IDE. But if you have another one that you like to use, that you prefer, feel free to go ahead and use that. And then, just the basic understanding of Node.js, React, and TypeScript is good to have. It's not necessary, because I will be walking you through everything, but it would be good to know at least a little bit and have some experience with Node.js, React, and TypeScript.

And then, moving on through this What Will You Do section, if you want to read through this in more detail, feel free to take a minute just to read it. But essentially, this just goes over sort of the agenda we have for today. This goes over all of the different pieces of the workshop that we're going to do, so it sort of breaks it down into little descriptions. So for example, we're going to be starting off by building out our SQLite database. And then we're going to be setting up GraphQL Yoga, which is a GraphQL server, and then building out that server, and then finally building out the client and connecting all of those different pieces. I see more hands being raised, so let me see what's going on here. So I see a question, will there be a repo after? Yes, there will be a repo. And then it looks like chat's disabled for people. Yeah, so we'll just default to the Discord chat. Where's the link exactly? Okay. So for everybody looking for the link, I'm going to go into the chat again. Or actually, I think the... Let's see. Let's see.

2. Workshop Introduction and First Lesson

Short description:

We'll get everybody in the Discord chat. We'll set up Prisma and the GraphQL server. We'll build the React client and bridge the type gap between the backend and the front-end. I'll walk you through the different lessons and provide tips and tricks. After each lesson, you'll have time to work on your own and ask questions via chat. I'm Steven Adams, a Developer Advocate at Prisma. Feel free to contact me in any of the provided formats. You can also host this workshop yourself using the provided link. Let's jump into the first lesson, where we'll set up the database using Prisma to manage the schema and interact with it in a type safe manner.

We'll get everybody in the Discord chat. I posted a link to the Discord in our chat. Join that and then go to the RADV workshops channel, and then if you go into the channel for this workshop, you should see the link to The Notion. You'll see the link to The Notion. I'll give just a couple minutes for people to get into there. I clicked the link. It looks like it's working there, that's good. Okay, cool.

So then down here to the actual timeline agenda. So we are just gonna be kicking this off like we're doing right now. And then we're going to be setting up Prisma. We're gonna set up the GraphQL server after that. We're gonna actually build out the GraphQL resolvers and all the different pieces there. And then we're going to build the React client and sort of bridge the type gap between the backend and the front-end. And then I am gonna be splitting up these lessons into two different parts. There's gonna be the first part where I'm just going to walk you through everything here. So I'll be walking you through the different lessons. I'll walk through each little step that we're gonna do, and I'll try to explain the process as we go. And for this part, I encourage you not to code along with me. I encourage you to just sort of listen and sort of take in the information I'm giving you as I will have some little tips and tricks in there as I go. And then afterwards, I'll provide you about 20 minutes after each little lesson to work through all the pieces on your own and then get some feedback from me via the chat if you have any questions. So that's gonna be the time where I encourage you to do your coding then. That way you get the information and you get some time to code afterwards. It's sort of a win-win situation.

And then before I get started, just a little bit about me. My name is Steven Adams. I'm a Developer Advocate at Prisma. And I've spent the last roughly eight years working as a Full-Stack Developer. And I've just recently sort of jumped into Developer Advocacy. And it's been awesome because I get to do cool workshops like this and get to hang out with people like you every day and just teach you how to code and do different random coding things. And it's been great. I'm loving it. And I'm super excited to be giving this workshop. I have all of my contact information here. So if you wanna message me about anything, after this conference or just after maybe an individual section and you need to reach out to me, feel free to reach out to me in any of these formats here and I will try to respond as soon as possible. And then lastly, if you wanna host this workshop yourself, this document, I've provided the link that way everyone can just sort of have access to it. This is something that I'll just be keeping up. And if you ever wanna just steal this and give this workshop, maybe at a local meetup or if you are just interested in maybe getting into some speaking and you wanna use what you learned today to sort of teach your friends, feel free to steal this workshop from me. I definitely believe that all of these resources should be open and available for everybody. So this isn't mine explicitly, this is for everybody to use if you would like, so please feel free to do so. So with that, all out of the way, I think we'll go ahead and jump into the first lesson. But before we do, I'm just gonna double-check some chats and make sure everything is looking good here. So I see a question from Ben about joining the Discord. In case you haven't already, I posted a link in the live chat. So that should be good. A link to the repository that's gonna be in the Notion document, and that's all the way up at the top in the resources section. And the link to the Notion document is in Discord. So I'll actually go in there and pin it. I see Alex added a good link that looks like it's working for people. So yeah, go ahead and get it there. Some of you can't join Discord. Let's see. I will post the good link to this chat and go ahead and try to access that one. So that should be in the chat now, Ben. And while you're doing that, I'll go ahead and just start talking through the very first lesson. So jumping in here, the way this is gonna work is we're just gonna go over the different goals. We're gonna go over the setup for this project. And then we're gonna go through each of the tasks. And once I get through all of these tasks, I will give you some time to do this on your own. So come on over here. I'm gonna bump the size up for you guys a little bit. And right up at the top. So the goal of this first lesson is just to set up your database. We're gonna be modeling out our schema. We're going to be seeding our database, which will be a SQLite database. And we're setting it up using Prisma. So that way we can actually manage our database schema and our applications database client all through one tool, and that is Prisma. So by the end of this, what you're gonna have is a backend. We're gonna start off our backend servers project. We're gonna know the shape of our database and how to interact with it in a type safe manner, because Prisma will give you a nice type safe client to do all this with.

Watch more workshops on topic

React Performance Debugging Masterclass
React Summit 2023React Summit 2023
170 min
React Performance Debugging Masterclass
Top Content
Featured WorkshopFree
Ivan Akulov
Ivan Akulov
Ivan’s first attempts at performance debugging were chaotic. He would see a slow interaction, try a random optimization, see that it didn't help, and keep trying other optimizations until he found the right one (or gave up).
Back then, Ivan didn’t know how to use performance devtools well. He would do a recording in Chrome DevTools or React Profiler, poke around it, try clicking random things, and then close it in frustration a few minutes later. Now, Ivan knows exactly where and what to look for. And in this workshop, Ivan will teach you that too.
Here’s how this is going to work. We’ll take a slow app → debug it (using tools like Chrome DevTools, React Profiler, and why-did-you-render) → pinpoint the bottleneck → and then repeat, several times more. We won’t talk about the solutions (in 90% of the cases, it’s just the ol’ regular useMemo() or memo()). But we’ll talk about everything that comes before – and learn how to analyze any React performance problem, step by step.
(Note: This workshop is best suited for engineers who are already familiar with how useMemo() and memo() work – but want to get better at using the performance tools around React. Also, we’ll be covering interaction performance, not load speed, so you won’t hear a word about Lighthouse 🤐)
Concurrent Rendering Adventures in React 18
React Advanced 2021React Advanced 2021
132 min
Concurrent Rendering Adventures in React 18
Top Content
Featured WorkshopFree
Maurice de Beijer
Maurice de Beijer
With the release of React 18 we finally get the long awaited concurrent rendering. But how is that going to affect your application? What are the benefits of concurrent rendering in React? What do you need to do to switch to concurrent rendering when you upgrade to React 18? And what if you don’t want or can’t use concurrent rendering yet?

There are some behavior changes you need to be aware of! In this workshop we will cover all of those subjects and more.

Join me with your laptop in this interactive workshop. You will see how easy it is to switch to concurrent rendering in your React application. You will learn all about concurrent rendering, SuspenseList, the startTransition API and more.
React Hooks Tips Only the Pros Know
React Summit Remote Edition 2021React Summit Remote Edition 2021
177 min
React Hooks Tips Only the Pros Know
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
The addition of the hooks API to React was quite a major change. Before hooks most components had to be class based. Now, with hooks, these are often much simpler functional components. Hooks can be really simple to use. Almost deceptively simple. Because there are still plenty of ways you can mess up with hooks. And it often turns out there are many ways where you can improve your components a better understanding of how each React hook can be used.You will learn all about the pros and cons of the various hooks. You will learn when to use useState() versus useReducer(). We will look at using useContext() efficiently. You will see when to use useLayoutEffect() and when useEffect() is better.
React, TypeScript, and TDD
React Advanced 2021React Advanced 2021
174 min
React, TypeScript, and TDD
Top Content
Featured WorkshopFree
Paul Everitt
Paul Everitt
ReactJS is wildly popular and thus wildly supported. TypeScript is increasingly popular, and thus increasingly supported.

The two together? Not as much. Given that they both change quickly, it's hard to find accurate learning materials.

React+TypeScript, with JetBrains IDEs? That three-part combination is the topic of this series. We'll show a little about a lot. Meaning, the key steps to getting productive, in the IDE, for React projects using TypeScript. Along the way we'll show test-driven development and emphasize tips-and-tricks in the IDE.
Web3 Workshop - Building Your First Dapp
React Advanced 2021React Advanced 2021
145 min
Web3 Workshop - Building Your First Dapp
Top Content
Featured WorkshopFree
Nader Dabit
Nader Dabit
In this workshop, you'll learn how to build your first full stack dapp on the Ethereum blockchain, reading and writing data to the network, and connecting a front end application to the contract you've deployed. By the end of the workshop, you'll understand how to set up a full stack development environment, run a local node, and interact with any smart contract using React, HardHat, and Ethers.js.
Designing Effective Tests With React Testing Library
React Summit 2023React Summit 2023
151 min
Designing Effective Tests With React Testing Library
Top Content
Featured Workshop
Josh Justice
Josh Justice
React Testing Library is a great framework for React component tests because there are a lot of questions it answers for you, so you don’t need to worry about those questions. But that doesn’t mean testing is easy. There are still a lot of questions you have to figure out for yourself: How many component tests should you write vs end-to-end tests or lower-level unit tests? How can you test a certain line of code that is tricky to test? And what in the world are you supposed to do about that persistent act() warning?
In this three-hour workshop we’ll introduce React Testing Library along with a mental model for how to think about designing your component tests. This mental model will help you see how to test each bit of logic, whether or not to mock dependencies, and will help improve the design of your components. You’ll walk away with the tools, techniques, and principles you need to implement low-cost, high-value component tests.
Table of contents- The different kinds of React application tests, and where component tests fit in- A mental model for thinking about the inputs and outputs of the components you test- Options for selecting DOM elements to verify and interact with them- The value of mocks and why they shouldn’t be avoided- The challenges with asynchrony in RTL tests and how to handle them
Prerequisites- Familiarity with building applications with React- Basic experience writing automated tests with Jest or another unit testing framework- You do not need any experience with React Testing Library- Machine setup: Node LTS, Yarn

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

A Guide to React Rendering Behavior
React Advanced 2022React Advanced 2022
25 min
A Guide to React Rendering Behavior
Top Content
This transcription provides a brief guide to React rendering behavior. It explains the process of rendering, comparing new and old elements, and the importance of pure rendering without side effects. It also covers topics such as batching and double rendering, optimizing rendering and using context and Redux in React. Overall, it offers valuable insights for developers looking to understand and optimize React rendering.
Building Better Websites with Remix
React Summit Remote Edition 2021React Summit Remote Edition 2021
33 min
Building Better Websites with Remix
Top Content
Remix is a web framework built on React Router that focuses on web fundamentals, accessibility, performance, and flexibility. It delivers real HTML and SEO benefits, and allows for automatic updating of meta tags and styles. It provides features like login functionality, session management, and error handling. Remix is a server-rendered framework that can enhance sites with JavaScript but doesn't require it for basic functionality. It aims to create quality HTML-driven documents and is flexible for use with different web technologies and stacks.
React Compiler - Understanding Idiomatic React (React Forget)
React Advanced 2023React Advanced 2023
33 min
React Compiler - Understanding Idiomatic React (React Forget)
Top Content
Watch video: React Compiler - Understanding Idiomatic React (React Forget)
Joe Savona
Mofei Zhang
2 authors
The Talk discusses React Forget, a compiler built at Meta that aims to optimize client-side React development. It explores the use of memoization to improve performance and the vision of Forget to automatically determine dependencies at build time. Forget is named with an F-word pun and has the potential to optimize server builds and enable dead code elimination. The team plans to make Forget open-source and is focused on ensuring its quality before release.
Using useEffect Effectively
React Advanced 2022React Advanced 2022
30 min
Using useEffect Effectively
Top Content
Today's Talk explores the use of the useEffect hook in React development, covering topics such as fetching data, handling race conditions and cleanup, and optimizing performance. It also discusses the correct use of useEffect in React 18, the distinction between Activity Effects and Action Effects, and the potential misuse of useEffect. The Talk highlights the benefits of using useQuery or SWR for data fetching, the problems with using useEffect for initializing global singletons, and the use of state machines for handling effects. The speaker also recommends exploring the beta React docs and using tools like the stately.ai editor for visualizing state machines.
Routing in React 18 and Beyond
React Summit 2022React Summit 2022
20 min
Routing in React 18 and Beyond
Top Content
Routing in React 18 brings a native app-like user experience and allows applications to transition between different environments. React Router and Next.js have different approaches to routing, with React Router using component-based routing and Next.js using file system-based routing. React server components provide the primitives to address the disadvantages of multipage applications while maintaining the same user experience. Improving navigation and routing in React involves including loading UI, pre-rendering parts of the screen, and using server components for more performant experiences. Next.js and Remix are moving towards a converging solution by combining component-based routing with file system routing.
(Easier) Interactive Data Visualization in React
React Advanced 2021React Advanced 2021
27 min
(Easier) Interactive Data Visualization in React
Top Content
This Talk is about interactive data visualization in React using the Plot library. Plot is a high-level library that simplifies the process of visualizing data by providing key concepts and defaults for layout decisions. It can be integrated with React using hooks like useRef and useEffect. Plot allows for customization and supports features like sorting and adding additional marks. The Talk also discusses accessibility concerns, SSR support, and compares Plot to other libraries like D3 and Vega-Lite.