From 5b8a14acd29eb157ba9a62602f94aa50046f9b4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Go=CC=81mez=20Bachiller?= Date: Sun, 17 Mar 2024 13:32:55 +0100 Subject: [PATCH] feat: improve boilerplate, tests and storybook --- docs/images/storybook-configured.png | Bin 68417 -> 61960 bytes docs/install.md | 75 ++++++++++++++++++---- docs/new-project.md | 4 +- docs/nextui.md | 90 ++++++++++++++++----------- docs/storybook.md | 89 +++++++++++++------------- 5 files changed, 163 insertions(+), 95 deletions(-) diff --git a/docs/images/storybook-configured.png b/docs/images/storybook-configured.png index 25c859b582cb1fecb0f6caa0e8c6f50b0168dd0d..962b6212adacd280c924facc88ffa3127abbf002 100644 GIT binary patch literal 61960 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 aPba#o2REMK)lUWdyK__NM%HzMXa5h-7+s72 literal 68417 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 Btgiq7 diff --git a/docs/install.md b/docs/install.md index 41a359c..120088f 100644 --- a/docs/install.md +++ b/docs/install.md @@ -128,10 +128,11 @@ npm run lint -- --fix { "editor.codeActionsOnSave": { "source.fixAll": "always", - "source.organizeImports": "always" + "source.organizeImports": "explicit" }, "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true + "editor.formatOnSave": true, + "css.lint.unknownAtRules": "ignore" } ``` @@ -151,7 +152,9 @@ npm run lint -- --fix "recommendations": [ "esbenp.prettier-vscode", "vitest.explorer", - "bradlc.vscode-tailwindcss" + "bradlc.vscode-tailwindcss", + "dbaeumer.vscode-eslint", + "usernamehw.errorlens" ] } ``` @@ -268,26 +271,49 @@ npm install --save-dev vitest @testing-library/react @vitejs/plugin-react jsdom Y creamos el archivo de configuración: -```js title="vitest.config.mjs" +```ts title="vitest.config.mts" +/* eslint-disable unicorn/prefer-module */ +import path from 'node:path' + +import react from '@vitejs/plugin-react' import { defineConfig } from 'vitest/config' export default defineConfig({ + // Add react plugin + plugins: [react()], + + // Configure nextjs default paths + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + // Specify the test environment test: { // Use jsdom environment environment: 'jsdom', - // Setup files to be run before each test - // setupFiles: ['./vitest.setup.js'], - + // Import assertion library or any global setup globals: true, - // Add react plugin - plugins: [react()], + // Setup files to be run before each test + setupFiles: ['./vitest.setup.mts'], + }, +}) +``` + +A continuación creamos el siguiente fichero: - // Enable if you're using React 18's server components or need top-level await support - // ssr: true, - } +```ts title="vitest.setup.mts" +import * as matchers from '@testing-library/jest-dom/matchers' +import { cleanup } from '@testing-library/react' +import { afterEach, expect } from 'vitest' + +expect.extend(matchers) + +afterEach(() => { + cleanup() }) ``` @@ -297,6 +323,31 @@ Y con el siguiente comando podremos añadir un comando test a npm: npm pkg set scripts.test="vitest" ``` +### Crear un test de ejemplo + +Para comprobar que vitest funciona correctamente vamos a crear un pequeño test. Si usas la plantilla en un futuro +este ya no te servirá, así que recuerda actualizarlo. + +```ts title="src/app/page.spec.tsx" +import { render, screen } from '@testing-library/react' +import { expect, test } from 'vitest' + +import Page from './page' + +test('App Router: Works with Server Components', () => { + render() + expect(screen.getByRole('main')).toBeDefined() +}) +``` + +Y a continuación ejecutamos las pruebas para comprobar que se ejecuta sin problemas: + +```bash +npm run test +``` + +Por defecto vitest se ejecuta en modo `watch`. Eso significa que al terminar de pasar los test no termina, sino que se queda observando si los ficheros cambian para volver a ejecutarlos. Resulta muy útil si haces TDD. Para terminar simplemente pulsa ++control+c++ en la consola. + !!! question "Ejercicio" Se deja como ejercicio, guardar los cambios en git con la configuración de Vitest y siguiendo conventional commits para el mensaje. diff --git a/docs/new-project.md b/docs/new-project.md index 821ae67..18d249d 100644 --- a/docs/new-project.md +++ b/docs/new-project.md @@ -1,4 +1,4 @@ -En este capítulo, aprenderemos a crear un nuevo proyecto de React utilizando Next.js y el framework de diseño NextUI. React es una biblioteca de JavaScript ampliamente utilizada para construir interfaces de usuario interactivas, mientras que Next.js es un framework de React que facilita la creación de aplicaciones web avanzadas con rutas y renderización del lado del servidor. NextUI es un marco de diseño que proporciona componentes de interfaz de usuario preestilizados y personalizables, lo que acelera el proceso de diseño y desarrollo. +En este capítulo, aprenderemos a crear un nuevo proyecto de React utilizando Next.js y el framework de diseño NextUI. React es una biblioteca de JavaScript ampliamente utilizada para construir interfaces de usuario interactivas, mientras que Next.js es un framework de React que facilita la creación de aplicaciones web avanzadas con rutas y renderización del lado del servidor. NextUI es una biblioteca de componentes que proporciona componentes de interfaz de usuario preestilizados y personalizables, lo que acelera el proceso de diseño y desarrollo. ## Instalación @@ -6,7 +6,7 @@ Crear un boilerplate desde cero para hacer funcionar múltiples herramientas de ## Dependencias -### Frameworks: NextJS +### Frameworks: Next.js Aunque es posible agregar React a un proyecto existente o crear una aplicación desde cero, la documentación oficial de React aconseja considerar el uso de un framework como Next.js para proyectos web más grandes. Esto se debe a que los frameworks proporcionan una estructura y herramientas adicionales que facilitan el desarrollo, el enrutamiento y la optimización del rendimiento de la aplicación. diff --git a/docs/nextui.md b/docs/nextui.md index 86c44a5..c9942d4 100644 --- a/docs/nextui.md +++ b/docs/nextui.md @@ -9,8 +9,7 @@ claro. npm install @nextui-org/react framer-motion @heroicons/react next-themes ``` -Ahora necesitamos configurar el fichero de estilos de `tailwindcss` para que -soporte los componentes de NextUI. +Ahora necesitamos configurar el fichero de estilos de `tailwindcss` para que soporte los componentes de NextUI. De paso vamos a eliminar la clave theme porque es una personalización de la plantilla de Next.js que no vamos a necesitar. ```typescript title="tailwind.config.ts" hl_lines="1 9 11 12" import { nextui } from '@nextui-org/react' @@ -25,32 +24,33 @@ const config: Config = { ], darkMode: 'class', plugins: [nextui()], - theme: { - extend: { - backgroundImage: { - 'gradient-conic': - 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', - 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', - }, - }, - }, } export default config ``` +Y eliminamos los estilos que nos trae por defecto la plantilla de Next. Edita este archivo y deja solo +estas lineas: + +```css title="src/app/globals.css" +@tailwind base; +@tailwind components; +@tailwind utilities; +``` + + ### Dark theme Para poder aplicar el tema oscuro o claro en nuestra aplicación, necesitamos configurar una librería llamada `next-theme`. En este caso NextUI también lo explica en la [web oficial](https://storiesv2.nextui.org/docs/customization/dark-mode). -Si hemos seguido las instrucciones correctamente, tendremos un fichero providers con el siguiente código: +Necesitamos, en cualquier caso crear un nuevo fichero con los providers de NextUI con el siguiente contenido: ```typescript title="src/app/providers.tsx" -"use client"; +'use client' -import {NextUIProvider} from '@nextui-org/react' -import {ThemeProvider as NextThemesProvider} from "next-themes"; +import { NextUIProvider } from '@nextui-org/react' +import { ThemeProvider as NextThemesProvider } from 'next-themes' -export function Providers({children}: { children: React.ReactNode }) { +export function Providers({ children }: { children: React.ReactNode }) { return ( @@ -62,7 +62,7 @@ export function Providers({children}: { children: React.ReactNode }) { ``` !!! info - La notación ```"use client";``` es exclusiva de algunos frameworks con soporte de `React Server Components`. Se verá su uso durante el curso. + La notación ```'use client'``` es exclusiva de algunos frameworks con soporte de `React Server Components`. Se verá su uso durante el curso. Y este archivo de providers se debe cargar en el layout principal: @@ -103,33 +103,36 @@ Para poder ver en funcionamiento el selector de tema claro/oscuro, vamos a crear Para eso crearemos el siguiente componente: ```typescript title="src/components/theme-switcher/theme-switcher.tsx" -"use client"; +'use client' -import { MoonIcon, SunIcon } from "@heroicons/react/24/solid"; -import { Switch } from "@nextui-org/react"; -import { useTheme } from "next-themes"; -import { useEffect, useState } from "react"; +import { MoonIcon, SunIcon } from '@heroicons/react/24/solid' +import { Switch } from '@nextui-org/react' +import { useTheme } from 'next-themes' +import { useEffect, useState } from 'react' +/** + * Theme dark/light switcher + */ export function ThemeSwitcher() { - const [mounted, setMounted] = useState(false); // (1)! - const { theme, setTheme } = useTheme(); // (2)! + const [mounted, setMounted] = useState(false) + const { setTheme, theme } = useTheme() useEffect(() => { - setMounted(true); - }, [setMounted]); // (3)! + setMounted(true) + }, [setMounted]) - if (!mounted) return null; + if (!mounted) return null return ( setTheme(theme === "dark" ? "light" : "dark")} + onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')} startContent={} endContent={} /> - ); + ) } ``` @@ -150,8 +153,9 @@ export * from './theme-switcher' Vamos a probar a añadir nuestro componente a la pagina principal: -```typescript title="src/app/page.tsx" hl_lines="2 13" +``` { .typescript .no-copy title="src/app/page.tsx" hl_lines="3 14" linenums="1" } import Image from 'next/image' + import { ThemeSwitcher } from '@/components/theme-switcher' export default function Home() { @@ -162,7 +166,7 @@ export default function Home() { Get started by editing  src/app/page.tsx

-
+
// (1)! By{' '} @@ -175,13 +179,23 @@ export default function Home() { 1. Añadimos el componente antes del logo de Vercel. El IDE importará automáticamente el componente. -Y para que funcione vamos a hacer un par de cambios. Eliminamos los estilos que nos trae por defecto la plantilla de Next: +!!! warning + + En este caso no puedes copiar y pegar el código. Aprende a importar y usar + componentes. + + Hay dos maneras de escribir una marca HTML. Si la marca tiene contenido: + + ```html +
Content
+ ``` + + Y si no lo tiene, como es el caso de nuestro componente: + + ```html + + ``` -```css title="src/app/globals.css" -@tailwind base; -@tailwind components; -@tailwind utilities; -``` Ahora, ya tendremos la página principal con nuestro componente para cambiar al tema claro: diff --git a/docs/storybook.md b/docs/storybook.md index 38f9c7d..f17b208 100644 --- a/docs/storybook.md +++ b/docs/storybook.md @@ -19,12 +19,6 @@ npx storybook@latest init -t nextjs nextjs con el parámetro `-t nextjs`. -Seleccionaremos todas las respuestas por defecto. Con esto ya tendremos una serie de componentes básicos para que podamos ver su funcionamiento: - -```bash -npm run storybook -``` - !!! info La primera vez que se instala se inicia solo y nos muestra un tutorial. @@ -33,15 +27,22 @@ Se nos abrirá esta página con algunos componentes de ejemplo: ![Landing page de Storybook](images/storybook-landingpage.png) -!!! warning - Storybook crea una serie de historias de ejemplo en el directorio `src/stories`. Recuerda no guardarlas en git. - Para tener soporte de tema oscuro, necesitamos también instalar el siguiente paquete: ```bash npm install --save-dev @storybook/addon-themes ``` +!!! info + + Para instalar el nuevo plugin, cierra el servicio de storybook que tienes abierto con ++control+c++, y cuando + termines de configurarlo puedes volver a ejecutar storybook con esta orden: + + ```bash + npm run storybook + ``` + + ## Configuración de Storybook Storybook es una aplicación distinta a la de next, por tanto, no tiene por qué @@ -55,18 +56,19 @@ componentes. Vamos a empezar por el entorno de typescript. Necesitamos que Storybook entienad los paths que tenemos configurados en el archivo `tsconfig.json`. También vamos a aprovechar para mover la carpeta de historias `stories` a la raíz del repositorio: -```typescript title=".storybook/main.ts" hl_lines="2 5 11 20-29" +```typescript title=".storybook/main.ts" hl_lines="2 12 21-30" import type { StorybookConfig } from "@storybook/nextjs"; import path from "path"; const config: StorybookConfig = { - stories: ["../stories/**/*.mdx", "../stories/**/*.stories.@(js|jsx|mjs|ts|tsx)"], + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], addons: [ - "@storybook/addon-links", - "@storybook/addon-essentials", - "@storybook/addon-onboarding", - "@storybook/addon-interactions", - "@storybook/addon-themes", + '@storybook/addon-onboarding', + '@storybook/addon-links', + '@storybook/addon-essentials', + '@chromatic-com/storybook', + '@storybook/addon-interactions', + '@storybook/addon-themes', ], framework: { name: "@storybook/nextjs", @@ -94,31 +96,30 @@ export default config; A continuación vamos a cargar los providers a la hora de visualizar los componentes: -```typescript title=".storybook/preview.ts" linenums="1" hl_lines="1 6-15" -import "@/app/globals.css"; +```typescript title=".storybook/preview.ts" hl_lines="1-3 7-15" +import '@/app/globals.css' -import type {Preview} from '@storybook/react' -import {withThemeByClassName} from '@storybook/addon-themes'; +import { withThemeByClassName } from '@storybook/addon-themes' +import type { Preview } from '@storybook/react' const preview: Preview = { - decorators: [ - withThemeByClassName({ - themes: { - light: 'light', - dark: 'dark', - }, - defaultTheme: 'light', - }), - ], - parameters: { - actions: {argTypesRegex: '^on[A-Z].*'}, - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/i, - }, - }, + decorators: [ + withThemeByClassName({ + themes: { + light: 'light', + dark: 'dark', + }, + defaultTheme: 'light', + }), + ], + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, }, + }, } export default preview @@ -131,13 +132,17 @@ Una historia en Storybook es una representación visual y funcional de un compon Vamos a crear la historia del componente que creamos antes: -```typescript title="stories/components/theme-switcher.stories.ts" +```typescript title="src/stories/components/theme-switcher.stories.ts" import { Meta, StoryObj } from '@storybook/react' import { ThemeSwitcher } from '@/components/theme-switcher' const meta = { component: ThemeSwitcher, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], title: 'Components/ThemeSwitcher', } satisfies Meta @@ -147,10 +152,6 @@ type Story = StoryObj export const Basic: Story = {} ``` -!!! warning - Se ha cambiado la configuración para cargar las historias desde `/stories` en vez de `/src/stories`. Las historias que se han creado por - defecto las puedes eliminar o moverlas a la nueva carpeta. - Y aparecerá una nueva sección llamada componentes que tendrá nuestra historia. Ahora veremos nuestra historia de forma correcta. Podemos ya incluso borrar los componentes de ejemplo. @@ -159,4 +160,6 @@ Ahora veremos nuestra historia de forma correcta. Podemos ya incluso borrar los !!! question "Ejercicio" Guarda los cambios que hemos hecho y la historia que hemos creado en git. - No guardes los componentes de ejemplo. + Storybook crea una serie de historias de ejemplo en el directorio `src/stories`. + Recuerda no guardarlas en git. +