deseo crear un monorepo con turborepo para mi app de next usando shadcn ui. Deseo ademas agregar eslint y prettier con todas las configuraciones recomentadas y algunos plugins para verificar las clases de tailwind css y hacer import order asi como plugins de prettier que se apliquen de forma general a mi app
Para crear tu monorepo con todas estas configuraciones, sigue estos pasos:
mkdir my-monorepo
cd my-monorepo
pnpm init
mkdir -p apps/web packages/ui
cd apps/web
pnpm dlx create-next-app@latest . --typescript --tailwind --eslint --app --src-dir
cd apps/web
pnpm dlx shadcn@canary init
Cuando se te pregunte, selecciona "Next.js (Monorepo)" como tipo de proyecto.
.eslintrc.js
y .prettierrc.js
en la raízpackage.json
y turbo.json
en la raízcomponents.json
en apps/web
y packages/ui
pnpm install
La estructura final de tu monorepo será:
.
├── apps/
│ └── web/ # Tu aplicación Next.js
│ ├── src/
│ └── components.json
├── packages/
│ └── ui/ # Componentes compartidos
│ ├── src/
│ │ ├── components/
│ │ ├── styles/
│ │ └── lib/
│ └── components.json
├── .eslintrc.js
├── .prettierrc.js
├── package.json
└── turbo.json
Esta configuración incluye:
ESLint con:
Prettier con:
ui
Para usar los componentes de shadcn/ui, puedes agregarlos desde el directorio de tu aplicación 3:
cd apps/web
pnpm dlx shadcn@canary add button
Los componentes se instalarán en el paquete ui
y podrás importarlos en tu aplicación web como:
import { Button } from "@workspace/ui/components/button"
He creado un nuevo paquete @workspace/eslint-config
que contiene toda la configuración de ESLint y Prettier. Aquí está cómo funciona:
Estructura del paquete:
library.js
: Configuración base para bibliotecas TypeScriptreact.js
: Configuración específica para Reactnext.js
: Configuración específica para Next.jsprettier-preset.js
: Configuración compartida de PrettierConfiguraciones disponibles:
@workspace/eslint-config/next
@workspace/eslint-config/react
@workspace/eslint-config/library
# Instalar el paquete
pnpm add -D @workspace/eslint-config
Luego, crea un .eslintrc.js
:
module.exports = {
root: true,
extends: ["@workspace/eslint-config/next"], // o react o library según el proyecto
};
Y un .prettierrc.js
:
module.exports = {
...require("@workspace/eslint-config/prettier-preset"),
};
Características incluidas:
{
"scripts": {
"lint": "eslint . --ext .ts,.tsx,.js,.jsx",
"format": "prettier --write \"**/*.{ts,tsx,md,json}\""
}
}
Esta configuración modular te permite:
Para actualizar las reglas o agregar nuevos plugins, solo necesitas modificar los archivos en el paquete @workspace/eslint-config
y todos los proyectos que lo utilicen recibirán las actualizaciones al reinstalar las dependencias.