<?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: Erik Giovani</title>
    <description>The latest articles on Forem by Erik Giovani (@erikgiovani).</description>
    <link>https://forem.com/erikgiovani</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%2F1019540%2Fac2a8ba9-d0ee-43db-9112-facab213a8ec.png</url>
      <title>Forem: Erik Giovani</title>
      <link>https://forem.com/erikgiovani</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/erikgiovani"/>
    <language>en</language>
    <item>
      <title>Women in Tech</title>
      <dc:creator>Erik Giovani</dc:creator>
      <pubDate>Fri, 01 Mar 2024 21:02:20 +0000</pubDate>
      <link>https://forem.com/erikgiovani/women-in-tech-51l6</link>
      <guid>https://forem.com/erikgiovani/women-in-tech-51l6</guid>
      <description>&lt;p&gt;Hi 👋, a year ago I made a list to make more visible the profiles of women content creators or who excel in programming or any topic related to technology, unfortunately it didn't have the support I would have liked and only two people have contributed, but I would like to invite you to take a look at it or if you admire someone's work in technology, feel free to contribute.&lt;/p&gt;

&lt;p&gt;It is still a small list and a work in progress, my plan is that when I have a larger list I will turn it into a website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ErikGIovani/mujeres-en-tecnologia"&gt;Women in Tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>wecoded</category>
    </item>
    <item>
      <title>GitHub + DEV 2023 Hackathon: Best GitHub</title>
      <dc:creator>Erik Giovani</dc:creator>
      <pubDate>Tue, 16 May 2023 06:13:44 +0000</pubDate>
      <link>https://forem.com/erikgiovani/github-dev-2023-hackathon-best-github-mb4</link>
      <guid>https://forem.com/erikgiovani/github-dev-2023-hackathon-best-github-mb4</guid>
      <description>&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;I built a web app with the parallax effect to be able to compete with other GitHub users with a points system based on the sum of the user's repos and the number of followers on GitHub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Category Submission
&lt;/h3&gt;

&lt;p&gt;Wacky Wildcards&lt;/p&gt;

&lt;h3&gt;
  
  
  App Link
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://best-github.vercel.app/"&gt;https://best-github.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vztjkssg9puex296jb7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vztjkssg9puex296jb7.png" alt="First section" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9iq9xptvv700op10j3az.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9iq9xptvv700op10j3az.png" alt="Second section" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Description
&lt;/h3&gt;

&lt;p&gt;Best GitHub is a web app where the user, by typing his GitHub username in the form, using the GitHub public api, can appear in the ranking of the first places to be able to compete against other users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Source Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/ErikGIovani/best-gihub"&gt;https://github.com/ErikGIovani/best-gihub&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissive License
&lt;/h3&gt;

&lt;p&gt;MIT&lt;/p&gt;

&lt;h2&gt;
  
  
  Background (What made you decide to build this particular app? What inspired you?)
&lt;/h2&gt;

&lt;p&gt;I was inspired by the hackathon, since I wanted several users to have fun competing to see who had the most points.&lt;/p&gt;

&lt;h3&gt;
  
  
  How I built it (How did you utilize GitHub Actions or GitHub Codespaces? Did you learn something new along the way? Pick up a new skill?)
&lt;/h3&gt;

&lt;p&gt;I built everything directly with GitHub Codespaces and have been using them for several months from a Raspberry Pi 3B+.&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Resources/Info
&lt;/h3&gt;

&lt;p&gt;All additional information can be found in the Series of this post.&lt;/p&gt;

</description>
      <category>githubhack23</category>
    </item>
    <item>
      <title>Best GitHub parte 4</title>
      <dc:creator>Erik Giovani</dc:creator>
      <pubDate>Mon, 15 May 2023 23:15:30 +0000</pubDate>
      <link>https://forem.com/erikgiovani/best-github-parte-4-52m2</link>
      <guid>https://forem.com/erikgiovani/best-github-parte-4-52m2</guid>
      <description>&lt;p&gt;Hola 👋, en este post terminaremos la parte del backend con &lt;strong&gt;Next JS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para empezar, dentro de nuestra carpeta &lt;strong&gt;api&lt;/strong&gt; que se encuentra dentro de la carpeta &lt;strong&gt;pages&lt;/strong&gt;, vamos a crear un archivo llamado &lt;strong&gt;search-place.ts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dentro de este archivo agregaremos el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import type { NextApiRequest, NextApiResponse } from "next";

import messages from "@/utils/messages";

export default async function handler(req: NextApiRequest,res: NextApiResponse) {
  if (req.method !== "POST") {
    return res.status(404).json(messages.notFound);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como te habrás dado cuenta, la estructura es muy parecida a lo que habíamos hecho en el post anterior, pero esta vez vamos de usar el método &lt;strong&gt;GET&lt;/strong&gt; usaremos el método &lt;strong&gt;POST&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Antes de continuar, vamos a instalar una dependencia llamada &lt;strong&gt;Zod&lt;/strong&gt; para validar el usuario de GitHub que vamos a resibir.&lt;/p&gt;

&lt;p&gt;Esto lo haremos con el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add zod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si estás usando &lt;strong&gt;NPM&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install zod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya instalado, crearemos un archivo llamado &lt;strong&gt;validations.ts&lt;/strong&gt;, dentro de nuestra carpeta &lt;strong&gt;utils&lt;/strong&gt;, ahí procederemos a escribir el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { z } from "zod";

export const userZodSchema = z.object({
  username: z.string().trim().min(1),
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo que estoy haciendo es importar &lt;strong&gt;z&lt;/strong&gt; desde &lt;strong&gt;zod&lt;/strong&gt; para poder acceder a su propiedad &lt;strong&gt;object&lt;/strong&gt;, que nos sirve para poder validar varios datos, pasándole un solo objeto, en lugar de validar dato por dato, también estoy validando un dato como un objeto en caso de que quiera después agregar más datos para validar que vengan del frontend.&lt;/p&gt;

&lt;p&gt;La key &lt;strong&gt;username&lt;/strong&gt; va a tener la validación del username, en este caso le estoy diciendo con &lt;strong&gt;z.string&lt;/strong&gt; que quiero que el dato sea de tipo &lt;strong&gt;string&lt;/strong&gt;, con el &lt;strong&gt;trim&lt;/strong&gt; le estoy diciendo que si el string recibido tiene espacios se los quite, y con &lt;strong&gt;min(1)&lt;/strong&gt; le estoy diciendo que el username no puede estar vacío y debe tener minimo un carácter.&lt;/p&gt;

&lt;p&gt;Y ese esquema de validación lo estoy guardando en una constante llamada &lt;strong&gt;userZodSchema&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ahora en nuestro archivo &lt;strong&gt;search-place.ts&lt;/strong&gt;, procederemos a importar nuestro esquema y agregar el siguiente código después del &lt;strong&gt;if&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const result = userZodSchema.safeParse(req.body);

if (!result.success) {
  return res.status(400).json(messages.error);
}

const { username } = result.data;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo que hace ese código, es que estamos accediendo a la propiedad &lt;strong&gt;safeParse&lt;/strong&gt; que nos crea &lt;strong&gt;zod&lt;/strong&gt; en nuestro esquema de validación, que sirve para que si el dato recibido no cumple con las validaciones que le agregamos no nos mande un error, depués va a recibir todo lo que venga del &lt;strong&gt;req.body&lt;/strong&gt; de la petición que nos manden a la ruta &lt;strong&gt;/api/search-place&lt;/strong&gt; con el método &lt;strong&gt;POST&lt;/strong&gt; y guardaremos el resultado en una constante llamada &lt;strong&gt;result&lt;/strong&gt;, si el objeto recibido tiene más propiedades aparte del &lt;strong&gt;username&lt;/strong&gt;, nuestro esquema de validación directamente las ignorará.&lt;/p&gt;

&lt;p&gt;En el &lt;strong&gt;if&lt;/strong&gt; lo que estoy haciendo es revisar que la constante &lt;strong&gt;result&lt;/strong&gt; no tenga una propiedad llamada &lt;strong&gt;success&lt;/strong&gt; en &lt;strong&gt;true&lt;/strong&gt;, que significa que el dato recibido no cumple con las validaciones que agregamos,y responda con el mensaje de error de nuestras utilidades que habíamos creado en el post anterior, y si existe la propiedad &lt;strong&gt;success&lt;/strong&gt;, entonces de &lt;strong&gt;data&lt;/strong&gt; desestructuramos el &lt;strong&gt;username&lt;/strong&gt; ya validado.&lt;/p&gt;

&lt;p&gt;Ahora en nuestra carpeta &lt;strong&gt;util&lt;/strong&gt; vamos a crear un archivo llamado &lt;strong&gt;githubCall.ts&lt;/strong&gt; y dentro agregaremos el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const githubCall = async(username: string) =&amp;gt; {
    const response = await fetch(`https://api.github.com/users/${username}`);
    const user = await response.json();
    return user;
}

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

&lt;/div&gt;



&lt;p&gt;Como podrás ver, es solo una función que recibe el &lt;strong&gt;username&lt;/strong&gt; y hace una llamada al &lt;strong&gt;api pública de GitHub&lt;/strong&gt; y nos retorna los datos públicos de su perfil de GitHub.&lt;/p&gt;

&lt;p&gt;También crearemos un archivo llamado &lt;strong&gt;changeUser.ts&lt;/strong&gt; dentro de nuestra carpeta &lt;strong&gt;utils&lt;/strong&gt;, y agregaremos el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { PrismaClient } from "@prisma/client";

import type { NewUser } from "./types";

const prisma = new PrismaClient();

const changeUser = async (userID: string, newUser: NewUser) =&amp;gt; {
  const updatedUser = await prisma.user.update({
    where: { id: userID },
    data: newUser,
  });

  if (updatedUser) {
    console.log("User Updated");
  } else {
    console.error("Error Updating User");
  }
};

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

&lt;/div&gt;



&lt;p&gt;Esta utilidad nos va a servir para actualizar a los lugares ganadores,  por eso la función esta recibiendo el &lt;strong&gt;userID&lt;/strong&gt; y el &lt;strong&gt;newUser&lt;/strong&gt;, dentro de la función estamos accediendo a la propiedad &lt;strong&gt;user&lt;/strong&gt; de nuestro &lt;strong&gt;user&lt;/strong&gt; en &lt;strong&gt;prisma&lt;/strong&gt; para actualizar los del usuario por los del nuevo usuario identificándolo por su ID. &lt;/p&gt;

&lt;p&gt;También crearemos un archivo &lt;strong&gt;newUser.ts&lt;/strong&gt; dentro de nuestra carpeta &lt;strong&gt;utils&lt;/strong&gt; con el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import type { NextApiResponse } from "next";

import changeUser from "./changeUser";
import type { GitHubUser, NewUser } from "./types";
import type { User } from "@prisma/client";

const newUser = async (
  res: NextApiResponse,
  user: GitHubUser,
  users: User[]
) =&amp;gt; {
  const newUser: NewUser = {
    username: user.login,
    name: user.name,
    url: user.html_url,
    avatar: user.avatar_url,
    total: user.public_repos + user.followers,
  };

  if (newUser.total &amp;gt;= users[0].total) {
    await changeUser(users[0].id, newUser);
    return res.status(200).json({
      message: "Congratulations, you are in the first place",
    });
  } else if (
    newUser.total &amp;lt; users[0].total &amp;amp;&amp;amp;
    newUser.total &amp;gt;= users[1].total
  ) {
    await changeUser(users[1].id, newUser);
    return res.status(200).json({
      message: "Congratulations, you are in the second place",
    });
  } else if (
    newUser.total &amp;lt; users[1].total &amp;amp;&amp;amp;
    newUser.total &amp;gt;= users[2].total
  ) {
    await changeUser(users[2].id, newUser);
    return res.status(200).json({
      message: "Congratulations, you are in the third place",
    });
  } else {
    return res.status(200).json({
      message: "Sorry, you are not in any of the first places",
    });
  }
};

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

&lt;/div&gt;



&lt;p&gt;Lo que está haciendo ese código es ver si el nuevo usuario tiene más puntos o menos que cualquiera de los tres usuarios en nuestra base de datos, y si tiene más o igual de puntos lo va a sustituir.&lt;/p&gt;

&lt;p&gt;Para finalizar, nuestro archivo &lt;strong&gt;search-place.ts&lt;/strong&gt; se tendría que ver de esta forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import type { NextApiRequest, NextApiResponse } from "next";

import messages from "@/utils/messages";
import { userZodSchema } from "@/utils/validations";
import githubCall from "@/utils/githubCall";
import usersCall from "@/utils/usersCall";
import newUser from "@/utils/newUser";

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  if (req.method !== "POST") {
    return res.status(404).json(messages.notFound);
  }

  const result = userZodSchema.safeParse(req.body);

  if (!result.success) {
    return res.status(400).json(messages.error);
  }

  const { username } = result.data;

  try {
    const user = await githubCall(username);

    if (user.message) {
      return res.status(400).json({ message: "The username not exist" });
    }

    const users = await usersCall();

    return await newUser(res, user, users);
  } catch (error) {
    return res.status(400).json(messages.error);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>githubhack23</category>
      <category>nextjs</category>
      <category>typescript</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Best GitHub parte 3</title>
      <dc:creator>Erik Giovani</dc:creator>
      <pubDate>Wed, 03 May 2023 01:41:37 +0000</pubDate>
      <link>https://forem.com/erikgiovani/best-github-parte-3-4982</link>
      <guid>https://forem.com/erikgiovani/best-github-parte-3-4982</guid>
      <description>&lt;p&gt;Hola de nuevo 👋, en este post vamos a crear el backend en &lt;strong&gt;Next JS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vamos a empezar accediendo a la carpeta &lt;strong&gt;api&lt;/strong&gt; que se encuentra dentro de la carpeta &lt;strong&gt;pages&lt;/strong&gt; que se encuentra dentro de la carpeta &lt;strong&gt;src&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Una vez ahí, nos encontraremos con un archivo &lt;strong&gt;hello.ts&lt;/strong&gt;, lo que haremos será renombrarlo a &lt;strong&gt;places.ts&lt;/strong&gt; y hacer que quede de esta forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import type { NextApiRequest, NextApiResponse } from "next";

export default async function handler(req: NextApiRequest,res: NextApiResponse ) {

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

&lt;/div&gt;



&lt;p&gt;Ahora en la carpeta &lt;strong&gt;src&lt;/strong&gt; vamos a proceder a crear una carpeta llamada &lt;strong&gt;utils&lt;/strong&gt;, que es la que va a contener todas las utilidades que vamos a utilizar en el frontend como en el backend.&lt;/p&gt;

&lt;p&gt;Dentro de la carpeta &lt;strong&gt;utils&lt;/strong&gt; vamos a crear un archivo &lt;strong&gt;messages.ts&lt;/strong&gt;, que va a tener los mensajes de respuesta que se van a usar en más de un lugar, así evitaremos reescribir código.&lt;/p&gt;

&lt;p&gt;Dentro del archivo &lt;strong&gt;messages.ts&lt;/strong&gt; vamos a agregar el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const messages = {
  error: { message: "There was an error, please try again later" },
  notFound: { message: "Not found" },
};

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

&lt;/div&gt;



&lt;p&gt;La constante &lt;strong&gt;messages&lt;/strong&gt; almacena un objeto con dos objetos, el primero lo vamos a utilizar como un mensaje de error general y el segundo como un mensaje de error cuando traten de acceder a alguno de nuestros endpoints con un método distinto al que establezcamos.&lt;/p&gt;

&lt;p&gt;Una vez aclarado, accederemos a nuesto archivo &lt;strong&gt;places.ts&lt;/strong&gt; y dentro de la función &lt;strong&gt;handler&lt;/strong&gt; agregaremos el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (req.method !== "GET") {
  return res.status(404).json(messages.notFound);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El &lt;strong&gt;if&lt;/strong&gt; sirve para que si alguien trata de acceder a la ruta &lt;strong&gt;/api/places&lt;/strong&gt; con un método distinto al método &lt;strong&gt;GET&lt;/strong&gt; le responda al usuario con un código de estado &lt;strong&gt;404&lt;/strong&gt; y el mensaje &lt;strong&gt;{ message: "Not found" }&lt;/strong&gt; en formato JSON.&lt;/p&gt;

&lt;p&gt;Así que nuestro archivo &lt;strong&gt;places.ts&lt;/strong&gt; se tendría que ver de esta forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import type { NextApiRequest, NextApiResponse } from "next";

import messages from "@/utils/messages";

export default async function handler(req: NextApiRequest,res: NextApiResponse) {
  if (req.method !== "GET") {
    return res.status(404).json(messages.notFound);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora crearemos en la carpeta &lt;strong&gt;utils&lt;/strong&gt; un archivo &lt;strong&gt;usersCall.ts&lt;/strong&gt;, que usaremos para traer con &lt;strong&gt;prisma&lt;/strong&gt; todos los usuarios que tenemos agregados en nuestra base de datos de &lt;strong&gt;MongoDB Atlas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Una vez creado agregaremos el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

const usersCall = async () =&amp;gt; {
  const users = await prisma.user.findMany();
  const usersOrdered = users.sort((a, b) =&amp;gt; b.total - a.total);
  return usersOrdered;
};

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

&lt;/div&gt;



&lt;p&gt;En la constante &lt;strong&gt;users&lt;/strong&gt; estoy guardando todos los usuarios que he mandado a llamar con &lt;strong&gt;prisma&lt;/strong&gt; con la función &lt;strong&gt;findMany&lt;/strong&gt;, y en la constante &lt;strong&gt;usersOrdered&lt;/strong&gt; estoy guardando todos los usuarios ordenados por el total de mayor a menor con el método &lt;strong&gt;sort&lt;/strong&gt; de JavaScript.&lt;/p&gt;

&lt;p&gt;Ahora en nuestro archivo &lt;strong&gt;places.ts&lt;/strong&gt; después del &lt;strong&gt;if&lt;/strong&gt; agregaremos el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;try {
    const users = await usersCall();

    if (users.length === 0) {
      return res.status(400).json(messages.error);
    }

    res.status(200).json(users);
} catch (error) {
    res.status(400).json(messages.error);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En la constante &lt;strong&gt;users&lt;/strong&gt; estoy guardando los usuarios ordenados de mayor a menor por el total desde la función &lt;strong&gt;usersCall&lt;/strong&gt;, en el &lt;strong&gt;if&lt;/strong&gt; estoy comprobando que si los usuarios son cero, me retorne un código de estado &lt;strong&gt;400&lt;/strong&gt; y un mensaje &lt;strong&gt;{ message: "There was an error, please try again later" }&lt;/strong&gt; en formato JSON.&lt;/p&gt;

&lt;p&gt;Y si no, me retorne un código de estado &lt;strong&gt;200&lt;/strong&gt;, y todos los usuarios ordenados de mayor a menor en formato JSON, pero si todo eso falla, ya sea porque la base de datos se encuentre caída o alguna causa no provista, me retorne con un catch la respuesta de código de estado &lt;strong&gt;400&lt;/strong&gt; y el mensaje &lt;strong&gt;{ message: "There was an error, please try again later" }&lt;/strong&gt; en formato JSON.&lt;/p&gt;

&lt;p&gt;Así que tu archivo &lt;strong&gt;places.ts&lt;/strong&gt; tendría que verse de esta forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import type { NextApiRequest, NextApiResponse } from "next";

import messages from "@/utils/messages";
import usersCall from "@/utils/usersCall";

export default async function handler(req: NextApiRequest,res: NextApiResponse) {
  if (req.method !== "GET") {
    return res.status(404).json(messages.notFound);
  }

  try {
    const users = await usersCall();

    if (users.length === 0) {
      return res.status(400).json(messages.error);
    }

    res.status(200).json(users);
  } catch (error) {
    res.status(400).json(messages.error);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eso es todo por este post, en el siguiente post crearemos una ruta más para poder cambiar los lugares consultando el api pública de &lt;strong&gt;GitHub&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>githubhack23</category>
      <category>nextjs</category>
      <category>typescript</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Best GitHub parte 2</title>
      <dc:creator>Erik Giovani</dc:creator>
      <pubDate>Sun, 30 Apr 2023 00:44:58 +0000</pubDate>
      <link>https://forem.com/erikgiovani/best-github-parte-2-52e7</link>
      <guid>https://forem.com/erikgiovani/best-github-parte-2-52e7</guid>
      <description>&lt;p&gt;Hola 👋, lo prometido es deuda, así que es momento de empezar a escribir código.&lt;/p&gt;

&lt;p&gt;Empezaremos creando un nuevo proyecto con la herramienta &lt;strong&gt;create-next-app&lt;/strong&gt; de Next JS, yo la voy a usar con el gestor de dependencias &lt;strong&gt;Yarn&lt;/strong&gt;, pero si tú gustas puedes hacerlo con &lt;strong&gt;NPM&lt;/strong&gt; o con &lt;strong&gt;PNPM&lt;/strong&gt;, eso ya es a tu gusto.&lt;/p&gt;

&lt;p&gt;En la terminal de nuestro &lt;strong&gt;GitHub Codespace&lt;/strong&gt; debes proceder a ejecutar el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn create next-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si estás usando NPM debes ejecutar el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-next-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para abrir una terminal en &lt;strong&gt;GitHub Codespaces&lt;/strong&gt; necesitas dar click en el &lt;strong&gt;menú de hamburguesa&lt;/strong&gt; de la izquierda, después tienes que dar click en &lt;strong&gt;Terminal&lt;/strong&gt; y después en &lt;strong&gt;Nuevo terminal&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fteva8ysqc4dogs8ipkey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fteva8ysqc4dogs8ipkey.png" alt="Crear nueva terminal" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eso nos abrirá una terminal, por lo que tu &lt;strong&gt;GitHub Codespace&lt;/strong&gt; debería verse algo parecido a esto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ckihvg567cpojhhkt05.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ckihvg567cpojhhkt05.png" alt="Terminal" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al ejecutar el comando de &lt;strong&gt;create-next-app&lt;/strong&gt; nos hara las siguientes preguntas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What is your project named? … my-app
Would you like to use TypeScript with this project? … No / Yes
Would you like to use ESLint with this project? … No / Yes
Would you like to use Tailwind CSS with this project? … No / Yes
Would you like to use `src/` directory with this project? … No / Yes
Would you like to use experimental `app/` directory with this project? … No / Yes
What import alias would you like configured? … @/*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para elegir, &lt;strong&gt;Yes&lt;/strong&gt; o &lt;strong&gt;No&lt;/strong&gt;, puedes hacerlo con las flechas de izquierda y derecha del teclado, y para continuar con la siguiente pregunta solo tienes que presionar la tecla Enter.&lt;/p&gt;

&lt;p&gt;Yo le he dado a todo si, excepto a usar el directorio app y a usar tailwind, al nombre del proyecto y al import alias los dejé como están por defecto.&lt;/p&gt;

&lt;p&gt;Eso nos generará una nueva carpeta con todos lo necesario para desarrollar en &lt;strong&gt;Next JS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj061bfrwu0eteckhjl6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj061bfrwu0eteckhjl6g.png" alt="Estructura del proyecto" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo primero que haré será arrastrar todo el contenido de la carpeta generada, a la carpeta principal, y borraremos la carpeta vacía.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefqbp1g2vipb8ghoj1hs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fefqbp1g2vipb8ghoj1hs.png" alt="Estructura modificada" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como puedes ver, nos aparece en el icono de &lt;strong&gt;Git&lt;/strong&gt; que tenemos más de 10.000 archivos modificados, no te preocupes, eso se resuelve dando click en el icono de &lt;strong&gt;Git&lt;/strong&gt; que se encuentra en la izquierda y después dando click en el icono de &lt;strong&gt;Refesh&lt;/strong&gt; que aparece hasta arriba.&lt;/p&gt;

&lt;p&gt;Ahora instalaremos algunos paquetes que necesitaremos, los cuales serán &lt;strong&gt;prisma&lt;/strong&gt; y &lt;strong&gt;ts-node&lt;/strong&gt; como dependencias de desarrollo, lo haremos ejecutando el siguiente comando en la terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add -D prisma ts-node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si estás usando &lt;strong&gt;NPM&lt;/strong&gt; con el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -D prisma ts-node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez instalados, para empezar a usar &lt;strong&gt;Prisma&lt;/strong&gt; primero necesitamos ejecutar el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx prisma init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eso nos creará una carpeta llamada &lt;strong&gt;prisma&lt;/strong&gt;, un archivo &lt;strong&gt;.env&lt;/strong&gt; y nos mostrará el siguiente mensaje en la terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✔ Your Prisma schema was created at prisma/schema.prisma
  You can now open it in your favorite editor.

warn You already have a .gitignore file. Don't forget to add `.env` in it to not commit any private information.

Next steps:
1. Set the DATABASE_URL in the .env file to point to your existing database. If your database has no tables yet, read https://pris.ly/d/getting-started
2. Set the provider of the datasource block in schema.prisma to match your database: postgresql, mysql, sqlite, sqlserver, mongodb or cockroachdb.
3. Run prisma db pull to turn your database schema into a Prisma schema.
4. Run prisma generate to generate the Prisma Client. You can then start querying your database.

More information in our documentation:
https://pris.ly/d/getting-started
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora tienes que crear una cuenta en &lt;strong&gt;MongoDB Atlas&lt;/strong&gt; si aún no tienes una, y agregar la url de tu base de datos en el archivo &lt;strong&gt;.env&lt;/strong&gt;, si aún no sabes como usar &lt;strong&gt;MongoDB Atlas&lt;/strong&gt;, te dejo este video para que aprendas a usarlo.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/97FfXEy1zas"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Después abriremos el archivo &lt;strong&gt;schema.prisma&lt;/strong&gt; que se encuentra en la carpeta &lt;strong&gt;prisma&lt;/strong&gt;, y cambiaremos &lt;strong&gt;postgresql&lt;/strong&gt; por &lt;strong&gt;mongodb&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Y procederemos a agregar un nuevo modelo llamado &lt;strong&gt;User&lt;/strong&gt; de la siguiente forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model User {
  id       String @id @default(auto()) @map("_id") @db.ObjectId
  username String
  name     String
  avatar   String
  url      String
  total    Int
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El tipo &lt;code&gt;String @id @default(auto()) @map("_id") @db.ObjectId&lt;/code&gt; sirve para decirle a &lt;strong&gt;prisma&lt;/strong&gt; que el id va a ser de tipo &lt;strong&gt;string&lt;/strong&gt; y autogenerado por MongoDB&lt;/p&gt;

&lt;p&gt;Si todo ha salido bien, tu archivo &lt;strong&gt;schema.prisma&lt;/strong&gt; debería de verse así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mongodb"
  url      = env("DATABASE_URL")
}

model User {
  id       String @id @default(auto()) @map("_id") @db.ObjectId
  username String
  name     String
  avatar   String
  url      String
  total    Int
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para darle un mejor formato y autocompletado a los archivos &lt;strong&gt;.prisma&lt;/strong&gt;, te recomiendo instalar en vscode una extensión llamada &lt;strong&gt;Prisma&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aquí te dejo el enlace: &lt;a href="https://marketplace.visualstudio.com/items?itemName=Prisma.prisma"&gt;https://marketplace.visualstudio.com/items?itemName=Prisma.prisma&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora, para empezar a poblar nuestra base de datos, crearemos una Semilla, para eso crearemos un archivo &lt;strong&gt;seed.ts&lt;/strong&gt; en la carpeta &lt;strong&gt;prisma&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pero antes necesitamos instalar el paquete &lt;strong&gt;@prisma/client&lt;/strong&gt; con el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add @prisma/client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si estás usando &lt;strong&gt;NPM&lt;/strong&gt; con el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @prisma/client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ese comando aparte de instalar &lt;strong&gt;@prisma/client&lt;/strong&gt; también ejecuta automáticamente el comando &lt;strong&gt;npx prisma generate&lt;/strong&gt;, para poder crear el modelo &lt;strong&gt;User&lt;/strong&gt; en prisma, por lo que si haces más cambios en el modelo en el esquema o agregas un modelo nuevo para que prisma pueda detectar los cambios tienes que ejecutar manualmente &lt;strong&gt;npx prisma generate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;En nuestro archivo &lt;strong&gt;seed.ts&lt;/strong&gt; agregaremos el siguiente código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

const seed = async () =&amp;gt; {
  const Users = await prisma.user.createMany({
    data: [
      {
        username: "ErikGIovani",
        name: "Erik Giovani",
        url: "https://github.com/ErikGIovani",
        avatar: "https://avatars.githubusercontent.com/u/46170949?v=4",
        total: 35,
      },
      {
        username: "Dino",
        name: "Dino Picapiedra",
        url: "https://github.com/ErikGIovani",
        avatar: "https://avatars.githubusercontent.com/u/46170949?v=4",
        total: 40,
      },
      {
        username: "Pablo",
        name: "Pablo Marmol",
        url: "https://github.com/ErikGIovani",
        avatar: "https://avatars.githubusercontent.com/u/46170949?v=4",
        total: 16,
      },
    ],
  });

  console.log(Users);
};

seed()
  .then(async () =&amp;gt; {
    await prisma.$disconnect();
  })
  .catch(async (error) =&amp;gt; {
    console.error(error);
    await prisma.$disconnect();
    process.exit(1);
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En esta semilla estoy creando una función flecha llamada &lt;strong&gt;seed&lt;/strong&gt; que va a ser asíncrona, dentro de esa función estoy mandando a llamar al cliente de &lt;strong&gt;prisma&lt;/strong&gt; y accediendo a su propiedad &lt;strong&gt;user&lt;/strong&gt;, que es para poder acceder al modelo User que agregamos al esquema en el archivo &lt;strong&gt;schema.prisma&lt;/strong&gt;, y finalmente accediendo a su función &lt;strong&gt;createMany&lt;/strong&gt; para agregar varios usuarios de prueba con una sola llamada a la base de datos.&lt;/p&gt;

&lt;p&gt;Depués mando a llamar a la función &lt;strong&gt;seed&lt;/strong&gt; y al finalizar la ejecución de la función hago una llamada a la funcion &lt;strong&gt;$disconnect()&lt;/strong&gt; de prisma, para cerrar la conexión con la base de datos.&lt;/p&gt;

&lt;p&gt;Para hacer funcionar nuestra semilla, en nuestro archivo &lt;strong&gt;package.json&lt;/strong&gt; agregaremos la siguiente propiedad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"prisma": {
    "seed": "ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts"
},
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La opción &lt;strong&gt;--compiler-options {\"module\":\"CommonJS\"}&lt;/strong&gt;, sirve para decirle a ts-node que ejecute nuesto archivo seed.ts de manera transpilada como si fuera CommonJS, eso lo hacemos porque si no nos daría un error por usar import sin configurar el type module en el &lt;strong&gt;package.json&lt;/strong&gt; o agregar la configuración en el archivo de configuración de &lt;strong&gt;TypeScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para usar nuestra seed ejecutamos el siguiente comando en la terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx prisma db seed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para evitar hacer este post demasiado largo, eso es todo por este post, en el siguiente post crearemos la lógica del backend en &lt;strong&gt;Next JS&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>githubhack23</category>
      <category>nextjs</category>
      <category>typescript</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Best GitHub</title>
      <dc:creator>Erik Giovani</dc:creator>
      <pubDate>Thu, 27 Apr 2023 01:04:51 +0000</pubDate>
      <link>https://forem.com/erikgiovani/best-github-4n60</link>
      <guid>https://forem.com/erikgiovani/best-github-4n60</guid>
      <description>&lt;p&gt;Hola 👋, este es mi primer post que escribo, así que si algo de lo que escribo es confuso o tiene faltas de ortografía, te pido una disculpa.&lt;/p&gt;

&lt;p&gt;En este post te voy a enseñar los pasos de como estoy desarrollando una web app llamada &lt;strong&gt;Best GitHub&lt;/strong&gt; para el hackathon de &lt;strong&gt;GitHub&lt;/strong&gt; Y &lt;strong&gt;DEV&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next JS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zod&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prisma&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MongoDB Atlas&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Codespaces&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Primeros Pasos
&lt;/h2&gt;

&lt;p&gt;Para empezar, primero voy a crear un nuevo repositorio en &lt;strong&gt;GitHub&lt;/strong&gt;, lo puedes hacer en la parte de arriba de tu perfil, dando click en el botón con el signo &lt;strong&gt;+&lt;/strong&gt; y después dando click en la parte que dice &lt;strong&gt;New repository&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq2fg3xm7tw9pddrwspdq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq2fg3xm7tw9pddrwspdq.png" alt="Creando un repositorio" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nos mandará a una página parecida a esta, dónde tendremos que poner el nombre que va a tener el proyecto, también puedes agregar una descripción, pero eso ya es opcional, de cualquier forma puedes agregarla o cambiarla después.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4e6gdfteoc05igy26ga.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4e6gdfteoc05igy26ga.png" alt="Configurando el repositorio" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo que sí haremos será marcar la casilla que dice &lt;strong&gt;Add a README file&lt;/strong&gt;, ya que sin un archivo, &lt;strong&gt;GitHub Codespaces&lt;/strong&gt; puede tener problemas para dejarnos crear archivos.&lt;/p&gt;

&lt;p&gt;Solo falta dar click en el botón que dice &lt;strong&gt;Create repository&lt;/strong&gt; para que nos redirija al repositorio.&lt;/p&gt;

&lt;p&gt;Para crear un &lt;strong&gt;GitHub Codespace&lt;/strong&gt; le daremos click al botón que dice &lt;strong&gt;Code&lt;/strong&gt;, después a la pestaña que dice &lt;strong&gt;Codespaces&lt;/strong&gt;, para finalizar le daremos click al botón que dice &lt;strong&gt;Create codespace on main&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F381z4y78g43qoek6sbby.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F381z4y78g43qoek6sbby.png" alt="Creando un GitHub Codespace" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eso nos abrirá una nueva pestaña en el navegador con nuestro &lt;strong&gt;GitHub Codespace&lt;/strong&gt;, como en esta imagen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fleqiy905i660i0d07r81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fleqiy905i660i0d07r81.png" alt="GitHub Codespace" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eso es todo por este post, en el siguiente empezaremos a escribir código. Tenía pensado en este post agregar como configurar más a detalle los &lt;strong&gt;GitHub Codespaces&lt;/strong&gt;, pero sería demasiado largo, así que dejaré eso para un post fuera de esta serie.&lt;/p&gt;

&lt;p&gt;Espero que te haya gustado y espero verte en el siguiente post, saludos!!&lt;/p&gt;

</description>
      <category>githubhack23</category>
      <category>nextjs</category>
      <category>typescript</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
