Un conjunto de pruebas que estaba ejecutando con jest, me estaban funcionando en local pero no en Github Actions. El error que me estaba arrojando era:
Error: Uncaught [TypeError: A dynamic import callback was invoked without --experimental-vm-modules]
Investigando sobre este error, descubrí que se debe a que las pruebas de Jest están intentando utilizar módulos ES6 con importaciones dinámicas, y Node.js no está configurado para soportar esta funcionalidad sin habilitar explícitamente el uso de los módulos de máquina virtual experimentales (experimental-vm-modules).
¿Cómo solucionar este problema?
La solución consiste en ejecutar jest pero usando node y pasando ese argumento. Entonces en mi package.json, donde tenía una tarea para ejecutar las pruebas, en vez tener algo como:
test: "jest"
Lo cambié a ejecutar node con el argumento –experimental-vm-modules:
Este post es largo y documenta un caso de contaminación por diferentes medios de un servidor con sitios WordPress y las medidas reactivas para poder solucionarlo.
Recientemente un cliente me notifica que su sitio web está siendo redireccionado a un sitio de publicidad, literalmente SPAM.
Inmediatamente supe que se trataba de malware, sin embargo no tenía idea de la gravedad del problema.
Diagnóstico
Primero que todo, cabe destacar que nunca instalo plugins ni temas nulled (pirateados) en mis sitios o los de mis clientes y no era solamente el sitio del cliente si no numerosos sitios de un servidor compartido en un VPS de mi empresa, había código javascript (y de otro tipo) presente en numerosos archivos de plugins, temas y el core de wordpress, también en widgets, revisando el servidor me conseguí con cosas interesantes como estas:
Si te ibas a /tmp y ejecutabas el comando «ls -la te podías conseguir con múltiples ficheros creados con este formato:
Pudiendo llegar a ser incluso miles si el servidor tiene tiempo contaminado, todos los nombres de los archivos empiezan por .171 y tienen este contenido:
El cual solo tiene la intención de volver a ejecutar el malware o una puerta trasera con reiniciar o si el malware se ha limpiado, o sea, tratando de auto infectarse de nuevo.
También vas a conseguir algunos binarios dentro del código fuente de tu WordPress, con un contenido similar a este, el cual aunque la mayoría son caracteres de un binario hay una parte en texto que se puede diferenciar claramente que es para crear el archivo /tmp/socks5.sh
Otra cosa de la cual me percaté es que me conseguí con algunos usuarios nuevos creados en algunas de las instalaciones de WordPress, eran los encargados de crear los widgets con javascript malicioso, el javascript malicioso era el siguiente:
De lejos se ve que es para hacer que el browser se ponga a minar alguna criptomoneda.
Y también creaban un usuario administrador en el WordPress que aparecía en la base de datos, pero no listado en el admin de WordPress y todo debido a esté código PHP inyectado a propósito en el functions.php de algunos temas:
La verdad no se muy bien que hace el código anterior, pero se que no es nada bueno.
También vas a ver en tu listado de procesos, muchos procesos ejecutandose más o menos de esta manera:
43006 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/plugins/erp/vendor/parsecsv/php-parsecsv/.github/workflows/gd.thumbnail.inc > /dev/null 2>&1
43007 ? S 0:01 /var/www/site1.com/htdocs/wp-content/plugins/erp/vendor/parsecsv/php-parsecsv/.github/workflows/gd.thumbnail.inc
43008 ? Z 0:00 [gd.thumbnail.in] <defunct>
43040 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/plugins/jetpack/jetpack_vendor/automattic/jetpack-backup/src/js/components/Admin/gd.thumbnail.inc > /dev/null 2>&1
43041 ? Sl 0:03 /var/www/site1.com/htdocs/wp-content/plugins/jetpack/jetpack_vendor/automattic/jetpack-backup/src/js/components/Admin/gd.thumbnail.inc
43042 ? Z 0:00 [gd.thumbnail.in] <defunct>
43055 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/themes/themify-ultra/skins/agency2/gd.thumbnail.inc > /dev/null 2>&1
43056 ? Sl 0:01 /var/www/site1.com/htdocs/wp-content/themes/themify-ultra/skins/agency2/gd.thumbnail.inc
43057 ? Z 0:00 [gd.thumbnail.in] <defunct>
43094 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/plugins/jetpack/jetpack_vendor/automattic/jetpack-sync/src/gd.thumbnail.inc > /dev/null 2>&1
43095 ? Sl 0:00 /var/www/site1.com/htdocs/wp-content/plugins/jetpack/jetpack_vendor/automattic/jetpack-sync/src/gd.thumbnail.inc
43096 ? Z 0:00 [gd.thumbnail.in] <defunct>
43126 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/themes/themify-ultra/skins/gd.thumbnail.inc > /dev/null 2>&1
43127 ? S 0:02 /var/www/site1.com/htdocs/wp-content/themes/themify-ultra/skins/gd.thumbnail.inc
43128 ? Z 0:00 [gd.thumbnail.in] <defunct>
43148 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/plugins/jetpack/jetpack_vendor/automattic/jetpack-boost-core/gd.thumbnail.inc > /dev/null 2>&1
43149 ? S 0:00 /var/www/site1.com/htdocs/wp-content/plugins/jetpack/jetpack_vendor/automattic/jetpack-boost-core/gd.thumbnail.inc
43150 ? Z 0:00 [gd.thumbnail.in] <defunct>
43165 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/uploads/themify/cache/themify-ultra/1086/image/gd.thumbnail.inc > /dev/null 2>&1
43166 ? S 0:01 /var/www/site1.com/htdocs/wp-content/uploads/themify/cache/themify-ultra/1086/image/gd.thumbnail.inc
43167 ? Z 0:00 [gd.thumbnail.in] <defunct>
43187 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/plugins/cbxgooglemap/languages/gd.thumbnail.inc > /dev/null 2>&1
43188 ? S 0:00 /var/www/site1.com/htdocs/wp-content/plugins/cbxgooglemap/languages/gd.thumbnail.inc
43189 ? Z 0:00 [gd.thumbnail.in] <defunct>
43220 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/themes/themify-ultra/themify/js/modules/swiper/modules/gd.thumbnail.inc > /dev/null 2>&1
43221 ? Sl 0:01 /var/www/site1.com/htdocs/wp-content/themes/themify-ultra/themify/js/modules/swiper/modules/gd.thumbnail.inc
43222 ? Z 0:00 [gd.thumbnail.in] <defunct>
43243 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/plugins/jetpack/jetpack_vendor/automattic/jetpack-assets/src/gd.thumbnail.inc > /dev/null 2>&1
43244 ? S 0:00 /var/www/site1.com/htdocs/wp-content/plugins/jetpack/jetpack_vendor/automattic/jetpack-assets/src/gd.thumbnail.inc
43245 ? Z 0:00 [gd.thumbnail.in] <defunct>
43262 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/uploads/themify/cache/themify-ultra/styles/1005/gd.thumbnail.inc > /dev/null 2>&1
43263 ? S 0:00 /var/www/site1.com/htdocs/wp-content/uploads/themify/cache/themify-ultra/styles/1005/gd.thumbnail.inc
43264 ? Z 0:00 [gd.thumbnail.in] <defunct>
43289 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/plugins/mainwp-child/libs/phpseclib/vendor/phpseclib/phpseclib/phpseclib/Math/PrimeField/gd.thumbnail.inc > /dev/null 2>&1
43290 ? S 0:00 /var/www/site1.com/htdocs/wp-content/plugins/mainwp-child/libs/phpseclib/vendor/phpseclib/phpseclib/phpseclib/Math/PrimeField/gd.thumbnail.inc
43291 ? Z 0:00 [gd.thumbnail.in] <defunct>
43309 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-includes/blocks/pattern/gd.thumbnail.inc > /dev/null 2>&1
43310 ? S 0:01 /var/www/site1.com/htdocs/wp-includes/blocks/pattern/gd.thumbnail.inc
43311 ? Z 0:00 [gd.thumbnail.in] <defunct>
43330 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/plugins/mailpoet/vendor-prefixed/doctrine/dbal/gd.thumbnail.inc > /dev/null 2>&1
43331 ? S 0:00 /var/www/site1.com/htdocs/wp-content/plugins/mailpoet/vendor-prefixed/doctrine/dbal/gd.thumbnail.inc
43332 ? Z 0:00 [gd.thumbnail.in] <defunct>
44699 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/plugins/jetpack/_inc/blocks/recurring-payments/gd.thumbnail.inc > /dev/null 2>&1
44700 ? Sl 0:00 /var/www/site1.com/htdocs/wp-content/plugins/jetpack/_inc/blocks/recurring-payments/gd.thumbnail.inc
44701 ? Z 0:00 [gd.thumbnail.in] <defunct>
44760 ? I 0:00 [kworker/0:2-events]
45681 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/themes/themify-ultra/themify/js/admin/modules/codemirror/gd.thumbnail.inc > /dev/null 2>&1
45682 ? S 0:01 /var/www/site1.com/htdocs/wp-content/themes/themify-ultra/themify/js/admin/modules/codemirror/gd.thumbnail.inc
45683 ? Z 0:00 [gd.thumbnail.in] <defunct>
45883 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/themes/themify-ultra/themify/themify-metabox/gd.thumbnail.inc > /dev/null 2>&1
45884 ? S 0:00 /var/www/site1.com/htdocs/wp-content/themes/themify-ultra/themify/themify-metabox/gd.thumbnail.inc
45885 ? Z 0:00 [gd.thumbnail.in] <defunct>
45987 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/plugins/mailpoet/lib/Mailer/WordPress/gd.thumbnail.inc > /dev/null 2>&1
45988 ? S 0:00 /var/www/site1.com/htdocs/wp-content/plugins/mailpoet/lib/Mailer/WordPress/gd.thumbnail.inc
45989 ? Z 0:00 [gd.thumbnail.in] <defunct>
46070 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-includes/rest-api/gd.thumbnail.inc > /dev/null 2>&1
46071 ? Sl 0:00 /var/www/site1.com/htdocs/wp-includes/rest-api/gd.thumbnail.inc
46072 ? Z 0:00 [gd.thumbnail.in] <defunct>
46076 ? S 0:00 tlsmgr -l -t unix -u -c
46155 ? S 0:00 sh -c /var/www/site1.com/htdocs/wp-content/plugins/erp/vendor/guzzlehttp/guzzle/gd.thumbnail.inc > /dev/null 2>&1
46156 ? S 0:00 /var/www/site1.com/htdocs/wp-content/plugins/erp/vendor/guzzlehttp/guzzle/gd.thumbnail.inc
46157 ? Z 0:00 [gd.thumbnail.in] <defunct>
46228 ? S 0:00 sh -c /var/www/site2.org/htdocs/wp-content/plugins/jetpack/modules/custom-css/csstidy/search.bak > /dev/null 2>&1
46229 ? S 0:00 /var/www/site2.org/htdocs/wp-content/plugins/jetpack/modules/custom-css/csstidy/search.bak
46230 ? Z 0:00 [search.bak] <defunct>
578 ? Ss 0:00 /bin/sh -c echo socks5_backconnect666 > /dev/null | (cd /var/www/site3.com/htdocs/wp-content/plugins/webtoffee-gdpr-cookie-consent/public/modules/script-blocker/integrations && /var/www/site3
585 ? R 4:24 /var/www/site3.com/htdocs/wp-content/plugins/cf7-google-sheets-connector/lib/vendor/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/berkeleydb.lib
Solución
Como consejo, no olvides hacer un respaldo de cada sitio aún así estén contaminados antes de hacer cualquier cambio.
Luego de limpiar todos y cada uno de los sitios usando como apoyo el plugin Wordfence, que por cierto no hacía nada para evitar la contaminación, pero si para identificar los archivos contaminados, evitar en este caso el autoeliminado o eliminar todos los archivos sin revisarlos uno a uno, ya que podrías estar eliminando un archivo importante y dejar inútil algún sitio.
Se revisaron manualmente todos y cada uno de los widgets para eliminar código maliciosos, también los functions.php de todos los temas y se eliminó manualmente de la base de datos el usuario administrador webejikow.
El servidor y todos sus sitios corrían limpios un tiempo, tal vez algunas horas para luego contaminarse de nuevo, los archivos .171* no dejaban de aparecer en /tmp, para el archivo /tmp/socks5.sh cree manualmente uno vacío y le di atributos de inmutable para que no pudiera ser eliminado o sobreescrito:
touch /tmp/socks5.sh
chattr +i /tmp/socks5.sh
Si tienes tienes /tmp en una partición, puedes quitarle los atributos de ejecución cuando se monte y así evitas que se puedan ejecutar ficheros en ese directorio, en mi caso no podía hacerlo, así que me tocó algo más artesanal.
Sin embargo luego de lidiar con el malware semanas, la verdadera solución vino de ver los logs de los sitios contaminados, con frecuencia veía muchas peticiones post a ficheros PHP cualquiera dentro de todos los sitios, por lo general ningún plugin o tema necesita hacer post a otros ficheros dentro de la instalación y menos usuarios externos, los plugins y temas usan la API de WordPress o la interfase ajax de WordPress.
Entonces procedí a crear reglas a nivel de servidor web Nginx y de cloudflare para evitar peticiones POST a todo lo que esté dentro de /wp-content/, de esta manera:
Y a nivel de cloudflare con una regla como la siguiente en el WAF:
Luego solo toca volver a limpiar todos y cada uno de los sitios para garantizar que no queda ningún archivo extraño, reiniciar (si se puede) y monitorizar el servidor un tiempo para garantizar de que el malware no vuelva, en mi caso no apareció nuevamente.
Aproveché para ajustar las reglas de wordfence para bloquear login de usuarios inexistentes de inmediato y con 3 intentos para usuarios conocidos, este bloqueo se hace por 1 mes.
¡Descubre cómo Studio de WordPress revoluciona el desarrollo web! Descarga gratis y crea tus proyectos con facilidad. El futuro es ahora. ¡Haz clic para más información!
Descubre las innovaciones más recientes de Google en inteligencia artificial, Android y seguridad en el emocionante Google I/O 2024.
Descubre cómo los WeakMaps en PHP pueden optimizar el uso de memoria, mejorando el rendimiento y escalabilidad de tus aplicaciones.
Desde que salió el primer avance de FPS: First Person Shooter quedé encantado porque pareciera ser un documental de mi niñez. Durante esa etapa de mi vida mi mayor afición era jugar videos de primera persona y creo que llegué a jugar lo mas populares, por ello en el trailer del documental, al ver que había jugado casi todos y ver a mis primeros héroes (los programadores y creadores de esos juegos) sabía que debía verlo apenas fuese lanzado.
Contenido de FPS: First Person Shooter
El documental es una obra completa y meticulosamente elaborada, con una duración de aproximadamente 4 horas de alta calidad, sin ningún relleno innecesario. Se centra principalmente en los mejores y más populares juegos de primera persona, especialmente antes del año 2005. Aunque los juegos más recientes son brevemente reseñados, esto se debe a que el documental se enfoca en aquellos que causaron un gran impacto y llevaron el género a nuevos niveles de desarrollo.
Lo notable del documental es la presencia de los creadores de estos juegos, así como de algunas celebridades del medio, como el Angry Videogame Nerd o Jon St. John, la voz de Duke Nukem. Cada uno de ellos comparte sus experiencias sobre cómo surgieron las ideas para desarrollar el juego, el proceso creativo, anécdotas interesantes, obstáculos que enfrentaron, ideas que no lograron implementar y mucho más.
En cuanto a la lista de juegos, sin revelar demasiado, puedo decir como fanático del género que está cuidadosamente seleccionada, abarcando tanto títulos para PC como para consolas. Los juegos se presentan de manera cronológica y no solo escuchamos las experiencias de los creadores, sino que también se incluyen entrevistas con personas que eran rivales o competencia de esos juegos, ofreciendo sus opiniones sobre lo mejor de cada título y cómo influyeron en la evolución de sus propios juegos.
Luego de verlo, te provocará jugarlos de nuevo y revivir los grandes momentos que viviste al jugarlos.
Dónde puedo adquirirlo o ver un avance
Actualmente para comprarlo, puedes hacerlo desde la página oficial de FPS: First Person Shooter. El precio me parece bien porque son 4 horas de contenido de alta calidad que puedes consumir en varios días, la calidad del video es bien, pero creo que no hay disponibilidad de audio o sub-títulos en español.
Para ver un avance, lo puedes hacer a continuación y comprobar que la opinión que te compartí mas arriba tiene razón.
Este documental es obligatorio de ver si fuiste fanático de los juegos de primera persona durante los 90s o inicios de los 2000s. Cubre casi todo juego famoso que salió en esa época y podrás realizar un viaje de nostalgia a esa gran época de video-juegos y aprender sobre su historia e impacto en la industria.
Descubre cómo potenciar tu negocio con Laravel para e-commerce. Conoce las mejores plataformas y estrategias de marketing digital. ¡Haz crecer tu tienda en línea hoy!
Si has estado involucrado en el mundo del hacking o hacktivismo desde hace tiempo. Es muy probable que hayas escuchado sobre Cult of the Dead Cow, uno de los grupos de hacking mas famosos y antiguos que existen. Fueron los primeros en realizar hacktivismo, que consisteo es el uso de técnicas de seguridad informática, piratería ética o el desarrollo de software, para promover causas políticas o sociales.
¿Qué tal es el contenido de Cult of the Dead Cow?
El libro en líneas generales me pareció muy bueno. Cuenta la historia de cDc (como se le conoce de forma corta a Cult of the Dead Cow) desde sus inicios hasta lo mas reciente, mediante la narración de las experiencias de miembros clave de cada periodo. Cada una de estas experiencias de muestra como es el grupo desde adentro y cómo llevaron a cabo muchas de sus proyectos.
En ciertos puntos el libro cuenta historias que parecen ser sacadas de Hollywood o de Mr. Robot. Pero te das cuenta que es real y asi funciona el mundo, como por ejemplo una historia de cómo un miembro ayudó a un espía que estaba en China a poder comunicarse con el gobierno de Estados Unidos, sin que el gran firewall de China lo impidiese. Otras sobre como algunos miembros lograron ser «precursores» de la seguridad informática en empresas, logrando puestos altos en el área de seguridad de compañías como Google, Facebook, Microsoft, entre otras.
¿Por qué cDc salvó al mundo?
A lo largo de este libro, observarás cómo, gracias a experimentos, ataques y actividades, en muchas ocasiones, tanto el gobierno como los gigantes de Internet se vieron obligados a intervenir y mejorar sus tecnologías de seguridad para prevenir cualquier problema. Es por esta razón que son considerados héroes; el hecho de contar hoy en día con sólidos cifrados, seguridad en la red, servidores mejorados y una Internet más privada y segura se debe en gran medida a personas como los miembros de cDc, quienes demostraron las serias consecuencias que pueden surgir de una Internet insegura.
Los medios suelen retratar mal a los hackers pero en realidad son los forjadores de una mejor Internet.
Palabras finales
Es una lectura obligada para todo fanático(a) de la seguridad informática. Aprenderás de casos reales, historia, cómo son los gobiernos, la tecnología y mucho mas. Ojalá alguien se anime a hacer una película con todo esto.
Le llegó el turno a Node.js para ser protagonista de un documental de Honeypot. Esta vez veremos en Node.js: el documental, una mirada íntima a la creación, evolución y triunfos de una de las tecnologías más influyentes en la última década. Desde sus humildes comienzos hasta convertirse en un pilar fundamental en el desarrollo web moderno, el documental nos sumerge en la historia de Node.js, contada por su creador original, Ryan Dahl, y las mentes brillantes que contribuyeron a su crecimiento.
El documental relata cómo Ryan Dahl, inicialmente no estaba seguro sobre el potencial de su proyecto, pero cuando liberó Node.js al público, desató una ola de interés a medida que los desarrolladores descubrían las ventajas de las operaciones de entrada/salida asincrónicas. También Node.js: el documental, explora los desafíos enfrentados en las primeras versiones, donde la implementación de nuevas características a menudo requería sacrificar la retrocompatibilidad. Ocasionando quejas de los primeros usuarios de Node quienes querían una versión estable para sus proyectos.
El relato continúa con la aparición de npm y el arduo trabajo de aquellos que llevaron Node.js a Windows, superando obstáculos para manejar operaciones de archivos de manera asincrónica y desarrollando bibliotecas para facilitar el proceso.
El drama en Node.js: el documental
El documental toma un giro intrigante al abordar la controversia en torno al control de Node.js por parte de Joyent y la posterior creación de io.js. Mientras los desarrolladores buscaban innovar y actualizar el motor de node, la empresa priorizaba la estabilidad para sus principales clientes. Sin embargo, a través de entrevistas francas, obtenemos una visión completa de ambos lados. De hecho, me gustó como incluyeron el CEO de Joyent de esa época, para revelar los motivos para tener control de Node.
Esta sección culmina mostrando como fue la fusión de los proyectos y la formación de la Node Foundation, un hito crucial que garantizó una gestión colaborativa y transparente del desarrollo de Node.js. También luego muestra como Node.js ahora es parte integral de la Open JS Foundation y cuenta con un desarrollo abierto.
En resumen, «Node.js: El Documental» no solo ofrece una mirada fascinante a la historia de Node.js, sino que también presenta un drama empresarial cautivador y un final feliz para una tecnología que ha transformado nuestro mundo digital. Espero que te inspires con en este documental emocionante y descubre cómo una idea revolucionaria cambió para siempre el panorama tecnológico.
Recientemente, mientras exploraba Twitter/X, vi una publicación que destacaba contenido de calidad para perfeccionar las habilidades en Vue.JS. Entre las opciones, llamó mi atención el libro «Design Patterns for Vue.JS». Dado que en ese momento estaba enfocado en mejorar mis habilidades de pruebas de código y aplicar patrones de diseño, decidí darle una oportunidad y contactar al autor para comprar una copia.
Al realizar la compra, me percaté de que para aquellos que residen en países en vías de desarrollo pueden obtener un descuento contactando directamente al autor. Así que me comuniqué con Lachlan Miller, quien generosamente me ofreció un considerable descuento. En el transcurso de nuestra conversación, Miller mencionó que estaba en proceso de reescribir el libro para garantizar la compatibilidad del código con Vue 3. Agradecido por la rebaja, opté por esperar a la nueva edición y así poder disfrutar de una lectura actualizada, cuya opinión compartiré con ustedes.
Contenido de Design Patterns for Vue.js
El enfoque principal de este libro radica en cómo escribir tus componentes y código en Vue.JS de una manera que facilite su prueba. Se centra en la creación de código que permita generar pruebas automatizadas rápidamente y sin complicaciones, haciendo hincapié en la estructuración de soluciones que sean reutilizables y accesibles desde el ámbito de las pruebas.
Es importante destacar que si buscas un libro que enseñe los patrones de diseño más comunes para aplicarlos, este no es el indicado para ti. Aquí, los patrones de diseño presentados están diseñados para facilitar la creación de pruebas automatizadas y, por ende, mejorar la calidad de tu código. Esto resulta especialmente beneficioso si careces de conocimientos sobre cómo realizar pruebas o si no estás familiarizado con la creación de código escalable, sencillo y probado.
Todos los ejemplos se han sido actualizados a Vue 3 con Composition API, lo que los hace muy accesibles y comprensibles para captar las ideas sobre qué patrones aplicar. El contenido abarca desde las partes básicas de un componente hasta la creación de componentes complejos, así como la interacción con APIs, entre otros temas. En resumen, es un libro sumamente completo, por lo que también lo recomiendo para aquellos que deseen aprender más sobre Vue.
Recomendaciones
Este libro es interesante si deseas mejorar la forma en que escribes código que será probado con pruebas automatizadas. En mi opinión, Design Patterns for Vue.js es un buen libro para aprender a usar Vue.JS si vienes de otro framework, pues explica con detalle todo lo necesario para escribir aplicaciones con esta librería.
También es un buen repaso de lo que puedes hacer con Vue.JS y reforzar como escribir código que sea fácil de probar. Yo recomiendo este libro a cualquier desarrollador web que desee mejorar sus habilidades con Vue.JS (sobre todo, aquellos que están iniciándose)