---
name: generate_service_worker
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "def generate_service_worker(cache_name: str = 'app-cache-v1', precache_urls: list[str] | None = None, network_first_patterns: list[str] | None = None) -> str"
description: "Genera el codigo JavaScript de un Service Worker basico para PWAs con estrategia cache-first para assets estaticos y network-first para API calls."
tags: [pwa, service-worker, javascript, cache, offline, codegen]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: cache_name
    desc: "Nombre del cache para esta version del SW. Se usa como clave para identificar el cache activo y limpiar los anteriores en activate."
  - name: precache_urls
    desc: "Lista de URLs a pre-cachear durante el evento install. Por defecto: ['/', '/index.html']."
  - name: network_first_patterns
    desc: "Lista de patrones de URL (substrings) que usan estrategia network-first. Por defecto: ['/api/']. Cualquier URL que contenga alguno de estos patrones va a red primero."
output: "String con codigo JavaScript valido del Service Worker listo para escribir como sw.js. Incluye handlers de install (precacheo), activate (limpieza de caches antiguos) y fetch (cache-first / network-first segun patron)."
tested: true
tests:
  - "SW por defecto contiene install/activate/fetch handlers"
  - "Custom precache_urls aparecen en el codigo"
  - "Custom network_first_patterns aparecen en el fetch handler"
  - "El cache_name personalizado aparece en el codigo generado"
  - "Los valores por defecto se usan cuando los parametros son None"
  - "La funcion retorna un string no vacio"
  - "El evento activate limpia caches antiguos"
  - "La estrategia cache-first guarda respuestas de red en cache"
test_file_path: "python/functions/core/generate_service_worker_test.py"
file_path: "python/functions/core/generate_service_worker.py"
---

## Ejemplo

```python
sw_code = generate_service_worker(
    cache_name="voice-guide-v1",
    precache_urls=["/", "/index.html", "/manifest.json"],
    network_first_patterns=["/api/"],
)
# Escribir al filesystem (operacion impura, fuera de esta funcion):
# with open("public/sw.js", "w") as f:
#     f.write(sw_code)
```

## Notas

Funcion pura: no hace I/O, no tiene efectos secundarios, retorna siempre el mismo string dado los mismos inputs.

El codigo JS generado usa `self.skipWaiting()` en install y `self.clients.claim()` en activate para activacion inmediata del SW sin necesidad de refrescar la pagina.

La estrategia de fetch:
- **Network-first** (para `/api/` por defecto): intenta la red, guarda la respuesta exitosa en cache, y usa el cache como fallback si la red falla. Garantiza datos frescos cuando hay conexion.
- **Cache-first** (para todo lo demas): sirve desde cache si existe, si no va a red y guarda en cache. Optimo para assets estaticos (JS, CSS, imagenes) que cambian con el nombre de version.

Para invalidar el cache al desplegar una nueva version, basta con cambiar `cache_name` (ej: `app-cache-v2`). El evento activate limpia automaticamente cualquier cache con nombre distinto al actual.
