# DV-003: Configuración Proyecto Angular 21

**Proyecto:** Sistema de Registro de Estudiantes
**Fecha:** 2026-01-07

---

## 1. Crear Proyecto

```bash
cd src/frontend

# Crear proyecto Angular 21
ng new student-enrollment \
  --standalone \
  --style=scss \
  --routing \
  --ssr=false

cd student-enrollment
```

---

## 2. Instalar Dependencias

```bash
# Angular Material
ng add @angular/material

# Apollo GraphQL
npm install apollo-angular @apollo/client graphql

# GraphQL Code Generator
npm install -D @graphql-codegen/cli \
  @graphql-codegen/typescript \
  @graphql-codegen/typescript-operations \
  @graphql-codegen/typescript-apollo-angular
```

---

## 3. Estructura de Carpetas

```bash
# Crear estructura
mkdir -p src/app/core/{services,graphql/{queries,mutations},interceptors}
mkdir -p src/app/shared/{components,pipes,directives}
mkdir -p src/app/features/{students,enrollment,classmates}/{pages,components}
```

---

## 4. Configuración Apollo (app.config.ts)

```typescript
import { ApplicationConfig } from '@angular/core';
import { provideRouter } from '@angular/router';
import { provideHttpClient } from '@angular/common/http';
import { provideApollo } from 'apollo-angular';
import { HttpLink } from 'apollo-angular/http';
import { InMemoryCache } from '@apollo/client/core';
import { inject } from '@angular/core';
import { routes } from './app.routes';
import { environment } from '../environments/environment';

export const appConfig: ApplicationConfig = {
  providers: [
    provideRouter(routes),
    provideHttpClient(),
    provideApollo(() => {
      const httpLink = inject(HttpLink);
      return {
        link: httpLink.create({ uri: environment.graphqlUrl }),
        cache: new InMemoryCache(),
      };
    }),
  ],
};
```

---

## 5. Environment Files

```typescript
// environments/environment.ts
export const environment = {
  production: false,
  graphqlUrl: 'https://localhost:5001/graphql',
};

// environments/environment.prod.ts
export const environment = {
  production: true,
  graphqlUrl: '/graphql',
};
```

---

## 6. GraphQL Codegen (codegen.ts)

```typescript
import type { CodegenConfig } from '@graphql-codegen/cli';

const config: CodegenConfig = {
  schema: 'https://localhost:5001/graphql',
  documents: 'src/app/core/graphql/**/*.graphql',
  generates: {
    'src/app/core/graphql/generated/types.ts': {
      plugins: [
        'typescript',
        'typescript-operations',
        'typescript-apollo-angular',
      ],
    },
  },
};

export default config;
```

```json
// package.json scripts
{
  "scripts": {
    "codegen": "graphql-codegen --config codegen.ts"
  }
}
```

---

## 7. Path Aliases (tsconfig.json)

```json
{
  "compilerOptions": {
    "paths": {
      "@core/*": ["src/app/core/*"],
      "@shared/*": ["src/app/shared/*"],
      "@features/*": ["src/app/features/*"],
      "@env/*": ["src/environments/*"]
    }
  }
}
```

---

## 8. Comandos de Desarrollo

```bash
# Desarrollo
ng serve

# Build producción
ng build --configuration production

# Generar tipos GraphQL
npm run codegen

# Lint
ng lint

# Tests
ng test
ng test --watch=false --code-coverage

# Generar componente standalone
ng g c features/students/pages/student-list --standalone
```
