<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jonathan Delgado</title>
    <description>The latest articles on DEV Community by Jonathan Delgado (@jondotsoy).</description>
    <link>https://dev.to/jondotsoy</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%2F32301%2F7a46ba69-8a66-473a-8e8e-cac27012e8f5.jpeg</url>
      <title>DEV Community: Jonathan Delgado</title>
      <link>https://dev.to/jondotsoy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jondotsoy"/>
    <language>en</language>
    <item>
      <title>Simplifica la publicación en npm con este flujo de trabajo</title>
      <dc:creator>Jonathan Delgado</dc:creator>
      <pubDate>Fri, 11 Oct 2024 16:00:19 +0000</pubDate>
      <link>https://dev.to/jondotsoy/simplifica-la-publicacion-en-npm-con-este-flujo-de-trabajo-ilj</link>
      <guid>https://dev.to/jondotsoy/simplifica-la-publicacion-en-npm-con-este-flujo-de-trabajo-ilj</guid>
      <description>&lt;p&gt;Este es el stack perfecto para publicar tus librerías de JavaScript en &lt;a href="https://www.npmjs.com" rel="noopener noreferrer"&gt;npm&lt;/a&gt; sin esfuerzo. Esta guía quiere presentar un flujo de despliegue para pasar de código alojado en github a &lt;a href="https://www.npmjs.com" rel="noopener noreferrer"&gt;npm&lt;/a&gt;. Con el fin de evitar la mayoría de los errores humanos al mantener un flujo de trabajo claro y simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contenido:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Por que npm&lt;/li&gt;
&lt;li&gt;
Paso 1: Crear nuestro token para publicar

&lt;ul&gt;
&lt;li&gt;Opción 1: Crear token desde la WEB&lt;/li&gt;
&lt;li&gt;Opción 2: Crear token desde la terminal&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Paso 2: Preparación del código para publicación&lt;/li&gt;

&lt;li&gt;

Paso 3: Empaquetar el código

&lt;ul&gt;
&lt;li&gt;Puntos de entrada (Propiedad &lt;code&gt;main&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Múltiples puntos de entrada (Propiedad &lt;code&gt;exports&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Paso 4 (Opcional): Probar código&lt;/li&gt;

&lt;li&gt;

Paso 5: Automatizar publicación

&lt;ul&gt;
&lt;li&gt;Secretos&lt;/li&gt;
&lt;li&gt;Job &lt;code&gt;release-please&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Job &lt;code&gt;delivery-npm&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Conclusion&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Por que npm
&lt;/h2&gt;

&lt;p&gt;(&lt;a href="https://www.npmjs.com" rel="noopener noreferrer"&gt;www.npmjs.com&lt;/a&gt;) este es un registry que usan por defecto node.js y bun para descargar dependencias de los proyectos cuando usamos &lt;code&gt;npm add&lt;/code&gt; o &lt;code&gt;bun add&lt;/code&gt;. Este registry es gratuito y si queremos compartir código entre la comunidad o nuestros proyectos es buena idea alojar este código aquí. Si bien permite guardar cualquier tipo de archivo, lo normal es guardar archivos escritos en JavaScript.&lt;/p&gt;

&lt;p&gt;Además, es importante mencionar que este sitio tiene una serie de reglas al momento de publicar código:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cada paquete debe tener al menos un archivo &lt;code&gt;package.json&lt;/code&gt; con una propiedad &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;version&lt;/code&gt; y &lt;code&gt;description&lt;/code&gt;. También es buena idea agregar una propiedad &lt;code&gt;license&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Puede ser publicado un paquete privado o público. Sin embargo, de ser privado puede tener tiene un costo que puedes revisar aquí (npmjs.com/products)[&lt;a href="https://www.npmjs.com/products" rel="noopener noreferrer"&gt;https://www.npmjs.com/products&lt;/a&gt;].&lt;/li&gt;
&lt;li&gt;Toda actualización de un paquete ya publicado debe tener una versión superior a la anterior.&lt;/li&gt;
&lt;li&gt;No se pueden reemplazar paquetes ya publicados a no ser que tú seas el dueño de ese paquete&lt;/li&gt;
&lt;li&gt;Todas las versiones deben seguir la convención semver&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Debido a estas reglas que impiden publicar versiones antiguas, es importante considerar el uso de generadores de versiones, entre los que podemos encontrar &lt;a href="https://github.com/semantic-release/semantic-release" rel="noopener noreferrer"&gt;sematic-release&lt;/a&gt; o &lt;a href="https://github.com/googleapis/release-please" rel="noopener noreferrer"&gt;release-please&lt;/a&gt;. Estas herramientas nos ofrecerán un número de versión que podremos usar en nuestro proyecto más adelante y 100% basado en el historial de commits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1: Crear nuestro token para publicar
&lt;/h2&gt;

&lt;p&gt;El primer paso antes de publicar nuestro paquete será el obtener un token para publicar paquetes en npm y para esto podemos optar por 2 caminos:&lt;/p&gt;

&lt;h3&gt;
  
  
  Opción 1: Crear token desde la WEB
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Prefiera este método dentro de lo posible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos a ir al sitio &lt;a href="https://www.npmjs.com/settings/jondotsoy/tokens" rel="noopener noreferrer"&gt;https://www.npmjs.com/settings/jondotsoy/tokens&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Opción 2: Crear token desde la terminal
&lt;/h3&gt;

&lt;p&gt;Ejecuta el comando npm &lt;code&gt;npm token create&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 2: Preparación del código para publicación
&lt;/h2&gt;

&lt;p&gt;Bien, ya tenemos el token y ahora debemos pensar en el código que vamos a publicar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Aquí te dejo unos consejos de seguridad:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si requieres configuraciones puedes hacer que tu código lo lea desde las variables de ambientes (&lt;code&gt;process.env&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;No permitas cargar código desde tu librería sin un origen claro.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Debemos pensar bien en quién será el usuario librería o en otras palabras dónde será ejecutado el código, este puede ser un navegador, un entorno con NodeJS, BunJS o Deno. Si no tenemos claro el entorno podemos siempre asumir que será un entorno que ejecute soporte JavaScript &lt;a href="https://tc39.es/" rel="noopener noreferrer"&gt;TC39&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lo más importante es tener siempre disponible el código JS antes de ser publicado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 3: Empaquetar el código
&lt;/h2&gt;

&lt;p&gt;Siempre es buena idea probar el código antes de publicar y para esto &lt;em&gt;npm&lt;/em&gt; nos ofrece el comando &lt;code&gt;npm pack&lt;/code&gt; este nos ayudará a crear un paquete comprimido.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdoprow5351psdjcb0yqg.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdoprow5351psdjcb0yqg.png" alt="Ejemplo empaquetar código" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cuando lo ejecutemos veremos por un lado el resultado del empaquetamiento y un archivo con extensión &lt;code&gt;.tgz&lt;/code&gt;, este archivo nos servirá para probarlos más tarde.&lt;/p&gt;

&lt;p&gt;El comando &lt;code&gt;npm pack&lt;/code&gt; tiene un ciclo de vida que podemos aprovechar para compilar o preparar cualquier archivo si se necesita.&lt;/p&gt;

&lt;p&gt;El comando &lt;code&gt;npm pack&lt;/code&gt; ejecuta en orden los siguientes scripts &lt;code&gt;prepack&lt;/code&gt;, &lt;code&gt;prepare&lt;/code&gt; y &lt;code&gt;postpack&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"prepack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Es ejecutado previo al empaquetamiento"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"prepare"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Se ejecuta después de prepack y antes de empaquetar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"postpack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Se ejecuta después de empaquetamiento (puede ser útil para limpiar archivos)"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Puntos de entrada (Propiedad &lt;code&gt;main&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Cuando importemos nuestro modulo ya sea con &lt;code&gt;require&lt;/code&gt; o &lt;code&gt;import&lt;/code&gt; el modulo necesita un script principal, esto lo definimos con la propiedad &lt;code&gt;main&lt;/code&gt; del &lt;code&gt;package.json&lt;/code&gt;.  Con esta propiedad vamos a declarar que archivo debe cargar cuando el modulo sea importando.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sample-pack&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// cargará el archivo `node_modules/sample-pack/index.js`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puedes revisar más a detalle esta propiedad en la documentación de npm &lt;a href="https://docs.npmjs.com/cli/v10/configuring-npm/package-json#main" rel="noopener noreferrer"&gt;https://docs.npmjs.com/cli/v10/configuring-npm/package-json#main&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Múltiples puntos de entrada (Propiedad &lt;code&gt;exports&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Adicionalmente a la script principal podemos definir sub rutas a nuestro modulo con la propiedad &lt;code&gt;exports&lt;/code&gt; del &lt;code&gt;package.json&lt;/code&gt;. La idea de exportar varios scripts es útil si queremos exportar varias utilidades y a su vez disminuir el tamaño del proyecto del cliente final.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"exports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"./feature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./lib/feature.js"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puedes revisar más a detalle esta propiedad en la documentación de npm &lt;a href="https://docs.npmjs.com/cli/v10/configuring-npm/package-json#exports" rel="noopener noreferrer"&gt;https://docs.npmjs.com/cli/v10/configuring-npm/package-json#exports&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 4 (Opcional): Probar código
&lt;/h2&gt;

&lt;p&gt;Yo realmente te recomiendo probar el paquete antes de seguir, es importante sobre todo para validar que los motores como nodejs puedan leer el paquete bien y si tienes definiciones de typescript también funcionen correctamente. Además que no es tan complejo, solo requerimos de un proyecto limpio o con el entorno que necesitamos.&lt;/p&gt;

&lt;p&gt;El siguiente script crea una carpeta con un proyecto en bun limpio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$TMPDIR&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-project
&lt;span class="nb"&gt;cd &lt;/span&gt;my-project

bun init &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="c"&gt;# Si prefieres npm puedes usar `npm init -y`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal59ewqqydonjt0e5vju.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal59ewqqydonjt0e5vju.png" alt="salida en consola ejecutando el comando  raw `ls --color` endraw " width="800" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora necesitamos identificar el archivo tgz del paso 3 e instalar con el comando &lt;code&gt;bun add .../sample-pack-1.0.0.tgz&lt;/code&gt; (En mi caso uso bun para la prueba pero se puede usar el mismo comando con npm &lt;code&gt;npm add .../sample-pack-1.0.0.tgz&lt;/code&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvp9uy4vpyw63xzz9jnwa.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvp9uy4vpyw63xzz9jnwa.png" alt="instalando paquete hello-world-0.1.0.tgz" width="800" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora solo nos hace falta ejecutar nuestras pruebas. Este tipo de pruebas las podemos llamar de integración y tras ejecutar el script &lt;code&gt;index.ts&lt;/code&gt; podemos ver en la salida el mensaje &lt;code&gt;hello world&lt;/code&gt; que es ejecutado en el módulo y ver el mensaje &lt;code&gt;the variable is: ok&lt;/code&gt; que ejecutamos en el script que importa el módulo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb31e8ougbdodyxskkt12.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb31e8ougbdodyxskkt12.png" alt="run script index.ts" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 5: Automatizar publicación
&lt;/h2&gt;

&lt;p&gt;Ahora que tenemos lista nuestra librería ya podemos publicar en npm, pero para esto lo automatizaremos y para esto vamos a escribir un workflow que nos permita hacer 2 tareas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;automatiza el versionamiento de la librería. Recordemos que no podemos publicar una librería en npm sin tener una declarada y debe ser superior a la publicada anteriormente&lt;/li&gt;
&lt;li&gt;automatizar la publicación de la librería a npm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El script a continuación es una plantilla que podemos editar a nuestro gusto y esta plantilla tiene dos tareas para crear la versión y publicar los cambios en npm cuando estos estén listos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy Release&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;

&lt;span class="c1"&gt;# Required by release-please to make a PR&lt;/span&gt;
&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
  &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;release-please&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;outputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;release_created&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.release-please.outputs.release_created }}&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;release&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;release-please&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;googleapis/release-please-action@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;

  &lt;span class="c1"&gt;# publish on npm&lt;/span&gt;
  &lt;span class="na"&gt;delivery-npm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;needs.release-please.outputs.release_created&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;release-please&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;oven-sh/setup-bun@v2&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;registry-url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://registry.npmjs.org"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bun install&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm publish&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;NODE_AUTH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.NPM_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expliquemos más a detalles cada paso de la plantilla:&lt;/p&gt;

&lt;h3&gt;
  
  
  Secretos
&lt;/h3&gt;

&lt;p&gt;Como puedes ver en este archivo se usa el secreto &lt;code&gt;NPM_TOKEN&lt;/code&gt;, debemos configurar aquí el token que obtuvimos en el paso 1 podemos crear este secreto ya sea desde la consola de github o con el comando &lt;code&gt;gh secret set NPM_TOKEN&lt;/code&gt;, usemos el que nos sea más simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  Job &lt;code&gt;release-please&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;La tarea &lt;code&gt;release-please&lt;/code&gt; usa la herramienta &lt;a href="https://github.com/googleapis/release-please" rel="noopener noreferrer"&gt;release-please&lt;/a&gt; para observar constantemente la rama main y según los commits proponer una nueva versión en un PR.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88oiq2eq1sw97599ztgi.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88oiq2eq1sw97599ztgi.png" alt="captura de pantalla de PR creado con release-please" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Durante esta etapa además podemos automatizar algunos procesos como generar algún otro archivo con la versión del package.json. por si nuestro proyecto lo requiere.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ Si presentan algún problema en esta etapa sería bueno configurar tu proyecto de manera local con el comando &lt;code&gt;release-please bootstrap&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En la plantilla también podemos ver la variable de salida &lt;code&gt;release_created&lt;/code&gt; es importante en la siguiente etapa, ya que con ella podemos decidir si publicar o no nuestra variable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Job &lt;code&gt;delivery-npm&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Este job tiene como objetivo el publicar el código de nuestra librería a npm pero antes valida si la variable &lt;code&gt;needs.release-please.outputs.release_created&lt;/code&gt; es true. Esto es porque esperamos a que termine de actualizar la versión en el paso anterior de otro modo tendríamos un error constantemente por parte de npm.&lt;/p&gt;

&lt;p&gt;Un error común en este paso, es tener un token obsoleto; Podemos resolverlo si repetimos el Paso 1 y actualizar en github el secreto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;En definitiva, publicar tus librerías JavaScript en npm no tiene por qué ser una tarea tediosa. Siguiendo este flujo de trabajo, desde la generación de un token hasta la automatización del versionado y la publicación, podrás compartir tu código con la comunidad de manera eficiente y segura. Recuerda que cada paso, desde la preparación del código hasta las pruebas, es crucial para garantizar la calidad y la seguridad de tu librería. ¡Anímate a contribuir al ecosistema npm y a facilitar la vida de otros desarrolladores con tus creaciones!&lt;/p&gt;

</description>
      <category>npm</category>
      <category>github</category>
    </item>
    <item>
      <title>Como conectarse a Google Cloud Shell desde Visual Studio Code</title>
      <dc:creator>Jonathan Delgado</dc:creator>
      <pubDate>Wed, 02 Oct 2024 16:32:30 +0000</pubDate>
      <link>https://dev.to/jondotsoy/como-conectarse-a-google-cloud-shell-desde-visual-studio-code-57kh</link>
      <guid>https://dev.to/jondotsoy/como-conectarse-a-google-cloud-shell-desde-visual-studio-code-57kh</guid>
      <description>&lt;p&gt;GCP es la cloud de Google y con esta tenemos una herramienta muy poderosa la cual es la &lt;strong&gt;cloud-shell&lt;/strong&gt; esta herramienta es una maquina virtual que podemos acceder directamente desde la consola de GCP.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vcv5wstmrwy000wtfzk.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vcv5wstmrwy000wtfzk.png" alt="Ejemplo haciendo click para abrir la cloud-shell" width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sin embargo, dependiendo de la conexión o configuración, puedes experimentar problemas al usar esta herramienta desde la web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlo3588nrdl1snq2igll.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlo3588nrdl1snq2igll.png" alt="Error comunicación cloud-shell" width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si normalmente te pasa este problema una vez no hay problema solo ejecuta nuevamente la consola web y ya esta, pero si se repite podemos conectarnos por SSH usando visual estudio code. La siguiente guía te explico en pocos pasos como hacerlo rápidamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Obtener configuraciones SSH
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Para este paso debes estar logeado desde tu consola. Leer el siguiente guía (gcloud auth login)[&lt;a href="https://cloud.google.com/sdk/gcloud/reference/auth/login" rel="noopener noreferrer"&gt;https://cloud.google.com/sdk/gcloud/reference/auth/login&lt;/a&gt;]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En tu terminal ejecuta el siguiente comando &lt;code&gt;gcloud cloud-shell ssh --dry-run&lt;/code&gt; este comando nos entregara toda la linea de comando SSH para conectarnos desde la terminal, estas configuraciones los usaremos para conectarnos desde nuestro editor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fllbcun6gjn7exsom3h4e.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fllbcun6gjn7exsom3h4e.png" alt="Captura salida de consola ejecutando el commando gcloud cloud-shell ssh --dry-run" width="800" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;de esta linea de comando para conectarse a SSH vamos a tener que recuperar el &lt;em&gt;Host&lt;/em&gt;, &lt;em&gt;Usuario&lt;/em&gt;, &lt;em&gt;archivo de identificación&lt;/em&gt; y el &lt;em&gt;Puerto&lt;/em&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcmamal5q8ye91m5dox25.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcmamal5q8ye91m5dox25.png" alt="Captura salida de consola ejecutando el commando gcloud cloud-shell ssh --dry-run valores resaltado" width="800" height="71"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De la salida mostrada podemos recuperar los siguientes valores&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Host: &lt;code&gt;34.139.169.146&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Usuario: &lt;code&gt;student_00_68e0901ed4d8&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Archivo de identificación: &lt;code&gt;/Users/jon             /.ssh/google_compute_engine&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Puerto: &lt;code&gt;6000&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Configurar perfil SSH
&lt;/h2&gt;

&lt;p&gt;Ya con los valores recuperados, vamos a configurar nuestro archivo &lt;code&gt;~/ssh/config&lt;/code&gt; este archivo se encarga de configurar todos nuestras configuraciones para conectarnos a nuestra terminal cloud-shell por SSH.&lt;/p&gt;

&lt;p&gt;Este archivo debe verse algo similar a:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2eg0q4r61f7sa2vr05c9.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2eg0q4r61f7sa2vr05c9.png" alt="Ejemplo text en ssh config" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Conectarnos desde Visual Studio Code
&lt;/h2&gt;

&lt;p&gt;Por último, abre la terminal de comandos en Visual Studio Code y escribe &lt;code&gt;connect to host&lt;/code&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy87q5ycejsjuzl7jwts4.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy87q5ycejsjuzl7jwts4.png" alt="Visual studio code con opción connect to Host" width="657" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Si esta opción no aparece puedes intentar instalar la extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh" rel="noopener noreferrer"&gt;Remote - SSH&lt;/a&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4p19wkbjmrh09gptu0e.png" alt="alt text" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Luego seleccionar el host de nuestra cloud-shell.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczutnaydvfh6wctud6x1.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczutnaydvfh6wctud6x1.png" alt="Extension Remote - SSH on gallery" width="639" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y Listo 🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feii8p84pk8pqru0paj01.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feii8p84pk8pqru0paj01.png" alt="Visual Studio Code select host 34.139.168.146" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ya estaríamos conectados a la cloud-shell sin problemas&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Si necesitamos conectarnos a cloud-shell desde la consola web, adelante es muy potente y una muy buena opción para trabajar con los recursos de GCP rápidamente, sin embargo ya sea por comodidad por por latencia en la consola, podemos acceder a ella mediante la terminal SSH. Esta opción es ideal si estas quieres mantener un entorno agradable, mover archivos rápidamente entre tu equipo y Cloud Shell o simplemente quieres conectarte a resolver algún lab sin guardar muchos archivos en tu equipo local.&lt;/p&gt;

</description>
      <category>googlecloudshell</category>
      <category>visualstudiocode</category>
      <category>ssh</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Como conectarse a Google Cloud Shell desde Visual Studio Code</title>
      <dc:creator>Jonathan Delgado</dc:creator>
      <pubDate>Wed, 02 Oct 2024 16:31:31 +0000</pubDate>
      <link>https://dev.to/jondotsoy/como-conectarse-a-google-cloud-shell-desde-visual-studio-code-2l11</link>
      <guid>https://dev.to/jondotsoy/como-conectarse-a-google-cloud-shell-desde-visual-studio-code-2l11</guid>
      <description>&lt;p&gt;GCP es la cloud de Google y con esta tenemos una herramienta muy poderosa la cual es la &lt;strong&gt;cloud-shell&lt;/strong&gt; esta herramienta es una maquina virtual que podemos acceder directamente desde la consola de GCP.&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%2F7vcv5wstmrwy000wtfzk.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%2F7vcv5wstmrwy000wtfzk.png" alt="Ejemplo haciendo click para abrir la cloud-shell" width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sin embargo, dependiendo de la conexión o configuración, puedes experimentar problemas al usar esta herramienta desde la web.&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%2Frlo3588nrdl1snq2igll.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%2Frlo3588nrdl1snq2igll.png" alt="Error comunicación cloud-shell" width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si normalmente te pasa este problema una vez no hay problema solo ejecuta nuevamente la consola web y ya esta, pero si se repite podemos conectarnos por SSH usando visual estudio code. La siguiente guía te explico en pocos pasos como hacerlo rápidamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Obtener configuraciones SSH
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Para este paso debes estar logeado desde tu consola. Leer el siguiente guía (gcloud auth login)[&lt;a href="https://cloud.google.com/sdk/gcloud/reference/auth/login" rel="noopener noreferrer"&gt;https://cloud.google.com/sdk/gcloud/reference/auth/login&lt;/a&gt;]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En tu terminal ejecuta el siguiente comando &lt;code&gt;gcloud cloud-shell ssh --dry-run&lt;/code&gt; este comando nos entregara toda la linea de comando SSH para conectarnos desde la terminal, estas configuraciones los usaremos para conectarnos desde nuestro editor.&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%2Fllbcun6gjn7exsom3h4e.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%2Fllbcun6gjn7exsom3h4e.png" alt="Captura salida de consola ejecutando el commando gcloud cloud-shell ssh --dry-run" width="800" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;de esta linea de comando para conectarse a SSH vamos a tener que recuperar el &lt;em&gt;Host&lt;/em&gt;, &lt;em&gt;Usuario&lt;/em&gt;, &lt;em&gt;archivo de identificación&lt;/em&gt; y el &lt;em&gt;Puerto&lt;/em&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%2Fcmamal5q8ye91m5dox25.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%2Fcmamal5q8ye91m5dox25.png" alt="Captura salida de consola ejecutando el commando gcloud cloud-shell ssh --dry-run valores resaltado" width="800" height="71"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De la salida mostrada podemos recuperar los siguientes valores&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Host: &lt;code&gt;34.139.169.146&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Usuario: &lt;code&gt;student_00_68e0901ed4d8&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Archivo de identificación: &lt;code&gt;/Users/jon             /.ssh/google_compute_engine&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Puerto: &lt;code&gt;6000&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Configurar perfil SSH
&lt;/h2&gt;

&lt;p&gt;Ya con los valores recuperados, vamos a configurar nuestro archivo &lt;code&gt;~/ssh/config&lt;/code&gt; este archivo se encarga de configurar todos nuestras configuraciones para conectarnos a nuestra terminal cloud-shell por SSH.&lt;/p&gt;

&lt;p&gt;Este archivo debe verse algo similar 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%2F2eg0q4r61f7sa2vr05c9.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%2F2eg0q4r61f7sa2vr05c9.png" alt="Ejemplo text en ssh config" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Conectarnos desde Visual Studio Code
&lt;/h2&gt;

&lt;p&gt;Por último, abre la terminal de comandos en Visual Studio Code y escribe &lt;code&gt;connect to host&lt;/code&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%2Fy87q5ycejsjuzl7jwts4.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%2Fy87q5ycejsjuzl7jwts4.png" alt="Visual studio code con opción connect to Host" width="657" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Si esta opción no aparece puedes intentar instalar la extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh" rel="noopener noreferrer"&gt;Remote - SSH&lt;/a&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh" rel="noopener noreferrer"&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%2Fb4p19wkbjmrh09gptu0e.png" alt="alt text" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Luego seleccionar el host de nuestra cloud-shell.&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%2Fczutnaydvfh6wctud6x1.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%2Fczutnaydvfh6wctud6x1.png" alt="Extension Remote - SSH on gallery" width="639" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y Listo 🚀&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%2Feii8p84pk8pqru0paj01.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%2Feii8p84pk8pqru0paj01.png" alt="Visual Studio Code select host 34.139.168.146" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ya estaríamos conectados a la cloud-shell sin problemas&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Si necesitamos conectarnos a cloud-shell desde la consola web, adelante es muy potente y una muy buena opción para trabajar con los recursos de GCP rápidamente, sin embargo ya sea por comodidad por por latencia en la consola, podemos acceder a ella mediante la terminal SSH. Esta opción es ideal si estas quieres mantener un entorno agradable, mover archivos rápidamente entre tu equipo y Cloud Shell o simplemente quieres conectarte a resolver algún lab sin guardar muchos archivos en tu equipo local.&lt;/p&gt;

</description>
      <category>googlecloudshell</category>
      <category>visualstudiocode</category>
      <category>ssh</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Leer archivos ICS en Javascript con iCalendar.js</title>
      <dc:creator>Jonathan Delgado</dc:creator>
      <pubDate>Tue, 28 Mar 2023 17:36:34 +0000</pubDate>
      <link>https://dev.to/jondotsoy/leer-archivos-ics-en-javascript-con-icalendarjs-4fg0</link>
      <guid>https://dev.to/jondotsoy/leer-archivos-ics-en-javascript-con-icalendarjs-4fg0</guid>
      <description>&lt;p&gt;Si eres un desarrollador web, probablemente hayas trabajado con archivos ICS antes. Los archivos ICS son un formato estándar para intercambiar información de calendario entre diferentes aplicaciones. Puede ser bastante difícil trabajar con archivos ICS directamente, pero no te preocupes, ¡iCalendar.js está aquí para ayudarte!&lt;/p&gt;

&lt;p&gt;iCalendar.js es una biblioteca de Javascript que facilita la lectura y escritura de archivos ICS. Con iCalendar.js, puedes analizar y manipular archivos ICS en tu proyecto de Javascript con facilidad. Y lo mejor de todo es que se puede descargar desde &lt;a href="https://npm.im/icalendar.js"&gt;npm.im/icalendar.js&lt;/a&gt; con un simple comando &lt;code&gt;npm add icalendar.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Aquí hay un ejemplo de cómo usar iCalendar.js para leer un archivo ICS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ICalendar&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;icalendar.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sample.ics&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;icalendar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ICalendar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, estamos importando la clase &lt;code&gt;ICalendar&lt;/code&gt; de iCalendar.js. Luego, estamos leyendo un archivo ICS con el nombre "sample.ics" y almacenando su contenido en la variable payload. Finalmente, usamos el método &lt;code&gt;from&lt;/code&gt; de &lt;code&gt;ICalendar&lt;/code&gt; para analizar el contenido del archivo y crear un objeto &lt;code&gt;ICalendar&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;¡Y eso es todo! Ahora, puedes manipular los datos del calendario en el objeto &lt;code&gt;ICalendar&lt;/code&gt; como lo desees.&lt;/p&gt;

&lt;p&gt;En resumen, iCalendar.js es una herramienta invaluable para trabajar con archivos ICS en Javascript. Si estás trabajando en un proyecto que involucra archivos de calendario, no dudes en darle una oportunidad a iCalendar.js. Descárgalo hoy mismo y comienza a trabajar con archivos ICS de manera más fácil y eficiente.&lt;/p&gt;

</description>
      <category>icalendar</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
