{"id":30712547,"url":"https://github.com/lostovayne/modern-hono-api-rest","last_synced_at":"2026-04-13T03:46:14.772Z","repository":{"id":311547626,"uuid":"1044025301","full_name":"Lostovayne/Modern-Hono-Api-Rest","owner":"Lostovayne","description":"Solid Api rest using Hono, drizzle and Postgresql, includes the use of Bun, docker for database and testing, a light and fast stack for efficient Api rest.","archived":false,"fork":false,"pushed_at":"2025-08-31T08:40:37.000Z","size":54,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-31T10:06:57.393Z","etag":null,"topics":["biome","bun","docker","drizzle-orm","honojs","husky","lint-staged","postgresql","testing","typescript","ultracite"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Lostovayne.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-25T04:38:35.000Z","updated_at":"2025-08-31T08:40:40.000Z","dependencies_parsed_at":"2025-08-31T10:06:57.995Z","dependency_job_id":null,"html_url":"https://github.com/Lostovayne/Modern-Hono-Api-Rest","commit_stats":null,"previous_names":["lostovayne/hono-api-rest","lostovayne/modern-hono-api-rest"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Lostovayne/Modern-Hono-Api-Rest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lostovayne%2FModern-Hono-Api-Rest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lostovayne%2FModern-Hono-Api-Rest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lostovayne%2FModern-Hono-Api-Rest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lostovayne%2FModern-Hono-Api-Rest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Lostovayne","download_url":"https://codeload.github.com/Lostovayne/Modern-Hono-Api-Rest/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lostovayne%2FModern-Hono-Api-Rest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273381892,"owners_count":25095329,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-03T02:00:09.631Z","response_time":76,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["biome","bun","docker","drizzle-orm","honojs","husky","lint-staged","postgresql","testing","typescript","ultracite"],"created_at":"2025-09-03T03:01:10.477Z","updated_at":"2026-04-05T08:34:12.859Z","avatar_url":"https://github.com/Lostovayne.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# 🚀 Hono API con Drizzle ORM y PostgreSQL\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Hono-4.9.4-blue?style=for-the-badge\u0026logo=hono\" alt=\"Hono\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Drizzle_ORM-0.44.4-orange?style=for-the-badge\u0026logo=drizzle\" alt=\"Drizzle ORM\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/PostgreSQL-17.5-blue?style=for-the-badge\u0026logo=postgresql\" alt=\"PostgreSQL\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/TypeScript-Latest-blue?style=for-the-badge\u0026logo=typescript\" alt=\"TypeScript\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Bun-Latest-black?style=for-the-badge\u0026logo=bun\" alt=\"Bun\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Biome-2.2.2-purple?style=for-the-badge\u0026logo=biome\" alt=\"Biome\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Una API REST moderna y de alto rendimiento construida con \u003ca href=\"https://hono.dev/\"\u003eHono\u003c/a\u003e, un framework web ligero y rápido, y \u003ca href=\"https://orm.drizzle.team/\"\u003eDrizzle ORM\u003c/a\u003e para acceso a base de datos PostgreSQL con seguridad de tipos. Incluye una configuración completa para desarrollo local y contenerización con Docker.\n\u003c/p\u003e\n\n\u003c/div\u003e\n\n## 📚 Índice\n\n- [✨ Características](#-características)\n- [🛠️ Stack Tecnológico](#️-stack-tecnológico)\n- [📁 Estructura del Proyecto](#-estructura-del-proyecto)\n- [📋 Requisitos Previos](#-requisitos-previos)\n- [🚀 Primeros Pasos](#-primeros-pasos)\n- [📊 Esquema de Base de Datos](#-esquema-de-base-de-datos)\n- [🔄 API Endpoints](#-api-endpoints)\n- [🧪 Testing](#-testing)\n- [🐳 Docker](#-docker)\n- [🔧 Herramientas de Desarrollo](#-herramientas-de-desarrollo)\n- [🤝 Contribuir](#-contribuir)\n- [📄 Licencia](#-licencia)\n\n## ✨ Características\n\n\u003cdiv style=\"display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1rem;\"\u003e\n\n\u003cdiv style=\"padding: 1rem; border-radius: 8px; background-color: #f8f9fa; border-left: 4px solid #4285f4;\"\u003e\n  \u003ch3\u003e🚀 Ultra-rápido\u003c/h3\u003e\n  \u003cp\u003eConstruido con Hono para un rendimiento excepcional en aplicaciones web.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv style=\"padding: 1rem; border-radius: 8px; background-color: #f8f9fa; border-left: 4px solid #34a853;\"\u003e\n  \u003ch3\u003e🔒 Seguridad de tipos\u003c/h3\u003e\n  \u003cp\u003eSeguridad de tipos de extremo a extremo con TypeScript y Drizzle ORM.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv style=\"padding: 1rem; border-radius: 8px; background-color: #f8f9fa; border-left: 4px solid #fbbc05;\"\u003e\n  \u003ch3\u003e🐳 Dockerizado\u003c/h3\u003e\n  \u003cp\u003eIncluye \u003ccode\u003edocker-compose.yml\u003c/code\u003e para configuración fácil de PostgreSQL.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv style=\"padding: 1rem; border-radius: 8px; background-color: #f8f9fa; border-left: 4px solid #ea4335;\"\u003e\n  \u003ch3\u003e🐘 PostgreSQL\u003c/h3\u003e\n  \u003cp\u003eUtiliza PostgreSQL como base de datos principal con esquemas tipados.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv style=\"padding: 1rem; border-radius: 8px; background-color: #f8f9fa; border-left: 4px solid #673ab7;\"\u003e\n  \u003ch3\u003e🔥 Hot-Reload\u003c/h3\u003e\n  \u003cp\u003eRecarga en vivo para una experiencia de desarrollo fluida con Bun.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv style=\"padding: 1rem; border-radius: 8px; background-color: #f8f9fa; border-left: 4px solid #ff9800;\"\u003e\n  \u003ch3\u003e💅 Calidad de código\u003c/h3\u003e\n  \u003cp\u003eIncluye \u003ca href=\"https://biomejs.dev/\"\u003eBiome\u003c/a\u003e para formateo y linting, y \u003ca href=\"https://typicode.github.io/husky/\"\u003eHusky\u003c/a\u003e para hooks pre-commit.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv style=\"padding: 1rem; border-radius: 8px; background-color: #f8f9fa; border-left: 4px solid #009688;\"\u003e\n  \u003ch3\u003e🧪 Testing integrado\u003c/h3\u003e\n  \u003cp\u003eConfiguración de pruebas lista para usar con Bun test y base de datos de prueba.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv style=\"padding: 1rem; border-radius: 8px; background-color: #f8f9fa; border-left: 4px solid #e91e63;\"\u003e\n  \u003ch3\u003e🔄 CI/CD\u003c/h3\u003e\n  \u003cp\u003eIntegración continua con GitHub Actions para verificar la calidad del código.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003c/div\u003e\n\n\n## 📁 Estructura del Proyecto\n\n```mermaid\ngraph TD\n    A[hono-drizzle] --\u003e B[src/]\n    A --\u003e C[scripts/]\n    A --\u003e D[.github/]\n    A --\u003e E[docker-compose.yml]\n    A --\u003e F[drizzle.config.ts]\n    A --\u003e G[biome.jsonc]\n    A --\u003e H[.husky/]\n\n    B --\u003e I[db/]\n    B --\u003e J[index.ts]\n    B --\u003e K[test/]\n\n    I --\u003e L[db.ts]\n    I --\u003e M[schema.ts]\n    I --\u003e N[queries.ts]\n    I --\u003e O[queries.test.ts]\n    I --\u003e P[drizzle/]\n\n    C --\u003e Q[seed.script.ts]\n\n    K --\u003e R[setup-test-db.ts]\n    K --\u003e S[setup.ts]\n\n    D --\u003e T[workflows/]\n    T --\u003e U[ci.yml]\n\n    H --\u003e V[pre-commit]\n```\n\n\u003cdiv style=\"background-color: #f8f9fa; padding: 1rem; border-radius: 8px; font-family: 'Courier New', monospace; margin: 1rem 0;\"\u003e\n\n```bash\nhono-drizzle/\n├── src/\n│   ├── db/\n│   │   ├── db.ts           # Instancia de Drizzle DB\n│   │   ├── drizzle/        # Migraciones generadas\n│   │   ├── queries.ts      # Consultas a la base de datos\n│   │   ├── queries.test.ts # Tests para las consultas\n│   │   └── schema.ts       # Definiciones del esquema de la BD\n│   ├── index.ts            # Punto de entrada y rutas API\n│   └── test/\n│       ├── setup-test-db.ts # Configuración de BD para tests\n│       └── setup.ts         # Configuración general de tests\n├── scripts/\n│   └── seed.script.ts      # Script para poblar la BD\n├── .github/                # Configuración de GitHub\n│   └── workflows/\n│       └── ci.yml          # Configuración de CI\n├── .husky/                 # Hooks de Git\n│   └── pre-commit          # Hook pre-commit\n├── .gitignore\n├── biome.jsonc             # Configuración de Biome\n├── docker-compose.yml      # Configuración de Docker Compose\n├── drizzle.config.ts       # Configuración de Drizzle ORM\n├── package.json            # Dependencias y scripts\n├── tsconfig.json           # Configuración de TypeScript\n└── README.md               # Documentación del proyecto\n```\n\n\u003c/div\u003e\n\n## 📋 Requisitos Previos\n\n\u003cdiv style=\"background-color: #f8f9fa; padding: 1.5rem; border-radius: 8px; border-left: 4px solid #4285f4; margin: 1rem 0;\"\u003e\n\nAsegúrate de tener instalado lo siguiente en tu sistema:\n\n\u003cdiv style=\"display: flex; align-items: center; margin-bottom: 0.5rem;\"\u003e\n  \u003cimg src=\"https://bun.sh/logo.svg\" alt=\"Bun\" width=\"24\" height=\"24\" style=\"margin-right: 10px;\" /\u003e\n  \u003ca href=\"https://bun.sh/\"\u003eBun\u003c/a\u003e (v1.0 o superior)\n\u003c/div\u003e\n\n\u003cdiv style=\"display: flex; align-items: center; margin-bottom: 0.5rem;\"\u003e\n  \u003cimg src=\"https://www.docker.com/wp-content/uploads/2022/03/vertical-logo-monochromatic.png\" alt=\"Docker\" width=\"24\" height=\"24\" style=\"margin-right: 10px;\" /\u003e\n  \u003ca href=\"https://www.docker.com/\"\u003eDocker\u003c/a\u003e y \u003ca href=\"https://docs.docker.com/compose/\"\u003eDocker Compose\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv style=\"display: flex; align-items: center; margin-bottom: 0.5rem;\"\u003e\n  \u003cimg src=\"https://git-scm.com/images/logos/downloads/Git-Icon-1788C.png\" alt=\"Git\" width=\"24\" height=\"24\" style=\"margin-right: 10px;\" /\u003e\n  \u003ca href=\"https://git-scm.com/\"\u003eGit\u003c/a\u003e\n\u003c/div\u003e\n\n\u003c/div\u003e\n\n## 🚀 Primeros Pasos\n\n### 1. Clonar el repositorio\n\n```bash\ngit clone https://github.com/your-username/hono-drizzle.git\ncd hono-drizzle\n```\n\n### 2. Instalar dependencias\n\n```bash\nbun install\n```\n\n### 3. Configurar la base de datos\n\nInicia la base de datos PostgreSQL usando Docker Compose:\n\n```bash\ndocker-compose up -d\n```\n\nEsto creará un contenedor PostgreSQL con la siguiente configuración:\n\n| Parámetro     | Valor       |\n| ------------- | ----------- |\n| Host          | `localhost` |\n| Puerto        | `5432`      |\n| Base de datos | `todos`     |\n| Usuario       | `user`      |\n| Contraseña    | `password`  |\n\nTambién necesitarás configurar la variable de entorno `DATABASE_URL`. Puedes crear un archivo `.env` en la raíz del proyecto con el siguiente contenido:\n\n```\nDATABASE_URL=postgresql://user:password@localhost:5432/todos\n```\n\n### 4. Ejecutar migraciones de la base de datos\n\nAplica el esquema de la base de datos:\n\n```bash\nbun run db:migrate\n```\n\n### 5. Poblar la base de datos con datos de ejemplo (opcional)\n\n```bash\nbun run db:seed\n```\n\n### 6. Ejecutar la aplicación\n\nPara iniciar el servidor de desarrollo con recarga en caliente:\n\n```bash\nbun run dev\n```\n\nLa API estará disponible en `http://localhost:3000`.\n\n## 📊 Esquema de Base de Datos\n\n```mermaid\nerDiagram\n    USERS {\n        uuid id PK\n        varchar(256) email UK\n        varchar(500) passwordHash\n        integer age\n        timestamp createdAt\n        timestamp updatedAt\n    }\n    TODOS {\n        uuid id PK\n        uuid userId FK\n        varchar(500) title\n        varchar(1000) description\n        boolean completed\n        timestamp createdAt\n        timestamp updatedAt\n    }\n    USERS ||--o{ TODOS : \"tiene\"\n```\n\n### Tabla `users`\n\n| Campo          | Tipo           | Descripción                          |\n| -------------- | -------------- | ------------------------------------ |\n| `id`           | `uuid`         | Identificador único (clave primaria) |\n| `email`        | `varchar(256)` | Email del usuario (único)            |\n| `passwordHash` | `varchar(500)` | Hash de la contraseña                |\n| `age`          | `integer`      | Edad del usuario (0-120)             |\n| `createdAt`    | `timestamp`    | Fecha de creación                    |\n| `updatedAt`    | `timestamp`    | Fecha de última actualización        |\n\n### Tabla `todos`\n\n| Campo         | Tipo            | Descripción                          |\n| ------------- | --------------- | ------------------------------------ |\n| `id`          | `uuid`          | Identificador único (clave primaria) |\n| `userId`      | `uuid`          | ID del usuario (clave foránea)       |\n| `title`       | `varchar(500)`  | Título de la tarea                   |\n| `description` | `varchar(1000)` | Descripción de la tarea              |\n| `completed`   | `boolean`       | Estado de completitud                |\n| `createdAt`   | `timestamp`     | Fecha de creación                    |\n| `updatedAt`   | `timestamp`     | Fecha de última actualización        |\n\n## 🔄 API Endpoints\n\n\u003cdiv style=\"background-color: #f8f9fa; padding: 1rem; border-radius: 8px; margin: 1rem 0;\"\u003e\n\n### Usuarios\n\n| Método   | Ruta         | Descripción                    |\n| -------- | ------------ | ------------------------------ |\n| `GET`    | `/users`     | Obtiene todos los usuarios     |\n| `GET`    | `/users/:id` | Obtiene un usuario por ID      |\n| `POST`   | `/users`     | Crea un nuevo usuario          |\n| `PUT`    | `/users/:id` | Actualiza un usuario existente |\n| `DELETE` | `/users/:id` | Elimina un usuario             |\n\n### Tareas\n\n| Método   | Ruta                  | Descripción                            |\n| -------- | --------------------- | -------------------------------------- |\n| `GET`    | `/todos`              | Obtiene todas las tareas               |\n| `GET`    | `/todos/:id`          | Obtiene una tarea por ID               |\n| `GET`    | `/todos/user/:userId` | Obtiene todas las tareas de un usuario |\n| `POST`   | `/todos`              | Crea una nueva tarea                   |\n| `PUT`    | `/todos/:id`          | Actualiza una tarea existente          |\n| `DELETE` | `/todos/:id`          | Elimina una tarea                      |\n\n\u003c/div\u003e\n\n### Ejemplo de Uso\n\n```bash\n# Obtener todos los usuarios\ncurl -X GET http://localhost:3000/users\n\n# Crear un nuevo usuario\ncurl -X POST http://localhost:3000/users \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"email\":\"usuario@ejemplo.com\",\"passwordHash\":\"hash_seguro\",\"age\":30}'\n\n# Obtener todas las tareas de un usuario\ncurl -X GET http://localhost:3000/todos/user/550e8400-e29b-41d4-a716-446655440000\n```\n\n### Ejemplo de Respuesta\n\n```json\n// Respuesta al obtener todos los usuarios\n[\n  {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"email\": \"usuario@ejemplo.com\",\n    \"passwordHash\": \"hash_seguro\",\n    \"age\": 30,\n    \"createdAt\": \"2023-04-01T12:00:00Z\",\n    \"updatedAt\": \"2023-04-01T12:00:00Z\"\n  },\n  {\n    \"id\": \"550e8400-e29b-41d4-a716-446655440001\",\n    \"email\": \"otro@ejemplo.com\",\n    \"passwordHash\": \"otro_hash_seguro\",\n    \"age\": 25,\n    \"createdAt\": \"2023-04-02T10:30:00Z\",\n    \"updatedAt\": \"2023-04-02T10:30:00Z\"\n  }\n]\n```\n\n## 🧪 Testing\n\n\u003cdiv style=\"background-color: #f8f9fa; padding: 1rem; border-radius: 8px; border-left: 4px solid #673ab7; margin: 1rem 0;\"\u003e\n\nEste proyecto incluye una configuración completa para pruebas unitarias e integración utilizando el test runner integrado de Bun.\n\n### Configuración de Tests\n\nLos tests utilizan una base de datos PostgreSQL temporal que se crea y destruye para cada prueba, asegurando que cada test se ejecute en un entorno aislado y limpio.\n\n### Ejecutando los Tests\n\nPara ejecutar todos los tests:\n\n```bash\nbun test\n```\n\nPara ejecutar un archivo de test específico:\n\n```bash\nbun test src/db/queries.test.ts\n```\n\n### Estructura de Tests\n\nLos tests están organizados siguiendo la estructura del código fuente. Por ejemplo, las pruebas para las consultas de base de datos se encuentran en `src/db/queries.test.ts`.\n\n### Ejemplo de Test\n\n```typescript\nimport { describe, expect, it } from \"bun:test\";\nimport { createTestDb } from \"../test/setup-test-db\";\nimport { insertUser, getTodosByUserId } from \"./queries\";\n\ndescribe(\"Database queries\", () =\u003e {\n  it(\"should insert a user and retrieve todos\", async () =\u003e {\n    const ctx = await createTestDb();\n    const db = ctx.db;\n\n    // Insertar un usuario de prueba\n    const user = await insertUser(db, {\n      email: \"test@example.com\",\n      passwordHash: \"test_hash\",\n      age: 25,\n    });\n\n    // Verificar que el usuario se insertó correctamente\n    expect(user.id).toBeDefined();\n    expect(user.email).toBe(\"test@example.com\");\n\n    // Limpiar después de la prueba\n    await ctx.cleanup();\n  });\n});\n```\n\n\u003c/div\u003e\n\n## 🐳 Docker\n\n\u003cdiv style=\"background-color: #f8f9fa; padding: 1rem; border-radius: 8px; border-left: 4px solid #fbbc05; margin: 1rem 0;\"\u003e\n\nEste proyecto utiliza Docker para proporcionar un entorno de desarrollo consistente y fácil de configurar.\n\n### Configuración de Docker\n\nEl archivo `docker-compose.yml` define un servicio PostgreSQL:\n\n```yaml\nservices:\n  postgres:\n    image: postgres:17.5-alpine\n    restart: unless-stopped\n    ports:\n      - 5432:5432\n    environment:\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: password\n      POSTGRES_DB: todos\n```\n\n### Comandos Docker útiles\n\n```bash\n# Iniciar los servicios en segundo plano\ndocker-compose up -d\n\n# Ver logs de los servicios\ndocker-compose logs\n\n# Detener los servicios\ndocker-compose down\n\n# Detener los servicios y eliminar volúmenes (borra datos)\ndocker-compose down -v\n```\n\n\u003c/div\u003e\n\n## 🔧 Herramientas de Desarrollo\n\n\u003cdiv style=\"background-color: #f8f9fa; padding: 1rem; border-radius: 8px; margin: 1rem 0;\"\u003e\n\n### Biome\n\n[Biome](https://biomejs.dev/) es una herramienta todo-en-uno para formateo, linting y más. La configuración se encuentra en `biome.jsonc`:\n\n```json\n{\n  \"$schema\": \"https://biomejs.dev/schemas/2.2.2/schema.json\",\n  \"extends\": [\"ultracite\"]\n}\n```\n\nComandos disponibles:\n\n```bash\n# Formatear código\nbun run format\n\n# Verificar linting\nbun run lint\n\n# Verificar y corregir problemas\nbun run check\n```\n\n### Husky\n\n[Husky](https://typicode.github.io/husky/) se utiliza para ejecutar scripts en los hooks de Git. La configuración se encuentra en `.husky/pre-commit`:\n\n```bash\nbunx lint-staged\n```\n\nEsto ejecuta `lint-staged` antes de cada commit, que a su vez ejecuta los comandos de formateo y linting en los archivos modificados según la configuración en `package.json`:\n\n```json\n\"lint-staged\": {\n  \"*.{js,ts,tsx,json,jsonc,css,md,mdx}\": [\n    \"bun format\",\n    \"bun check \",\n    \"bun lint\"\n  ]\n}\n```\n\n### Drizzle ORM\n\n[Drizzle ORM](https://orm.drizzle.team/) es un ORM TypeScript nativo con excelente soporte para PostgreSQL. La configuración se encuentra en `drizzle.config.ts`:\n\n```typescript\nimport { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n  out: \"./src/db/drizzle\",\n  schema: \"./src/db/schema.ts\",\n  dialect: \"postgresql\",\n  dbCredentials: {\n    url: process.env.DATABASE_URL || \"\",\n  },\n  casing: \"snake_case\",\n});\n```\n\nComandos disponibles:\n\n```bash\n# Generar migraciones\nbun run db:generate:migration\n\n# Aplicar migraciones\nbun run db:migrate\n\n# Abrir Drizzle Studio (interfaz visual para la BD)\nbun run db:studio\n\n# Poblar la BD con datos de ejemplo\nbun run db:seed\n```\n\n### GitHub Actions\n\nEste proyecto incluye una configuración de CI con GitHub Actions en `.github/workflows/ci.yml`:\n\n```yaml\nname: CI\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  check:\n    name: Biome Check\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n\n      - name: Set up Node.js v22\n        uses: actions/setup-node@v4\n        with:\n          node-version: 22\n\n      - name: Set up Bun\n        uses: oven-sh/setup-bun@v1\n\n      - name: Install dependencies\n        run: bun install\n\n      - name: Run Biome check\n        run: bun run check\n```\n\nEsta configuración ejecuta las verificaciones de Biome en cada push a la rama principal y en cada pull request.\n\n\u003c/div\u003e\n\n## 🤝 Contribuir\n\n\u003cdiv style=\"background-color: #f8f9fa; padding: 1rem; border-radius: 8px; border-left: 4px solid #34a853; margin: 1rem 0;\"\u003e\n\nLas contribuciones son bienvenidas. Por favor, sigue estos pasos:\n\n1. Haz fork del repositorio\n2. Crea una rama para tu característica (`git checkout -b feature/amazing-feature`)\n3. Haz commit de tus cambios (`git commit -m 'feat: añadir nueva característica'`)\n4. Haz push a la rama (`git push origin feature/amazing-feature`)\n5. Abre un Pull Request\n\n### Convenciones de Código\n\n- Sigue las convenciones de estilo aplicadas por Biome\n- Escribe tests para tu código\n- Documenta las nuevas características\n- Sigue las [convenciones de commits convencionales](https://www.conventionalcommits.org/)\n\n\u003c/div\u003e\n\n## 📄 Licencia\n\n\u003cdiv style=\"background-color: #f8f9fa; padding: 1rem; border-radius: 8px; border-left: 4px solid #fbbc05; margin: 1rem 0;\"\u003e\n\nEste proyecto está licenciado bajo la Licencia MIT - ver el archivo [LICENSE](LICENSE) para más detalles.\n\n\u003c/div\u003e\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"https://raw.githubusercontent.com/honojs/hono/main/docs/images/hono-logo.png\" alt=\"Hono\" width=\"30\" height=\"30\" style=\"margin-right: 10px;\" /\u003e\n\u003cimg src=\"https://orm.drizzle.team/favicon.ico\" alt=\"Drizzle\" width=\"30\" height=\"30\" style=\"margin-right: 10px;\" /\u003e\n\u003cimg src=\"https://wiki.postgresql.org/images/3/30/PostgreSQL_logo.3colors.120x120.png\" alt=\"PostgreSQL\" width=\"30\" height=\"30\" style=\"margin-right: 10px;\" /\u003e\n\u003cimg src=\"https://bun.sh/logo.svg\" alt=\"Bun\" width=\"30\" height=\"30\" /\u003e\n\n\u003cp\u003eHecho con ❤️ usando tecnologías modernas\u003c/p\u003e\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flostovayne%2Fmodern-hono-api-rest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flostovayne%2Fmodern-hono-api-rest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flostovayne%2Fmodern-hono-api-rest/lists"}