---
name: format_duration
kind: function
lang: ts
domain: core
version: "1.0.0"
purity: pure
signature: "formatDuration(ms: number): string"
description: "Formatea una duracion en milisegundos a string humano escalado. Escala: m | h Xm | D Xh | S XD | M XS. NaN, Infinity o negativo retornan \"0m\"."
tags: [format, duration, time, display, utility]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: ms
    desc: "Duracion en milisegundos. Debe ser un numero finito no negativo. NaN, Infinity o negativos producen \"0m\"."
output: "String humano escalado segun magnitud: minutos (Xm), horas+minutos (Xh Ym), dias+horas (XD Yh), semanas+dias (XS YD), meses+semanas (XM YS). Menor de un minuto devuelve \"0m\"."
tested: true
tests:
  - "menos de un minuto retorna 0m"
  - "exactamente 1 hora retorna 1h"
  - "1h 30m retorna 1h 30m"
  - "1 dia sin horas retorna 1D"
  - "2 dias 3 horas retorna 2D 3h"
  - "1 semana sin dias retorna 1S"
  - "2 semanas 3 dias retorna 2S 3D"
  - "1 mes sin semanas retorna 1M"
  - "2 meses 1 semana retorna 2M 1S"
  - "NaN retorna 0m"
  - "negativo retorna 0m"
  - "Infinity retorna 0m"
test_file_path: "frontend/functions/core/format_duration.test.ts"
file_path: "frontend/functions/core/format_duration.ts"
---

## Ejemplo

```typescript
formatDuration(0)             // "0m"
formatDuration(30_000)        // "0m"   (30s < 1min)
formatDuration(90_000)        // "1m"
formatDuration(3_600_000)     // "1h"
formatDuration(5_400_000)     // "1h 30m"
formatDuration(86_400_000)    // "1D"
formatDuration(97_200_000)    // "1D 3h"
formatDuration(604_800_000)   // "1S"
formatDuration(2_592_000_000) // "1M"
formatDuration(NaN)           // "0m"
formatDuration(-1)            // "0m"
```

## Notas

Extraida de `apps/kanban/frontend/src/components/format.ts` lineas 9-30.
Funcion pura sin dependencias externas. Usa constantes locales privadas (MIN, HOUR, DAY, WEEK, MONTH).
Escala en ingles/abreviada: m=minutos, h=horas, D=dias, S=semanas, M=meses.
