{"id":13764755,"url":"https://github.com/rudemex/nestjs-starter","last_synced_at":"2025-04-05T13:03:03.521Z","repository":{"id":37018363,"uuid":"390546832","full_name":"rudemex/nestjs-starter","owner":"rudemex","description":"Starter for BFF, API Rest and microservice with NestJS","archived":false,"fork":false,"pushed_at":"2025-03-13T21:56:15.000Z","size":45129,"stargazers_count":119,"open_issues_count":0,"forks_count":15,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-29T12:06:52.259Z","etag":null,"topics":["api-rest","bff","nest","nestjs","nodejs","starter","swagger"],"latest_commit_sha":null,"homepage":"https://nestjs-starter.tresdoce.com.ar/v1/docs/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rudemex.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"license.md","code_of_conduct":".github/CODE_OF_CONDUCT.md","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},"funding":{"github":"rudemex","custom":["https://www.linkedin.com/in/rudemex","https://www.instagram.com/rudemex/","https://twitter.com/rudemex/","https://paypal.me/rudemex"]}},"created_at":"2021-07-29T00:19:15.000Z","updated_at":"2025-03-27T03:03:46.000Z","dependencies_parsed_at":"2023-11-24T21:21:27.606Z","dependency_job_id":"bfd5be95-29f2-4865-8135-b1dd7ebeb659","html_url":"https://github.com/rudemex/nestjs-starter","commit_stats":null,"previous_names":[],"tags_count":83,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudemex%2Fnestjs-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudemex%2Fnestjs-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudemex%2Fnestjs-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudemex%2Fnestjs-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rudemex","download_url":"https://codeload.github.com/rudemex/nestjs-starter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247339149,"owners_count":20923014,"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","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":["api-rest","bff","nest","nestjs","nodejs","starter","swagger"],"created_at":"2024-08-03T16:00:28.076Z","updated_at":"2025-04-05T13:03:03.509Z","avatar_url":"https://github.com/rudemex.png","language":"TypeScript","funding_links":["https://github.com/sponsors/rudemex","https://www.linkedin.com/in/rudemex","https://www.instagram.com/rudemex/","https://twitter.com/rudemex/","https://paypal.me/rudemex","https://www.buymeacoffee.com/rudemex"],"categories":["Resources"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003cimg alt=\"nestjs-starter\" width=\"250\" height=\"auto\" src=\"https://raw.githubusercontent.com/rudemex/nestjs-starter/master/.readme-static/logo-nestjs.svg\" /\u003e\n    \u003ch1\u003eNestJS Starter\u003c/h1\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://img.shields.io/static/v1.svg?style=flat\u0026label=NodeJS\u0026message=v20.19.0\u0026labelColor=339933\u0026color=757575\u0026logoColor=FFFFFF\u0026logo=Node.js\" alt=\"Node.js\"/\u003e\n    \u003cimg src=\"https://img.shields.io/static/v1.svg?style=flat\u0026label=NPM\u0026message=v11.2.0\u0026labelColor=CB3837\u0026logoColor=FFFFFF\u0026color=757575\u0026logo=npm\" alt=\"Npm\"/\u003e\n    \u003cimg src=\"https://img.shields.io/static/v1.svg?style=flat\u0026label=NestJS\u0026message=v11.0.13\u0026labelColor=E0234E\u0026logoColor=FFFFFF\u0026color=757575\u0026logo=Nestjs\" alt=\"NestJs\"/\u003e\n    \u003ca href=\"https://github.com/rudemex/nestjs-starter/releases/latest\"\u003e\n        \u003cimg alt=\"Last Release\" src=\"https://img.shields.io/github/v/tag/rudemex/nestjs-starter?label=release\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"./license.md\"\u003e\n        \u003cimg alt=\"GitHub license\" src=\"https://img.shields.io/github/license/rudemex/nestjs-starter?style=flat\"\u003e\n    \u003c/a\u003e\n    \u003cbr\u003e\n    \u003ca href=\"https://github.com/rudemex/nestjs-starter/actions/workflows/master.yml\" target=\"_blank\"\u003e\n        \u003cimg alt=\"GitHub Workflow Status\" src=\"https://github.com/rudemex/nestjs-starter/actions/workflows/master.yml/badge.svg?branch=master\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://app.codecov.io/gh/rudemex/nestjs-starter/\" target=\"_blank\"\u003e\n        \u003cimg alt=\"Codecov\" src=\"https://img.shields.io/codecov/c/github/rudemex/nestjs-starter?logoColor=FFFFFF\u0026logo=Codecov\u0026labelColor=#F01F7A\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://sonarcloud.io/summary/new_code?id=rudemex_nestjs-starter\" target=\"_blank\"\u003e    \n        \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=rudemex_nestjs-starter\u0026metric=alert_status\" alt=\"sonarcloud\"\u003e\n    \u003c/a\u003e    \n    \u003ca href=\"https://snyk.io/test/github/rudemex/nestjs-starter\" target=\"_blank\"\u003e\n        \u003cimg src=\"https://snyk.io/test/github/rudemex/nestjs-starter/badge.svg\" alt=\"Snyk\"\u003e\n    \u003c/a\u003e\n    \u003cbr/\u003e \n\u003c/p\u003e\n\n\u003cp\u003eNestJS es un framework progresivo de Node.js para la creación de aplicaciones eficientes, confiables y escalables del\nlado del servidor, el cual está construido y es completamente compatible con TypeScript y JavaScript, combinando\nelementos de la programación orientada a objetos, programación funcional y programación reactiva funcional.\u003c/p\u003e\n\u003cbr\u003e\n\u003cdiv\u003e\n    \u003ca href=\"https://railway.app/template/BOGqHd?referralCode=mfmi1X\" target=\"_blank\"\u003e\n        \u003cimg src=\"https://railway.app/button.svg\" alt=\"Deploy to Railway\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://www.buymeacoffee.com/rudemex\" target=\"_blank\"\u003e\n        \u003cimg src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\" alt=\"Buy Me A Coffee\" style=\"height: 40px !important;\" \u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n## Glosario\n\n- [🥳 Demo](https://nestjs-starter.tresdoce.com.ar/v1)\n- [🤓 Objetivo](#objective)\n- [📝 Requerimientos básicos](#basic-requirements)\n- [🛠️ Instalar dependencias](#install-dependencies)\n- [⚙️ Configuración](#configurations)\n- [💻 Scripts](#scripts)\n- [📚 Swagger](#swagger-info)\n- [🐳 Docker](#docker)\n- [🧰 Toolkit](https://github.com/tresdoce/tresdoce-nestjs-toolkit)\n- [📤 Commits](#commits)\n- [🏷️ Versionado](#versioning)\n- [📄 Changelog](./CHANGELOG.md)\n- [📜 License MIT](license.md)\n\n---\n\n\u003ca name=\"objective\"\u003e\u003c/a\u003e\n\n## 🤓 Objetivo\n\n### Extensibilidad\nGracias a su arquitectura modular, es flexible y nos permite utilizar las otras bibliotecas existentes en nuestro proyecto.\n\n### Arquitectura \nTiene una arquitectura de proyecto que proporciona capacidad de prueba, escalabilidad y mantenimiento sin mucho esfuerzo.\n\n### Versatilidad\nProporciona un ecosistema adaptable, el cual está desarrollado para crear todo tipo de aplicaciones del lado del servidor.\n\n### Progresividad\nHace uso de las últimas funciones de JavaScript e implementa soluciones maduras y patrones de diseño en el desarrollo de software.\n\n### Transaccionalidad\nOrquestación de servicios. El BFF es responsable de orquestar la llamada a los distintos servicios y manejarlos transaccionalmente de manera transparente para el cliente.\n\n### Performance\nReduce envío de datos. Las API's del BFF se diseñó tomando como base los requerimientos de las pantallas y solo se expondrán los datos que requieran las mismas. Sesión de usuario/caché. Puede manejar caché de sesión para la experiencia del frontend.\n\n### Seguridad\nReduce exposición de datos sensibles. El BFF contiene API's que filtran estos datos y solo se exponen los datos necesarios. Gestión de tokens. El BFF es quien se encarga del almacenamiento y gestiona la renovación del access-token.\n\n\n\u003ca name=\"basic-requirements\"\u003e\u003c/a\u003e\n\n## 📝 Requerimientos básicos\n\n- Node.js v20.19.0 or higher ([Download](https://nodejs.org/es/download/))\n- YARN v1.22.22 or higher\n- NPM v11.2.0 or higher\n- NestJS v11.0.13 or higher ([Documentación](https://nestjs.com/))\n\n\u003ca name=\"install-dependencies\"\u003e\u003c/a\u003e\n\n## 🛠️ Instalar dependencias\n\nCuando tenemos los requisitos básicos, clonamos el repositorio, vamos a la carpeta del proyecto e instalamos sus\ndependencias.\n\n```\nyarn install\n```\n\n```\nnpm install\n```\n\n\u003ca name=\"configurations\"\u003e\u003c/a\u003e\n\n## ⚙️ Configuración\n\nEste starter viene con el archivo **.env.example** y **.env.test**, el cual contiene las configuraciones básicas para\nque funcione la aplicación.\n\nPara el entorno de desarrollo local, es necesario contar con un archivo **.env** del cual se puede utilizar el archivo\nde ejemplo para generarlo.\n\n```sh\n# SERVER\nAPP_STAGE=local\nPORT=8080\nAPI_PREFIX=TD_MY_API\nCONTEXT=v1\nORIGINS=http://localhost:3000,http://localhost:8080\nALLOWED_HEADERS=Content-Type,Authorization,Set-Cookie,Access-Control-Allow-Origin,Cache-Control,Pragma\nALLOWED_METHODS=GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS\nPROPAGATE_HEADERS=x-custom-header\nCORS_ENABLED=true\nCORS_CREDENTIALS=false\n\n# SWAGGER ENVIRONMENTS\nSWAGGER_PATH=docs\nSWAGGER_ENABLED=true\n\n# PARAMS\nTEST_KEY=\"testKeyEnv-dev\"\n\n# SERVICES\nRICK_AND_MORTY_API_URL=https://rickandmortyapi.com/api\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e💬 Para ver en detalle todas las propiedades de la configuración, hace click acá.\u003c/summary\u003e\n\n#### Server\n`APP_STAGE`: Es el entorno en el que está corriendo la aplicación.\n\n- Type: `String`\n- Default: `local`\n- Values: `local | test | snd | dev | qa | homo | prod`\n\n`PORT`: Es el puerto por el cual va a correr el servidor.\n\n- Type: `Number`\n- Default: `8080`\n\n`API_PREFIX`: Es el prefijo que hace referencia a la api, y alimenta otros módulos, como es el de los filter exceptions.\n\n- Type: `String`\n- Default: `TD_MY_API`\n\n`CONTEXT`: Es el contexto el que se puede acceder a la API del servidor, de esta manera no se exponen los endpoints en\nla ruta principal de la aplicación. Se escribe sin el `/` (slash).\n\n- Type: `String`\n- Default: `v1`\n\n`ORIGINS`: Es una whitelist para que la aplicación sólo pueda ser consumida por urls confiables y evitar cualquier tipo\nde solicitudes no deseadas y maliciosas. Debes escribir las urls separadas por una coma.\n\n- Type: `String`\n- Default: `http://localhost:3000,http://localhost:8080`\n\n`ALLOWED_HEADERS`: Parámetros que va a recibir por el header en los request.\n\n- Type: `String`\n- Default: `Content-Type,Authorization,Set-Cookie,Access-Control-Allow-Origin,Cache-Control,Pragma`\n\n`ALLOWED_METHODS`: Métodos http disponibles para el cors.\n\n- Type: `String`\n- Default: `GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS`\n\n`PROPAGATE_HEADERS`: Lista de headers que desea propagar en la respuesta del controller.\n\n- Type: `String`\n- Example: `x-custom-header,x-custom-header-2,x-custom-header-n`\n\n`CORS_ENABLED`: Habilita o deshabilita el uso de CORS en el servidor.\n\n- Type: `Boolean`\n- Default: `false`\n\n`CORS_CREDENTIALS`: Habilita o deshabilita el uso de las credenciales en las peticiones CORS en el servidor.\n\n- Type: `Boolean`\n- Default: `false`\n\n#### Swagger\n\n`SWAGGER_PATH`: Define la ruta de la documentación **Swagger**, se escribe sin el `/` (slash).\n\n- Type: `String`\n- Default: `docs`\n\n`SWAGGER_ENABLED`: Habilitar o deshabilitar la documentación **Swagger** de los endpoints del servidor.\n\n- Type: `Boolean`\n- Default: `true`\n\n#### Params, Services y Otros environments\n\nA modo de ejemplo, se pueden cargar todas las variables de entorno que requieras, es importante seguir con el esquema\nde `key:value` para configurarlas.\n\n```\n# PARAMS\nTEST_KEY=\"testKeyEnv-dev\"\n\n# SERVICES\nRICK_AND_MORTY_API_URL=https://rickandmortyapi.com/api\n```\n\n\u003c/details\u003e\n\nEste proyecto utiliza el módulo `@nestjs/config`, el cual centraliza todas las variables de entorno en un solo lugar y\nte permite consumirlas como **typing** para evitar errores de typo, como asi también evitar usar el **process.env** en\ntodo el proyecto, lo que te permite darle soporte más fácil si se requiere cambiar el **KEY** de la variable de entorno.\n\nTambién cuenta con un validador de variables de entorno, que nos permite validar el tipo de dato, si es requerido o no\ndicha variable, y muchas validaciones más.\n\nTodos estos features los podemos encontrar en la carpeta **./src/config**, en dicha carpeta podemos encontrar el archivo\n**environments.ts** que es un manejador de env files dependiendo el **NODE_ENV** que tenga nuestra aplicación.\n\n\u003ca name=\"scripts\"\u003e\u003c/a\u003e\n\n## 💻 Scripts\n\nInicia la aplicación en modo desarrollo\n\n```\nyarn start:dev\n```\n```\nnpm run start:dev\n```\n\nInicia los test con coverage\n\n```\nyarn test\n```\n```\nnpm run test\n```\n\nRealiza el build de la aplicación\n\n```\nyarn build\n```\n```\nnpm run build\n```\n\nInicia la aplicación en modo productivo\n\n```\nyarn start\n```\n```\nnpm run start\n```\n\n#### Otros scripts\n\nFormatea el código\n\n```\nyarn format\n```\n```\nnpm run format\n```\n\nEslintea el código\n\n```\nyarn lint\n```\n```\nnpm run lint\n```\n\n\u003ca name=\"swagger-info\"\u003e\u003c/a\u003e\n\n## 📚 Swagger\n\nEl proyecto cuenta con un **Swagger** (OpenAPI 3.0.0) que tiene documentado los endpoints con sus\ndefiniciones. [Demo Swagger](https://nestjs-starter.tresdoce.com.ar/v1/docs/)\n\nPara expandir la documentación, es importante aplicar los decoradores correspondientes a la\naplicación. [NestJS OpenApi](https://docs.nestjs.com/openapi/introduction)\n\nEsta documentación puede ser activada o desactivada desde la configuración por medio las variables de entorno del\nproyecto.\n\n```sh\nSWAGGER_PATH=docs\nSWAGGER_ENABLED=true\n```\n\n#### URL\n\nAcceso a la documentación y testeo de los endpoints: `http://localhost:8080/v1/docs`\n\n#### Scheme\n\n```\n\u003chttp|https\u003e://\u003cserver_url\u003e\u003c:port\u003e/\u003capp-context\u003e/\u003cswagger-path\u003e\n```\n\n#### Exportar el swagger en JSON\n\nSe puede exportar la documentación a un **JSON** agregando el sufijo **-json** al path\ndefinido. [Demo Swagger JSON](https://nestjs-starter.tresdoce.com.ar/v1/docs-json)\n\n- Default: `http://localhost:8080/v1/docs-json`\n- Schema: `\u003chttp|https\u003e://\u003cserver_url\u003e\u003c:port\u003e/\u003capp-context\u003e/\u003cswagger-path\u003e-json`\n\n\u003ca name=\"docker\"\u003e\u003c/a\u003e\n\n## 🐳 Docker\n\nEl proyecto cuenta con un `dockerfile` y un `docker-compose.yml` de base, listo para utilizar y expandir sus capacidades.\n\n### Docker Build\n\nSchema: `docker build -t \u003cuser-docker\u003e/\u003capp-name\u003e .`\n\nSchema: `docker run -d -p 8080:8080 --name \u003ccontainer-name\u003e --env-file \u003c.env\u003e \u003cuser-docker\u003e/\u003capp-name\u003e`\n\n### Ejemplo\n\n```\ndocker build -t nestjs-starter .\n```\n```\ndocker run -d -p 8080:8080 --name nestjs-starter-app --env-file .env nestjs-starter\n```\n\n\u003ca name=\"commits\"\u003e\u003c/a\u003e\n\n## 📤 Commits\n\nPara los mensajes de commits se toma como\nreferencia [`conventional commits`](https://www.conventionalcommits.org/en/v1.0.0/#summary).\n\n```\n\u003ctype\u003e[optional scope]: \u003cdescription\u003e\n\n[optional body]\n\n[optional footer]\n```\n\n- **type:** chore, docs, feat, fix, refactor (más comunes)\n- **scope:** indica la página, componente, funcionalidad\n- **description:** comienza en minúsculas y no debe superar los 72 caracteres.\n\n### Ejemplo\n\n```\ngit commit -m \"docs(readme): add documentantion to readme\"\n```\n\n### Breaking change\n\n```\ngit commit -am 'feat!: changes in application'\n```\n\n\u003ca name=\"versioning\"\u003e\u003c/a\u003e\n\n## 🏷️ Versionado\n\nEste starter cuenta con la posibilidad de auto versionarse por medio del workflow de GitHub Actions (`./.github/workflows/release.yml`), \nya que utiliza la dependencia [standard-version](https://github.com/conventional-changelog/standard-version) y los \n`conventional commits` del repositorio. Actualmente, está configurado para incrementar la version en un archivo custom y no en el package.json.\n\nPara poder realizar el versionado correcto en su proyecto, siga estos pasos.\n\n- Asegurarse de que la version del `package.json` este en un valor inicial (`1.0.0`), y los datos de la aplicación ajustados.\n- Correr el siguiente script para borrar cualquier posible tag local o remoto:\n```sh\ngit tag -d $(git tag -l)\ngit fetch\ngit push origin --delete $(git tag -l)\ngit tag -d $(git tag -l)\n\ngit fetch\ngit tag -l | xargs -n 1 git push --delete origin\n```\n- Borrar los archivos `CHANGELOG.md` y `version.txt`\n- Editar el workflow [`release.yml`](./.github/workflows/release.yml) para que el versionado solo se realice si es una aplicación.\n\n## 📄 Changelog\n\nAll notable changes to this project will be documented in [Changelog](./CHANGELOG.md) file.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"mailto:mdelgado@tresdoce.com.ar\" target=\"_blank\" alt=\"Send an email\"\u003e\n        \u003cimg src=\"https://raw.githubusercontent.com/rudemex/nestjs-starter/master/.readme-static/logo-mex-red.svg\" width=\"120\" alt=\"Mex\" /\u003e\n    \u003c/a\u003e\u003cbr/\u003e\n    \u003cp\u003eMade with ❤️\u003c/p\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frudemex%2Fnestjs-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frudemex%2Fnestjs-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frudemex%2Fnestjs-starter/lists"}