<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Edgar Joaquin</title>
    <description>The latest articles on DEV Community by Edgar Joaquin (@edg_joa).</description>
    <link>https://dev.to/edg_joa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1408865%2F6576034a-33d5-45f6-b8fb-803d22e9b1de.png</url>
      <title>DEV Community: Edgar Joaquin</title>
      <link>https://dev.to/edg_joa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edg_joa"/>
    <language>en</language>
    <item>
      <title>Clean Architecture en Frontend (React / Next.js + TypeScript)</title>
      <dc:creator>Edgar Joaquin</dc:creator>
      <pubDate>Thu, 17 Sep 2026 18:20:54 +0000</pubDate>
      <link>https://dev.to/edg_joa/clean-architecture-en-frontend-react-nextjs-typescript-518p</link>
      <guid>https://dev.to/edg_joa/clean-architecture-en-frontend-react-nextjs-typescript-518p</guid>
      <description>&lt;p&gt;&lt;strong&gt;Clean Architecture en Frontend (React / Next.js + TypeScript)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Guía práctica con la estructura de carpetas/archivos que suele usarse al aplicar Clean Architecture en un frontend. La idea central es separar el código en capas con responsabilidades claras, donde las capas internas (dominio) no dependen de las externas (UI, frameworks, APIs).&lt;/p&gt;

&lt;p&gt;Las capas, de adentro hacia afuera&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Domain (Entidades) — Reglas de negocio puras. No depende de nada externo (ni de React, ni de Axios, ni de Next).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Application (Casos de uso) — Orquesta la lógica de negocio usando el dominio. Define interfaces (contratos) que la infraestructura implementará.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Infrastructure (Adaptadores) — Implementaciones concretas: llamadas HTTP, localStorage, SDKs de terceros, repositorios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Presentation (UI) — Componentes, páginas, hooks, estado de UI. Depende de application, nunca al revés.&lt;br&gt;
La regla de oro: las dependencias siempre apuntan hacia adentro (presentation → application → domain), nunca al revés.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo 1: React (Vite) + TypeScript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── domain/
│   ├── entities/
│   │   ├── User.ts
│   │   ├── Product.ts
│   │   └── Order.ts
│   ├── value-objects/
│   │   ├── Email.ts
│   │   └── Money.ts
│   ├── errors/
│   │   └── DomainError.ts
│   └── repositories/                 # Interfaces (contratos), no implementación
│       ├── IUserRepository.ts
│       └── IProductRepository.ts
│
├── application/
│   ├── use-cases/
│   │   ├── user/
│   │   │   ├── GetUserById.ts
│   │   │   ├── UpdateUserProfile.ts
│   │   │   └── DeleteUser.ts
│   │   └── product/
│   │       ├── GetProductList.ts
│   │       └── CreateProduct.ts
│   ├── dtos/
│   │   ├── UserDTO.ts
│   │   └── ProductDTO.ts
│   └── mappers/
│       ├── UserMapper.ts             # Entity &amp;lt;-&amp;gt; DTO
│       └── ProductMapper.ts
│
├── infrastructure/
│   ├── http/
│   │   ├── axiosClient.ts
│   │   └── endpoints.ts
│   ├── repositories/                 # Implementan las interfaces del domain
│   │   ├── HttpUserRepository.ts
│   │   └── HttpProductRepository.ts
│   ├── storage/
│   │   └── LocalStorageService.ts
│   └── config/
│       └── env.ts
│
├── presentation/
│   ├── components/
│   │   ├── common/
│   │   │   ├── Button.tsx
│   │   │   └── Input.tsx
│   │   └── user/
│   │       ├── UserCard.tsx
│   │       └── UserForm.tsx
│   ├── pages/
│   │   ├── UserProfilePage.tsx
│   │   └── ProductListPage.tsx
│   ├── hooks/
│   │   ├── useUser.ts                # Consume los use-cases
│   │   └── useProducts.ts
│   ├── context/
│   │   └── AuthContext.tsx
│   ├── routes/
│   │   └── AppRouter.tsx
│   └── styles/
│       └── globals.css
│
├── shared/
│   ├── utils/
│   │   ├── formatDate.ts
│   │   └── validators.ts
│   ├── constants/
│   │   └── index.ts
│   └── types/
│       └── common.types.ts
│
├── di/                                # Inyección de dependencias (composition root)
│   └── container.ts
│
├── App.tsx
└── main.tsx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cómo fluye una petición (ejemplo: obtener un usuario)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UserProfilePage.tsx
  → useUser.ts (hook)
    → GetUserById.ts (use-case, application)
      → IUserRepository.ts (interfaz, domain)
        ← HttpUserRepository.ts (implementación real, infrastructure)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El hook y la página no saben si el dato viene de una API REST, GraphQL o localStorage. Eso vive solo en infrastructure/.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo 2: Next.js (App Router) + TypeScript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next.js añade la carpeta app/ como capa de ruteo/presentación, pero el resto de capas se mantienen igual, normalmente dentro de src/.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── app/                               # Solo ruteo, layouts y páginas (Next App Router)
│   ├── layout.tsx
│   ├── page.tsx
│   ├── users/
│   │   ├── page.tsx
│   │   └── [id]/
│   │       └── page.tsx
│   ├── products/
│   │   ├── page.tsx
│   │   └── loading.tsx
│   └── api/                           # Route handlers (si se usan como BFF)
│       └── users/
│           └── route.ts
│
├── domain/
│   ├── entities/
│   │   ├── User.ts
│   │   └── Product.ts
│   ├── value-objects/
│   │   └── Email.ts
│   ├── errors/
│   │   └── DomainError.ts
│   └── repositories/
│       ├── IUserRepository.ts
│       └── IProductRepository.ts
│
├── application/
│   ├── use-cases/
│   │   ├── user/
│   │   │   └── GetUserById.ts
│   │   └── product/
│   │       └── GetProductList.ts
│   ├── dtos/
│   │   └── UserDTO.ts
│   └── mappers/
│       └── UserMapper.ts
│
├── infrastructure/
│   ├── http/
│   │   └── fetchClient.ts
│   ├── repositories/
│   │   ├── HttpUserRepository.ts
│   │   └── HttpProductRepository.ts
│   ├── server/                        # Repos que corren en Server Components/Actions
│   │   └── ServerUserRepository.ts
│   └── config/
│       └── env.ts
│
├── presentation/
│   ├── components/
│   │   ├── common/
│   │   │   └── Button.tsx
│   │   └── user/
│   │       └── UserCard.tsx
│   ├── hooks/
│   │   └── useUser.ts                 # Para Client Components
│   └── view-models/
│       └── UserViewModel.ts           # Formatea DTOs para la vista
│
├── shared/
│   ├── utils/
│   │   └── formatDate.ts
│   └── types/
│       └── common.types.ts
│
├── di/
│   └── container.ts
│
└── middleware.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Diferencias clave respecto a React puro&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;app/page.tsx (Server Component) puede llamar directamente a un use-case desde application/, sin pasar por un hook, ya que corre en el servidor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Los Client Components siguen usando hooks de presentation/hooks/ para invocar use-cases (a través de una API route o Server Action).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;infrastructure/server/ separa repositorios que solo pueden ejecutarse en servidor (con acceso directo a BD, secretos, etc.) de los que corren en cliente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Reglas prácticas para no romper la arquitectura&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;domain/ nunca importa nada de application/, infrastructure/ o presentation/.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;application/ solo importa de domain/ (entidades e interfaces), nunca de infrastructure/ directamente — recibe las implementaciones por inyección de dependencias.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;infrastructure/ implementa las interfaces definidas en domain/repositories/.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;presentation/ (componentes, páginas, hooks) solo llama a application/use-cases, nunca a infrastructure/ directamente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El "cableado" (qué implementación concreta se usa en cada caso) se centraliza en di/container.ts.&lt;/p&gt;

&lt;p&gt;Ejemplo mínimo de código (para ver las capas en acción)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// domain/repositories/IUserRepository.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IUserRepository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;getById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// application/use-cases/user/GetUserById.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GetUserById&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;userRepository&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IUserRepository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// infrastructure/repositories/HttpUserRepository.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HttpUserRepository&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IUserRepository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// presentation/hooks/useUser.ts&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUserById&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GetUserById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HttpUserRepository&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getUserById&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto puedes, por ejemplo, cambiar HttpUserRepository por FakeUserRepository en tus tests sin tocar ni el use-case ni el componente.&lt;/p&gt;

&lt;p&gt;La diferencia principal en Next.js es que app/ queda como capa de ruteo pura, y aparece una carpeta infrastructure/server/ para separar los repositorios que solo pueden correr en el servidor (Server Components, Server Actions) de los que se usan desde el cliente.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>frontend</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>Arquitectura limpia en proyecto de Nodejs + Typescript + MongoDB</title>
      <dc:creator>Edgar Joaquin</dc:creator>
      <pubDate>Fri, 05 Apr 2024 20:55:51 +0000</pubDate>
      <link>https://dev.to/edg_joa/arquitectura-limpia-en-proyecto-de-nodejs-typescript-mongodb-22i3</link>
      <guid>https://dev.to/edg_joa/arquitectura-limpia-en-proyecto-de-nodejs-typescript-mongodb-22i3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Estructura&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;├── api&lt;br&gt;
│   ├─── controllers&lt;br&gt;
│   │   ├─── usuarios.controller.ts&lt;br&gt;
│   │   ├─── publicaciones.controller.ts&lt;br&gt;
│   │   ├─── seguidores.controller.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── middlewares&lt;br&gt;
│   │   ├─── auth.middleware.ts&lt;br&gt;
│   │   ├─── error.middleware.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── routes&lt;br&gt;
│   │   ├─── usuarios.routes.ts&lt;br&gt;
│   │   ├─── publicaciones.routes.ts&lt;br&gt;
│   │   ├─── seguidores.routes.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── services&lt;br&gt;
│   │   ├─── usuarios.service.ts&lt;br&gt;
│   │   ├─── publicaciones.service.ts&lt;br&gt;
│   │   ├─── seguidores.service.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── utils&lt;br&gt;
│   │   ├─── utils.ts&lt;br&gt;
│   ├─── index.ts&lt;br&gt;
├── application&lt;br&gt;
│   ├─── config&lt;br&gt;
│   │   ├─── app.config.ts&lt;br&gt;
│   │   ├─── database.config.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── models&lt;br&gt;
│   │   ├─── usuario.model.ts&lt;br&gt;
│   │   ├─── publicacion.model.ts&lt;br&gt;
│   │   ├─── seguidor.model.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── repositories&lt;br&gt;
│   │   ├─── usuarios.repository.ts&lt;br&gt;
│   │   ├─── publicaciones.repository.ts&lt;br&gt;
│   │   ├─── seguidores.repository.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── services&lt;br&gt;
│   │   ├─── usuarios.service.ts&lt;br&gt;
│   │   ├─── publicaciones.service.ts&lt;br&gt;
│   │   ├─── seguidores.service.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── utils&lt;br&gt;
│   │   ├─── utils.ts&lt;br&gt;
│   ├─── index.ts&lt;br&gt;
├── domain&lt;br&gt;
│   ├─── entities&lt;br&gt;
│   │   ├─── usuario.entity.ts&lt;br&gt;
│   │   ├─── publicacion.entity.ts&lt;br&gt;
│   │   ├─── seguidor.entity.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── useCases&lt;br&gt;
│   │   ├─── usuarios.usecase.ts&lt;br&gt;
│   │   ├─── publicaciones.usecase.ts&lt;br&gt;
│   │   ├─── seguidores.usecase.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── index.ts&lt;br&gt;
├── infrastructure&lt;br&gt;
│   ├─── adapters&lt;br&gt;
│   │   ├─── database.adapter.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── database&lt;br&gt;
│   │   ├─── index.ts&lt;br&gt;
│   ├─── repositories&lt;br&gt;
│   │   ├─── usuarios.repository.ts&lt;br&gt;
│   │   ├─── publicaciones.repository.ts&lt;br&gt;
│   │   ├─── seguidores.repository.ts&lt;br&gt;
│   │   ├─── ...&lt;br&gt;
│   ├─── utils&lt;br&gt;
│   │   ├─── utils.ts&lt;br&gt;
│   ├─── index.ts&lt;br&gt;
├── index.ts&lt;br&gt;
├── package.json&lt;br&gt;
├── tsconfig.json&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicación:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;api&lt;/em&gt;: Contiene los controladores, middlewares y rutas de la API.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;application&lt;/em&gt;: Contiene la configuración de la aplicación, &lt;/p&gt;

&lt;p&gt;&lt;em&gt;modelos&lt;/em&gt;, repositorios, servicios y utilidades.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;domain&lt;/em&gt;: Contiene las entidades y casos de uso del dominio de la aplicación.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;infrastructure&lt;/em&gt;: Contiene los adaptadores, la base de datos y los repositorios de la infraestructura.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;index.ts&lt;/em&gt;: Archivo principal que inicia la aplicación.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;package.json&lt;/em&gt;: Contiene las dependencias del proyecto.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;tsconfig.json&lt;/em&gt;: Contiene la configuración del compilador TypeScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consideraciones&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esta es una estructura de archivos básica, puede modificarse según las necesidades específicas del proyecto.&lt;/p&gt;

&lt;p&gt;Se recomienda usar un contenedor de dependencias para inyectar las dependencias en las diferentes clases.&lt;/p&gt;

&lt;p&gt;Se pueden usar herramientas como NestJS para facilitar la implementación de Clean Architecture.&lt;/p&gt;

</description>
      <category>node</category>
      <category>typescript</category>
      <category>mongodb</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
