<?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>Forem: Carlos Rufo</title>
    <description>The latest articles on Forem by Carlos Rufo (@swcarlosrj).</description>
    <link>https://forem.com/swcarlosrj</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%2F182371%2Fcd2e6ae0-d826-44c1-86a5-269cf0c17468.jpeg</url>
      <title>Forem: Carlos Rufo</title>
      <link>https://forem.com/swcarlosrj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/swcarlosrj"/>
    <language>en</language>
    <item>
      <title>Launching SpaceX GraphQL API 🚀</title>
      <dc:creator>Carlos Rufo</dc:creator>
      <pubDate>Fri, 09 Aug 2019 11:54:44 +0000</pubDate>
      <link>https://forem.com/swcarlosrj/launching-spacex-graphql-api-jl2</link>
      <guid>https://forem.com/swcarlosrj/launching-spacex-graphql-api-jl2</guid>
      <description>&lt;p&gt;Discover the 💯 toolings and learnings from creating a production ready modern API, made on 🌎 by &amp;amp; for humans!&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%2Fcdn-images-1.medium.com%2Fmax%2F3840%2F1%2AixnzMP6t4Iot9nZpBmr1Vw.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F3840%2F1%2AixnzMP6t4Iot9nZpBmr1Vw.png" alt="Next destination: [SpaceX Land](https://spacex.land) 🌖"&gt;&lt;/a&gt;&lt;em&gt;Next destination: &lt;a href="https://spacex.land" rel="noopener noreferrer"&gt;SpaceX Land&lt;/a&gt; 🌖&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Did you ever 🤔 yourself…
&lt;/h1&gt;
&lt;h1&gt;
  
  
  How tall is a rocket? How many launches have already successfully landed-back?, What’s the maximum crew capacity of a capsule?
&lt;/h1&gt;
&lt;h1&gt;
  
  
  If you did so, I might have great news for you!
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🥁 I’m pleased to announce…
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  The &lt;a href="https://api.spacex.land/graphql" rel="noopener noreferrer"&gt;SpaceX 🚀 GraphQL API&lt;/a&gt; is now live 🎉
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/532c82955f92f382873cb9c31801703d4141c0ca/68747470733a2f2f6d656469612e67697068792e636f6d2f6d656469612f3273594432464d4f5a63373868396a4666372f67697068792e676966" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/532c82955f92f382873cb9c31801703d4141c0ca/68747470733a2f2f6d656469612e67697068792e636f6d2f6d656469612f3273594432464d4f5a63373868396a4666372f67697068792e676966"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  An API for
&lt;/h1&gt;
&lt;h1&gt;
  
  
  👩‍💻👨‍🏫 Techies
&lt;/h1&gt;
&lt;h1&gt;
  
  
  👴👩‍🌾 &amp;amp; no techies
&lt;/h1&gt;
&lt;h1&gt;
  
  
  🌏🌖 from everywhere
&lt;/h1&gt;
&lt;h1&gt;
  
  
  💻📱 with any device
&lt;/h1&gt;
&lt;h1&gt;
  
  
  also,
&lt;/h1&gt;
&lt;h1&gt;
  
  
  for those
&lt;/h1&gt;
&lt;h1&gt;
  
  
  👩‍🚀 little dreamers 👨‍🚀
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Open the link &amp;amp; just enjoy interacting with real SpaceX data ✨
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Discover all the interesting details about capsules, cores, landpads, launches, missions, payloads, rockets, ships &amp;amp; much more. You could even check if Elon’s 🚗 Roadster has finally arrived to Mars!
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Before going into technical details, let me be gentle with the 90% of people who don’t know what an &lt;a href="https://en.wikipedia.org/wiki/Application_programming_interface" rel="noopener noreferrer"&gt;API&lt;/a&gt; is, just telling an anecdote…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During the traditional 2018 🎄Christmas dinner, I was having a talk with my physics fanatic uncle about the work I was doing with the SpaceX API (&lt;em&gt;he had never hear about what’s an API, but he does like rocket stuff so was willing to listen&lt;/em&gt;), I picked up my 💻, opened the browser and with a few button presses, we got all the SpaceX rocket’s name, description &amp;amp; engine details, he was surprised of how easy it was (&lt;em&gt;now you could even do it with your📱, it’s just mind blowing&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;After that, yep, I lost my laptop for the next hour 😂, he knows a lot about thrusters &amp;amp; such, thus, he started to explore the API meanwhile I was playing with the little ones. At some point, he fetched some launches images and genuinely, my 5yo cousin asked if I was inside of that 🚀 (I love those kiddo’s life perspective, they do believe anything is possible). By then, it had already happened, thanks to such &lt;strong&gt;accessible technology&lt;/strong&gt; &amp;amp; their incredible features, we, the three of us, spent part of the evening just being amazed about rocket missions, capsules &amp;amp; other SpaceX data!&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Moral: Let’s build accessible software to keep motivating people passions &amp;amp; dreams!
&lt;/h1&gt;
&lt;/blockquote&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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2AuiMzAvGBwBhU5tNYnvJcrQ.jpeg" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2AuiMzAvGBwBhU5tNYnvJcrQ.jpeg" alt="For humans &amp;amp; everyone else 👽"&gt;&lt;/a&gt;&lt;em&gt;For humans &amp;amp; everyone else 👽&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;P.S.: The little one already know more about SpaceX than me (as he was playing around with the API during all this month). I’m so 😃 just because of the fact he’s curious to learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer’s space
&lt;/h2&gt;

&lt;p&gt;Ok, now, let’s dig into the technical details. As I strongly believe that &lt;strong&gt;accessibility&lt;/strong&gt; &amp;amp; a great &lt;strong&gt;U/DX&lt;/strong&gt; are essentials in order for a Software to have adoption, you’ll probably have to deal with other concerns as I had when I discovered the existing SpaceX API implementation…&lt;/p&gt;

&lt;h3&gt;
  
  
  Motivations
&lt;/h3&gt;

&lt;p&gt;When I found it, I was really excited to look into the available data but… within a few minutes I was already** dealing with versions, docs &amp;amp; 3rd party SWs**, basically, I gave up then I decided to start the migration!&lt;/p&gt;

&lt;p&gt;In this post you’d find in detail the main reasons about why it happened.&lt;br&gt;
&lt;a href="https://medium.com/open-graphql/migrating-spacex-api-to-graphql-e1fe69a3a8e7" rel="noopener noreferrer"&gt;&lt;strong&gt;Migrating SpaceX API to GraphQL 🚀&lt;/strong&gt;&lt;br&gt;
*As another lover of physics, astronomy and rockets, when I found the SpaceX Public API (thanks to Full Stack Apollo…*medium.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;p&gt;Tons of articles have been written by experts about the pros/cons of GraphQL &amp;amp; REST APIs. I’m not going to repeat those here but I’d totally encourage you to research about it, you could also check the GraphQL official website to get introduced to it main features!&lt;br&gt;
&lt;a href="https://graphql.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;GraphQL: A query language for APIs.&lt;/strong&gt;&lt;br&gt;
*GraphQL provides a complete description of the data in your API, gives clients the power to ask for exactly what they…*graphql.org&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;

&lt;p&gt;Let’s talk about &lt;em&gt;project structure, type-safety &amp;amp; security&lt;/em&gt; showing the main tools &amp;amp; best practices used:&lt;/p&gt;

&lt;p&gt;⚫️ It follows the &lt;strong&gt;Schema-First&lt;/strong&gt; approach using a &lt;strong&gt;domain modular **schema&lt;/strong&gt; **structure.&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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2A4bDeJQj6EFlgntOqS52xrw.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2A4bDeJQj6EFlgntOqS52xrw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The schema is splitted by the different &lt;strong&gt;data collections&lt;/strong&gt; (&lt;em&gt;capsule, company, core, dragon, history, landpad, launch, launchpad, mission, payload, roadster, rocket &amp;amp; ship&lt;/em&gt;), also contains the &lt;strong&gt;global&lt;/strong&gt; type definitions (*composed by both, commons &amp;amp; primitive GraphQL type definition*s)&lt;/p&gt;

&lt;p&gt;All of them are subdivided into the following:&lt;/p&gt;

&lt;p&gt;🔘 &lt;strong&gt;typeDefs&lt;/strong&gt;&lt;br&gt;
It contains the &lt;em&gt;data collection&lt;/em&gt; type definitions &lt;em&gt;modularized by concerns&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;🔘 &lt;strong&gt;resolvers&lt;/strong&gt;&lt;br&gt;
Functions responsible for &lt;em&gt;fetching &amp;amp; filtering&lt;/em&gt; the desired &lt;em&gt;data&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;🔘 &lt;strong&gt;utils&lt;/strong&gt;&lt;br&gt;
Composed by &lt;em&gt;parse functions&lt;/em&gt; or any operation that the &lt;em&gt;returned data&lt;/em&gt; could need!&lt;/p&gt;

&lt;p&gt;Even knowing that the current GraphQL API implementation is not too complex, &lt;strong&gt;it might/will grow&lt;/strong&gt;, that means we have to &lt;strong&gt;care about modularity&lt;/strong&gt; in order to avoid code refactors, having said that…&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  💡 Break your schema by concern, not by types!
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’ll allow you to easily identify your &lt;a href="https://graphql.org/learn/execution/#trivial-resolvers" rel="noopener noreferrer"&gt;trivial resolvers&lt;/a&gt; &amp;amp; reuse the logic functions within them 👌&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  ❌ By types
&lt;/h1&gt;
&lt;/blockquote&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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2An1IiMijXeAlPBUc6yleHAg.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2An1IiMijXeAlPBUc6yleHAg.png"&gt;&lt;/a&gt;&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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2AvJCg_LNA5_BgKJa5b-OLfw.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2AvJCg_LNA5_BgKJa5b-OLfw.png"&gt;&lt;/a&gt;&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%2Fcdn-images-1.medium.com%2Fmax%2F2308%2F1%2Ae81P9nP0P8qDHKVNnLG-mA.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F2308%2F1%2Ae81P9nP0P8qDHKVNnLG-mA.png" alt="Even if you’d split your resolvers, you could mess everything up whenever you’d have to import functions from other data collections 👎"&gt;&lt;/a&gt;&lt;em&gt;Even if you’d split your resolvers, you could mess everything up whenever you’d have to import functions from other data collections 👎&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  ✅ By concern
&lt;/h1&gt;
&lt;/blockquote&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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2ASW93Mo9EDoCRCKV-EtHK-Q.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2ASW93Mo9EDoCRCKV-EtHK-Q.png"&gt;&lt;/a&gt;&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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2ANxV6nYeBz6jZFsspdh9NWg.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2ANxV6nYeBz6jZFsspdh9NWg.png"&gt;&lt;/a&gt;&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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2ApxjOgS1Kbb3GOzJN_Rou9w.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2ApxjOgS1Kbb3GOzJN_Rou9w.png" alt="Identify smartly your trivial resolvers &amp;amp; reuse their functions, it’d be a huge win if you’d have to scale in the future 👍"&gt;&lt;/a&gt;&lt;em&gt;Identify smartly your trivial resolvers &amp;amp; reuse their functions, it’d be a huge win if you’d have to scale in the future 👍&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;⚫️ It provides &lt;strong&gt;Type-Safety&lt;/strong&gt; auto generating typeDefs &amp;amp; resolvers &lt;strong&gt;TypeScript&lt;/strong&gt; types.&lt;/p&gt;

&lt;p&gt;Having our GraphQL schema as &lt;strong&gt;Single Source of Truth, **we might want to **auto-generate&lt;/strong&gt; all our types in order to keep the data structures in sync over the whole application. Here is where the &lt;a href="https://graphql-code-generator.com/" rel="noopener noreferrer"&gt;**GraphQL Code Generator&lt;/a&gt;** (created by &lt;a href="https://dev.toundefined"&gt;Dotan Simha&lt;/a&gt;) comes in!&lt;br&gt;
&lt;a href="https://graphql-code-generator.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;GraphQL Code Generator *Generate code from your GraphQL schema with a single function call&lt;/strong&gt;*&lt;br&gt;
graphql-code-generator.com&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  ⚙️ It generates all the typeDefs &amp;amp; resolver functions (including args &amp;amp; returned data) TypeScript types.
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don’t miss the following post if you’d like to more about it implementation &amp;amp; benefits!&lt;br&gt;
&lt;a href="https://medium.com/open-graphql/type-safe-graphql-servers-3922b8a70e52" rel="noopener noreferrer"&gt;&lt;strong&gt;Type-Safe GraphQL Servers 🔎&lt;/strong&gt;&lt;br&gt;
*This post exhibits the motivations &amp;amp; steps for adding Type-Safety into GraphQL Servers*medium.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚫️ It’s &lt;strong&gt;protected&lt;/strong&gt; from &lt;strong&gt;infinite **&amp;amp;&lt;/strong&gt; complex requests** providing custom error messages.&lt;/p&gt;

&lt;p&gt;Thinking in GraphQL as a huge endpoint where all the data is available, not having the right protections might cause vulnerabilities such as being affected by DoS (Denial of Service) attacks.&lt;/p&gt;

&lt;p&gt;It can be easily avoided with tooling like &lt;a href="https://github.com/teamplanes/graphql-rate-limit" rel="noopener noreferrer"&gt;graphql-rate-limit&lt;/a&gt;, &lt;a href="https://github.com/stems/graphql-depth-limit" rel="noopener noreferrer"&gt;graphql-depth-limit &lt;/a&gt;&amp;amp; &lt;a href="https://github.com/4Catalyzer/graphql-validation-complexity" rel="noopener noreferrer"&gt;graphql-validation-complexity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re interested on securing your GraphQL API, don’t miss this &lt;a href="https://dev.toundefined"&gt;Max Stoiber&lt;/a&gt; article where it gives a 💯 overview about the main problems &amp;amp; its respective solutions!&lt;br&gt;
&lt;a href="https://blog.apollographql.com/securing-your-graphql-api-from-malicious-queries-16130a324a6b" rel="noopener noreferrer"&gt;&lt;strong&gt;Securing Your GraphQL API from Malicious Queries&lt;/strong&gt;&lt;br&gt;
*Working with GraphQL is amazing, but also has complex security implications. Let’s dig into some essential protections…*blog.apollographql.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Data
&lt;/h3&gt;

&lt;p&gt;You’ve probably wondered about where the data is coming from, before dig into that, you have to know that the data exposed over the API…&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  ⚠️ Is not official data
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;Although, &lt;strong&gt;IT IS REAL DATA&lt;/strong&gt; provided by several SpaceX information sources where the **main **is the &lt;a href="https://www.reddit.com/r/spacex/" rel="noopener noreferrer"&gt;Reddit SpaceX forum&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It &lt;a href="https://www.reddit.com/r/spacex/wiki" rel="noopener noreferrer"&gt;Wiki&lt;/a&gt; section is full of data written by the community members, also, there’re more coming from the following sites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.spacex.com/webcast" rel="noopener noreferrer"&gt;https://www.spacex.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.space-track.org" rel="noopener noreferrer"&gt;https://www.space-track.org&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ssd.jpl.nasa.gov" rel="noopener noreferrer"&gt;https://ssd.jpl.nasa.gov&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.marinetraffic.com" rel="noopener noreferrer"&gt;https://www.marinetraffic.com&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  All the data from these platforms is parsed &amp;amp; collected in a public Mongo database from where the information is obtained.
&lt;/h1&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This incredible work was done by the most popular non official &lt;a href="https://api.spacexdata.com/" rel="noopener noreferrer"&gt;SpaceX REST API&lt;/a&gt; (which is running already for 2 years). I wanna give them a great shout-out for such a work giving us the capabilities to access all this interesting data.&lt;br&gt;
&lt;a href="https://github.com/r-spacex/SpaceX-API" rel="noopener noreferrer"&gt;&lt;strong&gt;r-spacex/SpaceX-API&lt;/strong&gt; 🚀Open Source REST API for rocket, core, capsule, pad, and launch data&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d totally encourage you to help them proposing new features or fixing existing bugs, they’ll definitely appreciate it!&lt;/p&gt;
&lt;h2&gt;
  
  
  The SpaceX GraphQL API
&lt;/h2&gt;

&lt;p&gt;You might want to take a 👀 at the codebase where you’ll find all the implementation about the mentioned topics, here it is!&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  &lt;a href="https://codesandbox.io/s/yv004pqnq9" rel="noopener noreferrer"&gt;👉 The Repo &amp;amp; The API &amp;amp; The Docs &amp;amp; The Everything👇&lt;/a&gt;
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/yv004pqnq9"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  ✋, there’s more…
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  What if you don’t wanna use GraphQL? That’s fair, but… What if you could generate a REST API based on your GraphQL implementation to get all the benefits from both worlds? 🤔, does it even make sense?
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  It really does, you’d want to get all the advantages of GraphQL while using &amp;amp; exposing REST, such as:
&lt;/h3&gt;

&lt;p&gt;🔘 Fully &lt;strong&gt;up-to-date generated documentation.&lt;br&gt;
🔘 Runtime data validation **ensuring type-safety.&lt;/strong&gt;&lt;br&gt;
🔘 No more** painful &lt;strong&gt;versioning&lt;/strong&gt;.&lt;br&gt;
🔘 Forget &lt;strong&gt;write&lt;/strong&gt; manually routes &amp;amp; controllers.&lt;br&gt;
➕ much more&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Now, this is possible 🤯 , just Rest with Sofa (Kamil Kisiela's invention) auto-generating a REST API based on your GraphQL schema!
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://medium.com/the-guild/sofa-the-best-way-to-rest-is-graphql-d9da6e8e7693" rel="noopener noreferrer"&gt;😉sofa — The best way to REST (is GraphQL). Ending the REST vs GraphQL debate once and for all&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Speaking of which, 🥁 I also gotta announce…
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  The &lt;a href="https://api.spacex.land/rest/" rel="noopener noreferrer"&gt;SpaceX REST API&lt;/a&gt; is also UP 🎊
&lt;/h1&gt;
&lt;/blockquote&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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2Aox_Zf1Iqm-hn4x0IT-ag0A.gif" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2Aox_Zf1Iqm-hn4x0IT-ag0A.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Open the link &amp;amp; try the available endpoints out💫
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  If you’re a REST API fan, you can fetch the data exposed through the documented endpoints. In addition you’ll be able to get all the mentioned benefits from GraphQL, such as, up-to-date typed Docs!
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;Although, if you’re looking for performance, I’d recommend you use the &lt;a href="https://api.spacexdata.com" rel="noopener noreferrer"&gt;existing REST API&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;If you’ve already implemented a GraphQL API, &lt;strong&gt;within a few minutes&lt;/strong&gt; you could also have a REST one, check how you could implemented it!&lt;/p&gt;

&lt;p&gt;⚪️ Use ‘&lt;em&gt;express&lt;/em&gt;’ and share your &lt;strong&gt;schema&lt;/strong&gt; (composed by &lt;em&gt;typeDefs&lt;/em&gt; &amp;amp; &lt;em&gt;resolvers&lt;/em&gt;), as well as your &lt;strong&gt;context&lt;/strong&gt; over the servers!&lt;/p&gt;



&lt;p&gt;⚪️ Use &lt;strong&gt;sofa&lt;/strong&gt; &amp;amp; &lt;strong&gt;OpenAPI&lt;/strong&gt; in order to generate a* REST API* based on your &lt;em&gt;GraphQL implementation&lt;/em&gt;. You might also wanna use ‘&lt;em&gt;swagger-ui-express&lt;/em&gt;’ to serve the docs!&lt;/p&gt;



&lt;p&gt;⚪️ Use ‘&lt;em&gt;apollo-server-express&lt;/em&gt;’ &amp;amp; apply the ‘&lt;em&gt;app&lt;/em&gt;’ express instance to the GraphQL server!&lt;/p&gt;



&lt;blockquote&gt;
&lt;h1&gt;
  
  
  That’s it! GraphQL💜 REST, stop arguing &amp;amp; take advantage from both worlds!
&lt;/h1&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  PRs are more than welcome 🤗
&lt;/h2&gt;

&lt;p&gt;There’re still a lot of work to do, starting from &lt;em&gt;error handling&lt;/em&gt;, &lt;em&gt;testing&lt;/em&gt;, etc… I’d love to receive any proposal/issue in order to improve the existing!&lt;br&gt;
&lt;a href="https://github.com/spacexland/api" rel="noopener noreferrer"&gt;&lt;strong&gt;spacexland/api&lt;/strong&gt; 🚀GraphQL &amp;amp; REST APIs to explore rockets, launches &amp;amp; other SpaceX’s data*github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also I’d animate you to &lt;strong&gt;contribute with all the mentioned technologies&lt;/strong&gt;, they’ve already done such an incredible work but I’m pretty sure that they’d appreciate some help!&lt;/p&gt;
&lt;h2&gt;
  
  
  Build cool 🚀 stuff
&lt;/h2&gt;

&lt;p&gt;It was never easier to create &amp;amp; share 💯 web application projects using your favs FE libraries, thanks to Codesanbox &lt;a href="https://dev.toundefined"&gt;Ives van Hoorne&lt;/a&gt;’s creation. Whether you’re starting with &lt;strong&gt;GraphQL&lt;/strong&gt; or not, give a 👀 at the differents live examples, you could discover interesting ways of use!&lt;/p&gt;
&lt;h3&gt;
  
  
  ❤️ Angular
&lt;/h3&gt;

&lt;p&gt;Learn how to interact with a GraphQL API using TypeScript within a MVVM architecture.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/o9nmplk96y"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  💙 React
&lt;/h3&gt;

&lt;p&gt;Hooks are already here (not kidding, check &lt;a href="https://github.com/facebook/react/pull/14679" rel="noopener noreferrer"&gt;this&lt;/a&gt; out)and you can use them together with GraphQL client libraries as ‘&lt;a href="https://github.com/trojanowski/react-apollo-hooks" rel="noopener noreferrer"&gt;react-apollo-hook&lt;/a&gt;s’ 🤩&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/r4p8q1kmvp"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  💚 Vue
&lt;/h3&gt;

&lt;p&gt;You might want to use learn how to write Queries &amp;amp; fetch data with the coolest Progressive JavaScript Framework!&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/m3v8yv0nw9"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Pick whichever programming language &amp;amp; FE library you feel confident with, schedule some ⏳ in your calendar &amp;amp; enjoy coding 👌 webapps!
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;If self-learning wasn’t a enough reason to build something, you might wanna know that &lt;strong&gt;there’re people from all over the 🌍 willing to learn from your projects&lt;/strong&gt;, speaking off…&lt;/p&gt;

&lt;p&gt;If Elon couldn’t convince you, do it for them, the &lt;strong&gt;OSS community will really appreciate your work&lt;/strong&gt;! Anyways I’ve got great plans for every single SpaceX CodeSandbox created, in special for the 💡 ones, help me out with that!&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;First I want to encourage anybody to begin writing blog posts, &lt;strong&gt;you’re totally capable to do that 💪&lt;/strong&gt;, I’ve just started a couple months ago (I don’t even write a proper English) and I cannot be happier about it, you’ll get better, it’s just matter of time. Share whatever you 💜, people will learn, like &amp;amp; thank it!&lt;/p&gt;

&lt;p&gt;If you’re a GraphQL enthusiast as I am, I’d definitely recommend post on &lt;a href="https://medium.com/open-graphql" rel="noopener noreferrer"&gt;Open GraphQL&lt;/a&gt;. It’s a publication open to anything &amp;amp; everything GraphQL related runned by &lt;a href="https://dev.toundefined"&gt;Nader Dabit&lt;/a&gt;, message him!, surely he’ll be willing to have you on board!&lt;/p&gt;

&lt;p&gt;Also, I’d want to give a shout-out to &lt;a href="https://medium.com/the-guild" rel="noopener noreferrer"&gt;The Guild&lt;/a&gt; &lt;a href="https://dev.toundefined"&gt;Urigo&lt;/a&gt;’s foundation for supporting the GraphQL community with tooling like &lt;a href="https://graphql-code-generator.com/" rel="noopener noreferrer"&gt;GraphQL Code Generator&lt;/a&gt;, &lt;a href="https://sofa-api.com/" rel="noopener noreferrer"&gt;😉 sofa&lt;/a&gt;, &lt;a href="https://graphql-modules.com/" rel="noopener noreferrer"&gt;GraphQL Modules&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/kamilkisiela/graphql-inspector" rel="noopener noreferrer"&gt;GraphQL Inspector&lt;/a&gt; among others, it really changes the DX!&lt;/p&gt;

&lt;p&gt;To wrap it up, just wishing that you could learn something from this post, in addition to, please, keep contributing with the incredible OSS community 🤗&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%2Fcdn-images-1.medium.com%2Fmax%2F3840%2F1%2Af6IMUipNmjSrEp9iEAX4sw.jpeg" 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%2Fcdn-images-1.medium.com%2Fmax%2F3840%2F1%2Af6IMUipNmjSrEp9iEAX4sw.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  We are approaching our next destination 🌖, stay tuned not to miss the landing!
&lt;/h2&gt;

&lt;p&gt;Please, consider🙏🏻ing, contribut♻️ing and shar💜ing it!&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>typescript</category>
      <category>spacex</category>
    </item>
    <item>
      <title>Type-Safe GraphQL Servers 🔎</title>
      <dc:creator>Carlos Rufo</dc:creator>
      <pubDate>Fri, 09 Aug 2019 11:54:40 +0000</pubDate>
      <link>https://forem.com/swcarlosrj/type-safe-graphql-servers-1336</link>
      <guid>https://forem.com/swcarlosrj/type-safe-graphql-servers-1336</guid>
      <description>&lt;p&gt;This post exhibits the motivations &amp;amp; steps for adding Type-Safety into GraphQL Servers 🎆&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VP4wJH0S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/3200/1%2ARu_buRxF7Cyk_RdJ5frVSg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VP4wJH0S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/3200/1%2ARu_buRxF7Cyk_RdJ5frVSg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  👉 &lt;a href="https://codesandbox.io/s/yv004pqnq9"&gt;The Repo &amp;amp; The API &amp;amp; The Docs &amp;amp; The Everything&lt;/a&gt;👇
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/yv004pqnq9"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Why should I add type-safety to my codebase?
&lt;/h3&gt;

&lt;p&gt;Types enable developers to use highly-productive development tools and practices like &lt;strong&gt;static&lt;/strong&gt; checking and code refactoring when developing JavaScript projects.&lt;/p&gt;

&lt;p&gt;Building large scale applications, a static type checker can help safeguard your program, as well as helping you to eliminate existing errors (typos, misspellings, etc). TypeScript and Flow are both fantastic ways to limit technical debt in your JavaScript codebases, because folks,&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  JavaScript is DIFFICULT 🔥
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the same time it might be the best programming language to &lt;em&gt;start with,&lt;/em&gt; since it doesn’t require to install and configure, but it doesn’t mean that it’s really &lt;strong&gt;hard&lt;/strong&gt; to master and definitively, &lt;strong&gt;error prone&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;JavaScript being &lt;strong&gt;weakly&lt;/strong&gt; typed (in addition to being &lt;em&gt;dynamically&lt;/em&gt; typed) poses a lot of problems. Note that a language is either statically or dynamically typed, let’s compare the differences between them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Static 💥 Dynamic Typed
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Static&lt;/strong&gt;&lt;br&gt;
A language is &lt;strong&gt;statically typed&lt;/strong&gt; if the type of a variable is known at &lt;strong&gt;compile-time&lt;/strong&gt;. For some languages this means that you as programmer must specify what type each variable is (e.g.: Java, C, C++).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic&lt;/strong&gt;&lt;br&gt;
A language is &lt;strong&gt;dynamically typed&lt;/strong&gt; if the type is associated with &lt;strong&gt;run-time&lt;/strong&gt; values. This means that you as programmer can write a little quicker because you do not have to specify types every time (e.g.: JavaScript, Python, Perl)&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Remember❗️
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Static 👉 Compile-Time 👉 Java
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Dynamic 👉 Run-Time 👉 JavaScript
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;Speaking of these languages, in order to clarify their similarities, I’ve gotta mention one of my favorite JavaScript quotes written at the hands of the author of &lt;a href="https://github.com/getify/You-Dont-Know-JS"&gt;You Don’t Know JS&lt;/a&gt; saga (which I 💯 recommend to read):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“JavaScript is as related to Java as Carnival is to Car.” — &lt;a href="https://dev.toundefined"&gt;Kyle&lt;/a&gt; Simpson&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Definitely, they do not look alike. Let’s put focus on the most popular dynamically typed language…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tIZJXKdj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AyerQrnhxecQaJNQ1EIrXmg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tIZJXKdj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AyerQrnhxecQaJNQ1EIrXmg.png" alt="Your 😑when you’re trying for 1st time JS coming from statically typed languages"&gt;&lt;/a&gt;&lt;em&gt;Your 😑when you’re trying for 1st time JS coming from statically typed languages&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Note that a language can be &lt;em&gt;dynamically&lt;/em&gt; typed but also &lt;strong&gt;strongly&lt;/strong&gt; typed, thus producing a much better language. How we could do that in JavaScript?&lt;/p&gt;
&lt;h2&gt;
  
  
  Type-Safety in JavaScript
&lt;/h2&gt;

&lt;p&gt;Let’s review the most known tools for adding static typing into our JS codebases!&lt;/p&gt;
&lt;h3&gt;
  
  
  TypeScript
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Typed superset&lt;/em&gt;&lt;/strong&gt; of JavaScript that compiles to plain JavaScript on any browser, any host &amp;amp; any OS.&lt;br&gt;
&lt;a href="https://github.com/Microsoft/TypeScript"&gt;&lt;strong&gt;Microsoft/TypeScript&lt;/strong&gt;&lt;br&gt;
*TypeScript is a superset of JavaScript that compiles to clean JavaScript output. - Microsoft/TypeScript*github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros &amp;amp; Cons&lt;/strong&gt;&lt;br&gt;
👌 Community &amp;amp; Tooling&lt;br&gt;
👍 Sub-second response times&lt;br&gt;
👎 Learning curve&lt;/p&gt;
&lt;h3&gt;
  
  
  Flow
&lt;/h3&gt;

&lt;p&gt;Static &lt;strong&gt;&lt;em&gt;type checker&lt;/em&gt;&lt;/strong&gt; for your JavaScript code. It does a lot of work to make you more productive, making you code faster, smarter, more confidently, and to a bigger scale.&lt;br&gt;
&lt;a href="https://github.com/facebook/flow"&gt;&lt;strong&gt;Facebook/Flow&lt;/strong&gt;&lt;br&gt;
*Adds static typing to JavaScript to improve developer productivity and code quality. - Facebook/Flow*github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros &amp;amp; Cons&lt;/strong&gt;&lt;br&gt;
👌 Out-of-the-box utility&lt;br&gt;
👍 Zero config&lt;br&gt;
👎 Slower and buggier&lt;/p&gt;
&lt;h3&gt;
  
  
  TypeScript vs Flow
&lt;/h3&gt;

&lt;p&gt;No matter if you are using TypeScript or Flow be aware of *&lt;em&gt;you’re not writing plain JavaScript. **TypeScript implements both a *type checker&lt;/em&gt; and a &lt;em&gt;transpiler&lt;/em&gt; that emits plain JavaScript. Flow only does &lt;em&gt;type checking&lt;/em&gt; and relies on &lt;a href="https://babeljs.io/"&gt;*Babel&lt;/a&gt;* (or other tools) to remove type annotations.&lt;/p&gt;

&lt;p&gt;If you’d like to know more about the differences regarding syntax and usability, I totally recommend to read &lt;a href="https://github.com/niieani/typescript-vs-flowtype"&gt;this comparison&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;In this post we will use &lt;a href="https://github.com/Microsoft/TypeScript"&gt;**TypeScript&lt;/a&gt;** in our examples, it has better support for type generation that we’ll need later on.&lt;/p&gt;
&lt;h2&gt;
  
  
  GraphQL as API
&lt;/h2&gt;

&lt;p&gt;GraphQL is well know for being a strongly-typed specification for building APIs, it comes with a lot of benefits and we should take advantage of them.&lt;/p&gt;

&lt;p&gt;Whether you’re following a &lt;em&gt;Schema-First *or&lt;/em&gt; Resolver-first &lt;em&gt;approach, you’d love to end up having a **Single Source of Truth **with which develop an *End-to-end Type-Safe Application&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Avoiding manual static typing because it can get too time-consuming as well as hard to keep in sync through versions, we might want to &lt;strong&gt;auto-generate&lt;/strong&gt; all our types based on that &lt;em&gt;Single Source of Truth&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In this post we’ll use the** Schema-First** approach, thus the static types will be generated based on our *GraphQL Schema *instead of from our resolvers!&lt;/p&gt;

&lt;p&gt;In order to remove friction between type definitions we might introduce automation. Here is where the &lt;strong&gt;GraphQL Types Generators&lt;/strong&gt; come in!&lt;/p&gt;
&lt;h2&gt;
  
  
  GraphQL Types Generators
&lt;/h2&gt;

&lt;p&gt;Let’s review the most known tools for auto generating types based on our GraphQL Schema.&lt;/p&gt;
&lt;h3&gt;
  
  
  GraphQL Code Generator
&lt;/h3&gt;

&lt;p&gt;Tool that generates different types code outputs of your GraphQL Schema &amp;amp; Documents whether you are developing client, server or database.&lt;br&gt;
&lt;a href="https://graphql-code-generator.com/"&gt;&lt;strong&gt;GraphQL Code Generator *Generate code from your GraphQL schema with a single function call&lt;/strong&gt;*&lt;br&gt;
graphql-code-generator.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros &amp;amp; Cons&lt;/strong&gt;&lt;br&gt;
👌 Client, Server &amp;amp; DB support&lt;br&gt;
👍 Docs &amp;amp; Community&lt;br&gt;
👎 Early stage of development&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;GraphQLGen&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Generate &amp;amp; scaffold type-safe resolvers based on your GraphQL Schema in TypeScript, Flow &amp;amp; Reason.&lt;br&gt;
&lt;a href="https://oss.prisma.io/graphqlgen/"&gt;&lt;strong&gt;GraphQLGen&lt;/strong&gt;&lt;br&gt;
*Programming in type-safe environments provides a lot of benefits and gives you confidence about your code*oss.prisma.io/graphqlgen/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros &amp;amp; Cons&lt;/strong&gt;&lt;br&gt;
👌 Defaults resolvers generation&lt;br&gt;
👍 Integrable with Prisma&lt;br&gt;
👎 Only Server support&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;GraphQL Code Generator vs GraphQLGen&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Both are great for generating &lt;em&gt;TypeScript&lt;/em&gt; &amp;amp; &lt;em&gt;Flow&lt;/em&gt; types although &lt;strong&gt;GraphQLGen&lt;/strong&gt; doesn’t provide you the ability to generate them for the Client. Instead, &lt;strong&gt;GraphQL Code Generator&lt;/strong&gt; does, also it provides you a tons of plugins/configurations &amp;amp; the possibility to create your custom type generation templates. I found out this really useful in order to have a modular GraphQL Schema configured as you wish!&lt;/p&gt;

&lt;p&gt;In this post we will use &lt;a href="https://graphql-code-generator.com"&gt;**GraphQL Code Generator&lt;/a&gt; **in our examples, it has better customization that we’ll need later on.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  Ok, I know, too much theory…
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pc9LaCKx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AlBgPeLa4sfAqKw8Bj9OpKA.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pc9LaCKx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AlBgPeLa4sfAqKw8Bj9OpKA.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  … let’s set this up 🚀
&lt;/h1&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Setup &lt;a href="https://github.com/Microsoft/TypeScript"&gt;TypeScript&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Uts5kvgB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2552/1%2AF9SdgWKARE5TFVwZQ2JZSw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Uts5kvgB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2552/1%2AF9SdgWKARE5TFVwZQ2JZSw.png" alt="[TypeScript](https://typescriptlang.org) main features"&gt;&lt;/a&gt;&lt;em&gt;&lt;a href="https://typescriptlang.org"&gt;TypeScript&lt;/a&gt; main features&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Install it&lt;/strong&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add -D typescript
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Install Run libraries&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In order to execute TypeScript with Node, you have to add the following tools:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TypeStrong/ts-node"&gt;*TS-Node&lt;/a&gt;&lt;em&gt;: TypeScript execution and REPL for Node.js, with source map support.&lt;br&gt;
&lt;a href="https://github.com/remy/nodemon"&gt;*Nodemon&lt;/a&gt;&lt;/em&gt;: Monitor for any changes in your Node.js application restarting automatically the server.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add -D ts-node nodemon
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You might want to use other configuration, setup whatever fits better for your app!&lt;/p&gt;
&lt;h3&gt;
  
  
  Include @types
&lt;/h3&gt;

&lt;p&gt;Add your &lt;em&gt;high quality&lt;/em&gt; type definitions of the libraries that you’re currently using over your codebase, such as graphql, lodash, etc. If you’re 🤨 about this, check the &lt;a href="http://definitelytyped.org/"&gt;*DefinitelyTyped docs&lt;/a&gt;*!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add -D @types/graphql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Create TypeScript config&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This way TypeScript will include &lt;em&gt;all&lt;/em&gt; the .ts files in your directory (and sub directories) as a part of the compilation context. It will also select a few sane default compiler options, you could check them out &lt;a href="https://www.typescriptlang.org/docs/handbook/tsconfig-json.html"&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**// tsconfig.json
**{
  "compilerOptions": {
    "target": "esnext",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "esModuleInterop": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist", "**/*.spec.ts"]
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Create Run config&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Nodemon&lt;/em&gt; supports local configuration files located in the current working directory where you have to specify things like which &lt;strong&gt;path to watch&lt;/strong&gt; &amp;amp; the command to execute after any reload, which is your server. Check the &lt;a href="https://github.com/remy/nodemon/blob/master/doc/sample-nodemon.md"&gt;sample config&lt;/a&gt;!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**// nodemon.json
**{
  "watch": ["src"],
  "ext": "ts",
  "ignore": ["src/**/*.spec.ts", "src/types/**/*.d.ts"],
  "exec": "ts-node ./src/index.ts"
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Add Run config&lt;/strong&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**// package.json
**{
  ...
  "scripts": {
    ...
    "start": "nodemon",
    ...
  }
  ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Rename .js files 👉 .ts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Modify all your JavaScript filename extensions to .ts, it’ll allow you take advantage of the all TypeScript features&lt;/p&gt;
&lt;h3&gt;
  
  
  Test your app
&lt;/h3&gt;

&lt;p&gt;Run your &lt;em&gt;GraphQL Server&lt;/em&gt;, as JavaScript is 100% compatible with TypeScript (not the opposite, TS types are not allowed on JS compilers), it should work!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Weeding out Errors
&lt;/h3&gt;

&lt;p&gt;It’s not unexpected to get error messages after conversion. The important thing is to actually go one by one through these and decide how to deal with the errors. Often these will be legitimate bugs, but sometimes you’ll have to explain what you’re trying to do a little better to TypeScript. Don’t hesitate to check this &lt;a href="http://www.typescriptlang.org/docs/handbook/migrating-from-javascript.html"&gt;migration guide&lt;/a&gt; for help to fix the possible errors!&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Setup &lt;a href="https://graphql-code-generator.com"&gt;GraphQL Code Generator&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mO4nR1Zx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2876/1%2AJw_S5yw_Jsi7cMIXXD8B4Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mO4nR1Zx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/2876/1%2AJw_S5yw_Jsi7cMIXXD8B4Q.png" alt="[GraphQL Code Generator](https://graphql-code-generator.com) main features"&gt;&lt;/a&gt;&lt;em&gt;&lt;a href="https://graphql-code-generator.com"&gt;GraphQL Code Generator&lt;/a&gt; main features&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Install it&lt;/strong&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add -D graphql-code-generator
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Install Plugins&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We’ll setup the &lt;em&gt;common&lt;/em&gt;, &lt;em&gt;server&lt;/em&gt; &amp;amp; *resolvers TypeScript *plugins, you might want to use others, check the &lt;a href="https://graphql-code-generator.com/docs/plugins/"&gt;plugins available&lt;/a&gt;!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add -D graphql-codegen-typescript-common graphql-codegen-typescript-server graphql-codegen-typescript-resolvers
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Create Context type
&lt;/h3&gt;

&lt;p&gt;If you wish to use a custom type for your GraphQL &lt;em&gt;context *and&lt;/em&gt; &lt;em&gt;you don’t want to specify it each time that you declare your resolvers, you can create it manually and add it to the&lt;/em&gt; run config* file (as we’ll do it in the next step):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**// types/context.d.ts
**export type MyContext = {
  db: any;
  find: any;
  limit: any;
  order: any;
  project: any;
  sort: any;
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Create Run config&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The CLI will automatically detect the defined config file and will generate code accordingly, you could check the available options &lt;a href="https://graphql-code-generator.com/docs/getting-started/codegen-config"&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**// codegen.yml***
*schema: src/schema/**/*.ts
overwrite: true
watch: true
require:
  - ts-node/register
generates:
  ./src/types/types.d.ts:
    config:
      contextType: ./context#MyContext
    plugins:
      - typescript-common
      - typescript-server
      - typescript-resolvers
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Add Run config
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**// package.json
**{
  ...
  "scripts": {
    ...
    "generate": "gql-gen",
    ...
  }
  ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Generate Types ⚙️
&lt;/h2&gt;

&lt;p&gt;Everything is setup for getting our desired static types 😍, let’s make that happen!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn generate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Add Resolver Types!
&lt;/h2&gt;

&lt;p&gt;Now, you just have to include your *TypeScript *generated static types into your *GraphQL Resolvers *as here&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GyyPwce1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AYDeNWttazokA3eh4sYhwHg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GyyPwce1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AYDeNWttazokA3eh4sYhwHg.gif" alt="Adding TypeScript types into GraphQL Resolvers &amp;amp; 🔎the Resolvers Data Types"&gt;&lt;/a&gt;&lt;em&gt;Adding TypeScript types into GraphQL Resolvers &amp;amp; 🔎the Resolvers Data Types&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DhPJEAqb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AmPUc2fU1VPbW6gjbw1DjeQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DhPJEAqb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn-images-1.medium.com/max/2000/1%2AmPUc2fU1VPbW6gjbw1DjeQ.gif" alt="It’s not 😂, take a look to your types.d.ts generated!"&gt;&lt;/a&gt;&lt;em&gt;It’s not 😂, take a look to your types.d.ts generated!&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Recapping
&lt;/h2&gt;

&lt;p&gt;In order to add &lt;em&gt;Type-Safety&lt;/em&gt; into your GraphQL Server using &lt;em&gt;Schema-First&lt;/em&gt; approach you could:&lt;/p&gt;

&lt;p&gt;⚫ Setup TypeScript&lt;br&gt;
↳ Install TypeScript, run libraries &amp;amp; @types&lt;br&gt;
↳ Create TypeScript config &amp;amp; run config&lt;br&gt;
↳ Add run config&lt;br&gt;
⚫️ Rename .js 👉.ts files&lt;br&gt;
⚫️ Setup GraphQL Code Generator&lt;br&gt;
↳ Install GraphQL Code Generator &amp;amp; plugins&lt;br&gt;
↳ Create context type &amp;amp; run config&lt;br&gt;
↳ Add run config&lt;br&gt;
⚫️ Generate Types ⚙️&lt;br&gt;
⚫️ Add Resolver Types!&lt;/p&gt;
&lt;h2&gt;
  
  
  👀 the benefits
&lt;/h2&gt;

&lt;p&gt;Discover some of the use cases where you’d take advantage of using &lt;em&gt;TypeScript *together with *GraphQL&lt;/em&gt;!&lt;/p&gt;
&lt;h3&gt;
  
  
  Evolve your schema
&lt;/h3&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__video-wrapper"&gt;
        &lt;div class="ltag__twitter-tweet__media--video-preview"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c--gSD7m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/tweet_video_thumb/Dv1mR8fXQAEHeRv.jpg" alt="unknown tweet media content"&gt;
          &lt;img src="/assets/play-butt.svg" class="ltag__twitter-tweet__play-butt" alt="Play butt"&gt;
        &lt;/div&gt;
        &lt;div class="ltag__twitter-tweet__video"&gt;
          
            
          
        &lt;/div&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wnl0Sv_y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1024616071314034688/FV1LTwP5_normal.jpg" alt="Carlos Rufo profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Carlos Rufo
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/swcarlosrj"&gt;@swcarlosrj&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Evolve your schema without worrying about changes, be a rebel 🤘, pull all your new commits! The generated &lt;a href="https://twitter.com/hashtag/TypeScript"&gt;#TypeScript&lt;/a&gt; types based on your &lt;a href="https://twitter.com/hashtag/GraphQL"&gt;#GraphQL&lt;/a&gt; type definitions &amp;amp; resolvers will 🔎 all possible errors for you! 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      16:23 PM - 01 Jan 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1080137523190468608" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1080137523190468608" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      1
      &lt;a href="https://twitter.com/intent/like?tweet_id=1080137523190468608" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      3
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  🔎 the arguments
&lt;/h3&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__video-wrapper"&gt;
        &lt;div class="ltag__twitter-tweet__media--video-preview"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SCyyPBjg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/tweet_video_thumb/Dv1moipWkAA4595.jpg" alt="unknown tweet media content"&gt;
          &lt;img src="/assets/play-butt.svg" class="ltag__twitter-tweet__play-butt" alt="Play butt"&gt;
        &lt;/div&gt;
        &lt;div class="ltag__twitter-tweet__video"&gt;
          
            
          
        &lt;/div&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wnl0Sv_y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1024616071314034688/FV1LTwP5_normal.jpg" alt="Carlos Rufo profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Carlos Rufo
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/swcarlosrj"&gt;@swcarlosrj&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Don't waste your ⏳ looking into your self-documented API, don't leave the IDE 🙌, don't leave &lt;a href="https://twitter.com/vscode"&gt;@vscode&lt;/a&gt;. Explore all your &lt;a href="https://twitter.com/hashtag/GraphQL"&gt;#GraphQL&lt;/a&gt; arguments with the generated &lt;a href="https://twitter.com/hashtag/TypeScript"&gt;#TypeScript&lt;/a&gt; resolvers types! 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      16:23 PM - 01 Jan 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1080137527439314944" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1080137527439314944" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      0
      &lt;a href="https://twitter.com/intent/like?tweet_id=1080137527439314944" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      1
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Catch Misspellings
&lt;/h3&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__video-wrapper"&gt;
        &lt;div class="ltag__twitter-tweet__media--video-preview"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yLPVmHJZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/tweet_video_thumb/Dv1nfUKXcAMK-5h.jpg" alt="unknown tweet media content"&gt;
          &lt;img src="/assets/play-butt.svg" class="ltag__twitter-tweet__play-butt" alt="Play butt"&gt;
        &lt;/div&gt;
        &lt;div class="ltag__twitter-tweet__video"&gt;
          
            
          
        &lt;/div&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wnl0Sv_y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1024616071314034688/FV1LTwP5_normal.jpg" alt="Carlos Rufo profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Carlos Rufo
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/swcarlosrj"&gt;@swcarlosrj&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      "I just spent like 30 minutes trying to figure out why something I was writing went to the catch statement and it turns out I wrote `.toLowerCase()` wrong 🤦‍♀️" by &lt;a href="https://twitter.com/NikkitaFTW"&gt;@NikkitaFTW&lt;/a&gt;&lt;br&gt; &lt;br&gt;Even great devs do misspellings, avoid them using &lt;a href="https://twitter.com/hashtag/TypeScript"&gt;#TypeScript&lt;/a&gt; into your &lt;a href="https://twitter.com/hashtag/GraphQL"&gt;#GraphQL&lt;/a&gt; resolvers 🚀 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      16:23 PM - 01 Jan 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1080137530320797696" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1080137530320797696" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      0
      &lt;a href="https://twitter.com/intent/like?tweet_id=1080137530320797696" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      2
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  🔎 the context
&lt;/h3&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__video-wrapper"&gt;
        &lt;div class="ltag__twitter-tweet__media--video-preview"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V7mw-9OF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/tweet_video_thumb/Dv1ns7DXcAAgv_y.jpg" alt="unknown tweet media content"&gt;
          &lt;img src="/assets/play-butt.svg" class="ltag__twitter-tweet__play-butt" alt="Play butt"&gt;
        &lt;/div&gt;
        &lt;div class="ltag__twitter-tweet__video"&gt;
          
            
          
        &lt;/div&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wnl0Sv_y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1024616071314034688/FV1LTwP5_normal.jpg" alt="Carlos Rufo profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Carlos Rufo
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/swcarlosrj"&gt;@swcarlosrj&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      If you didn't know it, DRY ♻️, use context! for having access to your needed functions inside of your &lt;a href="https://twitter.com/hashtag/GraphQL"&gt;#GraphQL&lt;/a&gt; resolvers. The generated &lt;a href="https://twitter.com/hashtag/TypeScript"&gt;#TypeScript&lt;/a&gt; types will help you to know which ones are available as well as their respective types ✨ 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      16:23 PM - 01 Jan 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1080137533319720962" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1080137533319720962" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      0
      &lt;a href="https://twitter.com/intent/like?tweet_id=1080137533319720962" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      1
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Discover your data
&lt;/h3&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__video-wrapper"&gt;
        &lt;div class="ltag__twitter-tweet__media--video-preview"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IzBEfr7W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/tweet_video_thumb/Dv1qJeqWoAMN8wH.jpg" alt="unknown tweet media content"&gt;
          &lt;img src="/assets/play-butt.svg" class="ltag__twitter-tweet__play-butt" alt="Play butt"&gt;
        &lt;/div&gt;
        &lt;div class="ltag__twitter-tweet__video"&gt;
          
            
          
        &lt;/div&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wnl0Sv_y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1024616071314034688/FV1LTwP5_normal.jpg" alt="Carlos Rufo profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Carlos Rufo
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/swcarlosrj"&gt;@swcarlosrj&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Not sure 🤨 about your resolvers returned data? Destructure it, mock it, change it 😲, you'll be able to do so thanks to the generated &lt;a href="https://twitter.com/hashtag/TypeScript"&gt;#TypeScript&lt;/a&gt; types based on your &lt;a href="https://twitter.com/hashtag/GraphQL"&gt;#GraphQL&lt;/a&gt; schema 😍 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      16:23 PM - 01 Jan 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1080137536507465729" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1080137536507465729" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      0
      &lt;a href="https://twitter.com/intent/like?tweet_id=1080137536507465729" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      1
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  The Future
&lt;/h2&gt;

&lt;p&gt;In order to talk about what the new era holds 😬, you cannot miss the motivations for which GraphQL was created, &lt;a href="https://dev.toundefined"&gt;Dan Schafer&lt;/a&gt; resumed them perfectly 👇&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6NYC-k2Abow"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Schema💥Resolver First approach,&lt;br&gt;
Types💥Classes/Decorator generators,&lt;br&gt;
Readability💥Composability,&lt;/p&gt;

&lt;p&gt;… 2019 aims to be busy for GraphQL 😅,&lt;br&gt;
read the first impressions about its future,&lt;br&gt;
it’s as exciting as overwhelming,&lt;br&gt;
but really, don’t miss it, 💯 thread!&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fv87EM7x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/670932364491669504/N4-NLlZ0_normal.jpg" alt="Johannes Schickling profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Johannes Schickling
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="comment-mentioned-user" href="https://dev.to/schickling"&gt;@schickling&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      🔮 GraphQL prediction for 2019: Resolver-first server frameworks will begin to replace the currently popular schema-first approach.&lt;br&gt;&lt;br&gt;Main reasons:&lt;br&gt;◆ No code redundancy (i.e. single definition of resolvers and types)&lt;br&gt;◆ Better code reuse &amp;amp; type-safety&lt;br&gt;◆ Superior DX
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      09:49 AM - 02 Jan 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1080400713770024960" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1080400713770024960" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      110
      &lt;a href="https://twitter.com/intent/like?tweet_id=1080400713770024960" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      510
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3M8UvU2v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/3840/1%2Af6IMUipNmjSrEp9iEAX4sw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3M8UvU2v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/3840/1%2Af6IMUipNmjSrEp9iEAX4sw.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ll be following this post up 🔜 with the respective &lt;strong&gt;Type-Safe GraphQL Clients&lt;/strong&gt; 🔎 post, stay tuned!&lt;/p&gt;

&lt;p&gt;Please, consider🙏🏻ing, contribut♻️ing and shar💜ing it!&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Lessons Learned Migrating APIs to GraphQL 📝</title>
      <dc:creator>Carlos Rufo</dc:creator>
      <pubDate>Fri, 09 Aug 2019 11:54:34 +0000</pubDate>
      <link>https://forem.com/swcarlosrj/lessons-learned-migrating-apis-to-graphql-3ef2</link>
      <guid>https://forem.com/swcarlosrj/lessons-learned-migrating-apis-to-graphql-3ef2</guid>
      <description>&lt;p&gt;This post shows &lt;strong&gt;best practices&lt;/strong&gt; 💫 of migrating APIs to GraphQL. Add your thoughts, collabore asking/resolving concerns 🤗, show them your folks, but 🙏🏻, &lt;strong&gt;share knowledge&lt;/strong&gt; 💜&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Modularize&lt;/strong&gt; 👌 your typeDefs &amp;amp; resolvers 👇
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1067288762810535936-625" src="https://platform.twitter.com/embed/Tweet.html?id=1067288762810535936"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1067288762810535936-625');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1067288762810535936&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  “Break your schema by &lt;strong&gt;concern&lt;/strong&gt;, not by types“ — &lt;a href="https://twitter.com/martijnwalraven" rel="noopener noreferrer"&gt;Martijn Walraven&lt;/a&gt; 👇
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1067290487684571137-706" src="https://platform.twitter.com/embed/Tweet.html?id=1067290487684571137"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1067290487684571137-706');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1067290487684571137&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  DRY ♻️, use &lt;strong&gt;context&lt;/strong&gt;! 👇
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1067497253294747650-395" src="https://platform.twitter.com/embed/Tweet.html?id=1067497253294747650"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1067497253294747650-395');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1067497253294747650&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Evaluate whether your schema is &lt;strong&gt;feature&lt;/strong&gt; or &lt;strong&gt;domain&lt;/strong&gt; based 👇
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1067727612233928704-651" src="https://platform.twitter.com/embed/Tweet.html?id=1067727612233928704"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1067727612233928704-651');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1067727612233928704&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Show what’s &lt;strong&gt;important&lt;/strong&gt; 👀 first 👇
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1068048289755475968-551" src="https://platform.twitter.com/embed/Tweet.html?id=1068048289755475968"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1068048289755475968-551');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1068048289755475968&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Decouple &lt;strong&gt;global&lt;/strong&gt; typeDefs! 👇
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1068432024371789824-946" src="https://platform.twitter.com/embed/Tweet.html?id=1068432024371789824"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1068432024371789824-946');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1068432024371789824&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Take advantage 🚀 of &lt;strong&gt;ESNext&lt;/strong&gt; 👇
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1068983561934516227-176" src="https://platform.twitter.com/embed/Tweet.html?id=1068983561934516227"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1068983561934516227-176');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1068983561934516227&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Return several types using &lt;strong&gt;Union&lt;/strong&gt; Types!👇
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1072132577631309824-581" src="https://platform.twitter.com/embed/Tweet.html?id=1072132577631309824"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1072132577631309824-581');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1072132577631309824&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Use &lt;strong&gt;Aliases&lt;/strong&gt; 🔥 to rename the result of a field 👇
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1072147677318651906-926" src="https://platform.twitter.com/embed/Tweet.html?id=1072147677318651906"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1072147677318651906-926');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1072147677318651906&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Don’t &lt;strong&gt;over-engineer&lt;/strong&gt;, you can query with fetch👇
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1072242050249166848-564" src="https://platform.twitter.com/embed/Tweet.html?id=1072242050249166848"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1072242050249166848-564');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1072242050249166848&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  DRY ♻️, use &lt;strong&gt;fragments&lt;/strong&gt;!
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1072876237301932032-886" src="https://platform.twitter.com/embed/Tweet.html?id=1072876237301932032"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1072876237301932032-886');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1072876237301932032&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Get rid off your variables using &lt;strong&gt;Input Types&lt;/strong&gt; 👇
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1073229966219862016-520" src="https://platform.twitter.com/embed/Tweet.html?id=1073229966219862016"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1073229966219862016-520');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1073229966219862016&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  Extra 🌟
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Don’t miss the 1st part of a series resuming PayPal’s best practices for building GraphQL APIs 👇
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://medium.com/paypal-engineering/graphql-resolvers-best-practices-cd36fdbcef55" rel="noopener noreferrer"&gt;&lt;strong&gt;GraphQL Resolvers: Best Practices&lt;/strong&gt;&lt;br&gt;
*GraphQL resolvers can be easy to build, but difficult to get right. Here’s a look at PayPal’s best practices for…*medium.com&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Recapping
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;👉 &lt;a href="https://twitter.com/swcarlosrj/status/1067288762810535936" rel="noopener noreferrer"&gt;Modularize 👌 **your typeDefs &amp;amp; resolvers&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://twitter.com/swcarlosrj/status/1067290487684571137" rel="noopener noreferrer"&gt;“Break your schema by &lt;strong&gt;concern&lt;/strong&gt;, not by types“ — Martijn Walraven&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://twitter.com/swcarlosrj/status/1067497253294747650" rel="noopener noreferrer"&gt;DRY ♻️, use &lt;strong&gt;context&lt;/strong&gt;!&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://twitter.com/swcarlosrj/status/1067727612233928704" rel="noopener noreferrer"&gt;Evaluate whether your schema is &lt;strong&gt;feature&lt;/strong&gt; or &lt;strong&gt;domain&lt;/strong&gt; based&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://twitter.com/swcarlosrj/status/1068048289755475968" rel="noopener noreferrer"&gt;Show what’s **important 👀 **first&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://twitter.com/swcarlosrj/status/1068432024371789824" rel="noopener noreferrer"&gt;Decouple &lt;strong&gt;global&lt;/strong&gt; typeDefs&lt;/a&gt;!&lt;br&gt;
👉 &lt;a href="https://twitter.com/swcarlosrj/status/1068983561934516227" rel="noopener noreferrer"&gt;Take advantage 🚀 of **ESNext&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://twitter.com/swcarlosrj/status/1068983561934516227" rel="noopener noreferrer"&gt;&lt;strong&gt;Return several types using **Union&lt;/strong&gt; Types&lt;/a&gt;!&lt;br&gt;
👉 &lt;a href="https://twitter.com/notrab/status/1072147677318651906" rel="noopener noreferrer"&gt;Use &lt;strong&gt;Aliases&lt;/strong&gt; 🔥 to rename the result of a field&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://twitter.com/notrab/status/1072242050249166848" rel="noopener noreferrer"&gt;Don’t over-engineer, you can &lt;strong&gt;query&lt;/strong&gt; with **fetch&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
👉 &lt;a href="https://twitter.com/benawad97/status/1072876237301932032" rel="noopener noreferrer"&gt;DRY ♻️, use &lt;strong&gt;fragments&lt;/strong&gt;!&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="https://twitter.com/benawad97/status/1073229966219862016" rel="noopener noreferrer"&gt;Get rid off your variables using &lt;strong&gt;Input&lt;/strong&gt; Types&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐️ &lt;a href="https://medium.com/paypal-engineering/graphql-resolvers-best-practices-cd36fdbcef55" rel="noopener noreferrer"&gt;GraphQL Resolvers: Best Practices&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Already waiting to add yours 🤗, contribute adding more lessons learned 👇&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1067288761585799169-841" src="https://platform.twitter.com/embed/Tweet.html?id=1067288761585799169"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1067288761585799169-841');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1067288761585799169&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  Or even better…
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Create posts 😀, courses 😄, meetups 😍, anything!, just be 🤗 and curious for teaching &amp;amp; learning 🚀
&lt;/h2&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%2Fcdn-images-1.medium.com%2Fmax%2F3840%2F1%2Af6IMUipNmjSrEp9iEAX4sw.jpeg" 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%2Fcdn-images-1.medium.com%2Fmax%2F3840%2F1%2Af6IMUipNmjSrEp9iEAX4sw.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ll be following this post up 🔜 with more lessons learned, stay tuned!&lt;/p&gt;

&lt;p&gt;Please, consider🙏🏻ing, contribut♻️ing and shar💜ing it!&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Migrating SpaceX API to GraphQL 🚀</title>
      <dc:creator>Carlos Rufo</dc:creator>
      <pubDate>Fri, 09 Aug 2019 11:54:28 +0000</pubDate>
      <link>https://forem.com/swcarlosrj/migrating-spacex-api-to-graphql-2d8b</link>
      <guid>https://forem.com/swcarlosrj/migrating-spacex-api-to-graphql-2d8b</guid>
      <description>&lt;p&gt;As another lover of physics, astronomy and rockets, when I found the SpaceX Public API (thanks to &lt;a href="http://apollographql.com/docs/tutorial/introduction.html" rel="noopener noreferrer"&gt;Full Stack Apollo tutorial&lt;/a&gt; 👏), I was really intrigued for looking into the available data.&lt;/p&gt;

&lt;p&gt;I immediately accessed to the &lt;a href="https://github.com/r-spacex/SpaceX-API" rel="noopener noreferrer"&gt;SpaceX API GitHub&lt;/a&gt; and …&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%2Fcdn-images-1.medium.com%2Fmax%2F3396%2F1%2AfrgOjBqsIBs4f8t6gBSECA.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F3396%2F1%2AfrgOjBqsIBs4f8t6gBSECA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐵s would be the future Animoji’s Hand Tracking UX tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;REST? External docs? Postman?? 😅 The SpaceX API journey didn’t start well but I was still excited for digging into the resources that make up the API, I continued my way to &lt;a href="https://documenter.getpostman.com/view/2025350/RWaEzAiG" rel="noopener noreferrer"&gt;the Docs&lt;/a&gt; 😬&lt;/p&gt;

&lt;p&gt;As always I’ve skipped the introduction and went straight to the resources in search of the &lt;strong&gt;holy grail&lt;/strong&gt;, &lt;em&gt;the data and their respective type definitions&lt;/em&gt;, let’s review what there is inside of it 👇&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%2Fcdn-images-1.medium.com%2Fmax%2F2300%2F1%2A6Bz0dZavgjWvbqisAWSJCg.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F2300%2F1%2A6Bz0dZavgjWvbqisAWSJCg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Endpoint&lt;/strong&gt;, 😒 v3?, is there a v2? where’re the docs? 😕&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Types&lt;/strong&gt;, I dunno what QueryStrings is but we have some type definitions 😍&lt;/p&gt;

&lt;p&gt;🔲 &lt;strong&gt;Data&lt;/strong&gt;, no data, no 😭. Let’s keep looking, the data model should be around!&lt;/p&gt;

&lt;p&gt;As a accustomed GraphQL user, the experience wasn’t being great but it deserved a chance 🤞&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%2Fcdn-images-1.medium.com%2Fmax%2F2296%2F1%2A3EIsYZy7ht0BJXsZ32NUJQ.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F2296%2F1%2A3EIsYZy7ht0BJXsZ32NUJQ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eureka, I’ve found it 🎉&lt;/p&gt;

&lt;p&gt;✋ a sec, original_launch_unix doesn’t look like familiar, let’s check the “type definitions” again,&lt;br&gt;
🤔 it’s not there and the description always says “Filter…”&lt;br&gt;
😓 that wasn’t the data type definitions,&lt;br&gt;
😫 where could they be then?&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;scrolling trying to find the type definitions… *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;**My brain:&lt;br&gt;
**Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Me: *&lt;/em&gt;“Keep calm, let’s see if we can find them over the API collection provided”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;running &lt;a href="https://app.getpostman.com/run-collection/3aeac01a548a87943749" rel="noopener noreferrer"&gt;Postman collection&lt;/a&gt;…&lt;/strong&gt;&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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2Ari-tQl6i7oUMuDjAl6vblA.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2Ari-tQl6i7oUMuDjAl6vblA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;installing, signing up, setting up…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;**My brain:&lt;br&gt;
**Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;br&gt;
Don’t say it&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Me: *&lt;/em&gt;“What are you waiting to use GraphQL?”&lt;/p&gt;

&lt;p&gt;Yep, I gave up 😓, right after that I started the API migration…&lt;/p&gt;
&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;Because,&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  I just want to explore data &amp;amp; their types
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;without the need of setting anything up, and because of…&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Overfetching&lt;/strong&gt;: 90% of the responses exceeds the app’s data need, I just wanna ask for what I want!&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Underfetching&lt;/strong&gt;: Multiple requests are a bad performance solution, I’d love to request all the data in one&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Typing&lt;/strong&gt;, &lt;strong&gt;documentation&lt;/strong&gt;, &lt;strong&gt;versioning&lt;/strong&gt;, *&lt;em&gt;ecosystem, *&lt;/em&gt;…♾, are always tricky&lt;/p&gt;
&lt;h2&gt;
  
  
  How?
&lt;/h2&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%2Fcdn-images-1.medium.com%2Fmax%2F4408%2F1%2A01W2XwVEpRyg-3Ayt4FN5g.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F4408%2F1%2A01W2XwVEpRyg-3Ayt4FN5g.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;It’s not a framework, neither a library&lt;/em&gt;, is a **Query Language **for APIs and as specification itself, it’s compatible with any programming language 💫&lt;/p&gt;

&lt;p&gt;&lt;a href="https://graphql.org/" rel="noopener noreferrer"&gt;GraphQL: A query language for APIs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Master it 👩‍🎓👨‍🎓 with “&lt;a href="http://shop.oreilly.com/product/0636920137269.do" rel="noopener noreferrer"&gt;Learning GraphQL&lt;/a&gt;” by Eve Porcello &amp;amp; Alex Banks&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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2Au8MDB0zH-dDLCB82SSRwCQ.png" 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%2Fcdn-images-1.medium.com%2Fmax%2F2000%2F1%2Au8MDB0zH-dDLCB82SSRwCQ.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🌒🌔 The Migration 🌖🌘
&lt;/h2&gt;

&lt;p&gt;What could I say about the &lt;em&gt;GraphQL techs &amp;amp; tooling&lt;/em&gt;? Simply that I had deployed an API being able to interactively, fetch real data &amp;amp; explore full-updated docs (and much more)&lt;em&gt;, **within a couple hours&lt;/em&gt;*, just fast &amp;amp; fun!&lt;/p&gt;
&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;p&gt;1️⃣ Setup server &amp;amp; modular schema ⚙️&lt;br&gt;
2️⃣ Include DB &amp;amp; builders into the context&lt;br&gt;
3️⃣ Create domain’s typeDefs &amp;amp; resolvers 💪&lt;br&gt;
4️⃣ Implement &lt;a href="https://graphql.org/learn/execution/#trivial-resolvers" rel="noopener noreferrer"&gt;trivial resolvers&lt;/a&gt;&lt;br&gt;
5️⃣ Apply lessons learned 💡&lt;br&gt;
6️⃣ Deploy 🚀 it&lt;/p&gt;

&lt;p&gt;Doesn’t look like difficult right?, actually it’s not thanks to the brilliant GraphQL Community 🙌, &lt;a href="https://github.com/r-spacex/SpaceX-API/compare/master...swcarlosrj:graphql" rel="noopener noreferrer"&gt;don’t miss the changes made&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Draw them yourself… (fork it, break it, improve it but especially, enjoy it 😄)&lt;/p&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  &lt;a href="https://codesandbox.io/s/yv004pqnq9" rel="noopener noreferrer"&gt;👉 The Repo &amp;amp; The API &amp;amp; The Docs &amp;amp; The Everything👇&lt;/a&gt;
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/yv004pqnq9"&gt;
&lt;/iframe&gt;
&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%2Fcdn-images-1.medium.com%2Fmax%2F3840%2F1%2Af6IMUipNmjSrEp9iEAX4sw.jpeg" 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%2Fcdn-images-1.medium.com%2Fmax%2F3840%2F1%2Af6IMUipNmjSrEp9iEAX4sw.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Don’t miss the GraphQL best practices &amp;amp; conclusions based on SpaceX GraphQL API
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;h1&gt;
  
  
  &lt;strong&gt;👉 &lt;a href="https://medium.com/@swcarlosrj/lessons-learned-migrating-apis-to-graphql-8a015d08b163" rel="noopener noreferrer"&gt;Lessons Learned Migrating APIs to GraphQL 📝&lt;/a&gt; 👈&lt;/strong&gt;
&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;Please, consider🙏🏻ing, contribut♻️ing and shar💜ing it!&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>javascript</category>
      <category>spacex</category>
    </item>
    <item>
      <title>Why we should care about the community?</title>
      <dc:creator>Carlos Rufo</dc:creator>
      <pubDate>Wed, 10 Jul 2019 06:42:07 +0000</pubDate>
      <link>https://forem.com/swcarlosrj/why-we-should-care-about-the-community-1eoh</link>
      <guid>https://forem.com/swcarlosrj/why-we-should-care-about-the-community-1eoh</guid>
      <description>&lt;p&gt;April 14th, 2018 @ Amsterdam 🇳🇱 GraphQL Day&lt;br&gt;
1st event ever, I met &lt;a class="comment-mentioned-user" href="https://dev.to/nikolasburk"&gt;@nikolasburk&lt;/a&gt;
, @_marktani, helped by &lt;a class="comment-mentioned-user" href="https://dev.to/nikkitaftw"&gt;@nikkitaftw&lt;/a&gt;
 with some #HowToGraphQL stuff &amp;amp; introduced myself to &lt;a class="comment-mentioned-user" href="https://dev.to/manjula_dube"&gt;@manjula_dube&lt;/a&gt;
 with fun results.&lt;br&gt;
Props to @prisma for organizing such event!&lt;/p&gt;

&lt;p&gt;September 8th, 2018 @ San Francisco 🇺🇸 Reactathon&lt;br&gt;
1st conf ever, I had great time with &lt;a class="comment-mentioned-user" href="https://dev.to/eveporcello"&gt;@eveporcello&lt;/a&gt;
, @jnwng &amp;amp; &lt;a class="comment-mentioned-user" href="https://dev.to/benghamine"&gt;@benghamine&lt;/a&gt;
. Remember being hacking with @Saeris trying to make &lt;a class="comment-mentioned-user" href="https://dev.to/codesandbox"&gt;@codesandbox&lt;/a&gt;
 his IDE, now he's working there&lt;br&gt;
Props to @reactathon for organizing such event!&lt;/p&gt;

&lt;p&gt;October 13th, 2018 @ San Jose 🇺🇸 SV Code Camp&lt;br&gt;
1st code-camp ever, I talked with @paulweveritt &amp;amp; &lt;a class="comment-mentioned-user" href="https://dev.to/nebrius"&gt;@nebrius&lt;/a&gt;
. Got to listen Douglas Crockford arguing about all the JS stuff I was believing in, blowed my mind!&lt;br&gt;
Props to @PayPalEng for hosting such event!&lt;/p&gt;

&lt;p&gt;October 25th, 2018 @ Las Vegas 🇺🇸 React Conf&lt;br&gt;
1st React conf ever, I met &lt;a class="comment-mentioned-user" href="https://dev.to/dan_abramov"&gt;@dan_abramov&lt;/a&gt;
, &lt;a class="comment-mentioned-user" href="https://dev.to/jakedawkins"&gt;@jakedawkins&lt;/a&gt;
 &amp;amp; &lt;a class="comment-mentioned-user" href="https://dev.to/jsjoeio"&gt;@jsjoeio&lt;/a&gt;
. Definitely, we all were hooked that day!&lt;br&gt;
Props to @reactjs for organizing such event!&lt;/p&gt;

&lt;p&gt;November 7th, 2018 @ San Francisco 🇺🇸 GraphQL Summit&lt;br&gt;
1st GraphQL conf ever, met @UriGoldshtein &amp;amp; &lt;a class="comment-mentioned-user" href="https://dev.to/moontahoe"&gt;@moontahoe&lt;/a&gt;
. Remember talking about the cmty with @jaydenseric, few months later he created @graphqlmelb&lt;br&gt;
Props to @apollographql for organizing such event!&lt;/p&gt;

&lt;p&gt;December 8th, 2018 @ Lisbon 🇵🇹 GDG&lt;br&gt;
Met personally &lt;a class="comment-mentioned-user" href="https://dev.to/dabit3"&gt;@dabit3&lt;/a&gt;
, he encouraged to jump on public speaking, without those words couldn't be writing this. If you're a DevRel/TechLead, please keep inspiring people!&lt;br&gt;
Props to @GDGLisbon for organizing such event!&lt;/p&gt;

&lt;p&gt;February 20th, 2019 @ Sevilla 🇪🇸 TypeScript Meetup&lt;br&gt;
1st workshop ever, having your first workshop in your native language helps but having attendees willing to listen &amp;amp; learn, helps even more.&lt;br&gt;
Props to @SVQTypeScript for running such meetup!&lt;/p&gt;

&lt;p&gt;February 23rd, 2019 @ NYC 🇺🇸 GraphQL Patterns&lt;br&gt;
1st podcast ever, 1st talk in a foreign language too. I had the pleasure to join @jimmy_jia at his office, he knows lots of GraphQL!&lt;br&gt;
Props to &lt;a class="comment-mentioned-user" href="https://dev.to/dabit3"&gt;@dabit3&lt;/a&gt;
 for organizing such podcast!&lt;/p&gt;

&lt;p&gt;February 26th, 2019 @ NYC 🇺🇸 TypeScript Meetup&lt;br&gt;
1st talk ever, I got to meet &lt;a class="comment-mentioned-user" href="https://dev.to/jevakallio"&gt;@jevakallio&lt;/a&gt;
, he showed me the hidden gems of Manhattan, 3$ beer + shoot combo (btw all the best with restlessldn.dev)&lt;br&gt;
Props to &lt;a class="comment-mentioned-user" href="https://dev.to/orta"&gt;@orta&lt;/a&gt;
 for running such meetup!&lt;/p&gt;

&lt;p&gt;February 27th, 2019 @ NYC 🇺🇸 Nordic APIs Livecast&lt;br&gt;
1st livecast ever, shared screen with &lt;a class="comment-mentioned-user" href="https://dev.to/motleydev"&gt;@motleydev&lt;/a&gt;
 &amp;amp; &lt;a class="comment-mentioned-user" href="https://dev.to/lyonwj"&gt;@lyonwj&lt;/a&gt;
. Funny the Internet didn't work that day at my hotel, had to figure an office the same day.&lt;br&gt;
Props to @nordic_apis for organizing such livecast!&lt;/p&gt;

&lt;p&gt;March 4th, 2019 @ London 🇬🇧 JavaScript Community&lt;br&gt;
1st recorded talk ever. Because I wanted to ensure the recording was setup properly, something was wrong &amp;amp; during the talk my slides wouldn't show up!&lt;br&gt;
Props to @london_js for organizing such event!&lt;/p&gt;

&lt;p&gt;April 7th, 2019 @ Delhi 🇮🇳 JSLovers&lt;br&gt;
1st large workshop ever, with 2h sleep, 20h flights &amp;amp; 7h difference, with the love of &lt;a class="comment-mentioned-user" href="https://dev.to/hellonehha"&gt;@hellonehha&lt;/a&gt;
 &amp;amp; attendees, we had a blast!&lt;br&gt;
Props to @jslovers_del for organizing such event!&lt;/p&gt;

&lt;p&gt;April 12th, 2019 @ Bangalore 🇮🇳 GraphQL Asia&lt;br&gt;
1st conf talk ever, finally met &lt;a class="comment-mentioned-user" href="https://dev.to/rajoshighosh"&gt;@rajoshighosh&lt;/a&gt;
 , &lt;a class="comment-mentioned-user" href="https://dev.to/tanmaigo"&gt;@tanmaigo&lt;/a&gt;
 , @leeb , @rbzhu &amp;amp; &lt;a class="comment-mentioned-user" href="https://dev.to/swyx"&gt;@swyx&lt;/a&gt;
. Also @sidharta, @shruti &amp;amp; &lt;a class="comment-mentioned-user" href="https://dev.to/tanay"&gt;@tanay&lt;/a&gt;
 who will be speaking at @GraphQLHongKong&lt;br&gt;
Props to @HasuraHQ for organizing such conf!&lt;/p&gt;

&lt;p&gt;April 14th, 2019 @ Bangalore 🇮🇳 JSLovers&lt;br&gt;
1st 6h-workshop ever, had to be tired enough to get suggested for an attendee to take a break during one session. That break really helped me to recover &amp;amp; finish it!&lt;br&gt;
Props to &lt;a class="comment-mentioned-user" href="https://dev.to/hellonehha"&gt;@hellonehha&lt;/a&gt;
 for organizing such event!&lt;/p&gt;

&lt;p&gt;May 22nd, 2019 @ NYC 🇺🇸 Modern Web Online&lt;br&gt;
1st dropout talk ever, couldn't join &lt;a class="comment-mentioned-user" href="https://dev.to/ladyleet"&gt;@ladyleet&lt;/a&gt;
, @knitcodemonkey &amp;amp; @TatianaTMac. Paid off all previous effort with a well deserved burnout, couldn't barely move.&lt;br&gt;
Props to @moderndotweb for organizing such event!&lt;/p&gt;

&lt;p&gt;Sept 29th, 2019 @ Hong Kong 🇭🇰 GraphQL Hong Kong&lt;br&gt;
1st conf organizer ever, 1.5 years later, the cycle is complete!&lt;br&gt;
Props to y'all for inspiring us to organize such event!&lt;/p&gt;

&lt;p&gt;It's not coincidence the people I've mentioned they're successful &amp;amp; contribute to the community as well. Shout out to every single person who has collaborated with it, you're all incredible. Let's never miss the main goal of all of this, enjoy what we love!&lt;/p&gt;

&lt;p&gt;Sincerely,&lt;br&gt;
Carlos&lt;/p&gt;

</description>
      <category>graphql</category>
    </item>
  </channel>
</rss>
