Prompts de código: una tarea lista para cada lenguaje

Dieciséis encargos listos para el generador de código con IA. Cada uno fija en qué lenguaje y versión escribir, si entra un framework y con qué rigor tratar los errores: cambia los nombres de tus campos y aplica.

Funciones y utilidades

Lo pequeño que se reescribe en cada proyecto: validar un campo de formulario, generar el slug de una URL a partir del titular, dar formato a un importe y contar los días hábiles entre dos fechas con festivos.

Slug de URL desde el titular

Convierte el título de un artículo en una dirección limpia: minúsculas, guiones y nada que escapar.

Prompt

Escribe una función de JavaScript que convierta el titular de un artículo en un slug de URL: minúsculas, los espacios pasan a guiones, las tildes y la ñ se normalizan, la puntuación se elimina y nunca queda un guion en los extremos. Sin dependencias.

Resultado

export function slugify(title) { // la normalización parte la letra acentuada en dos y la tilde se descarta — en la URL solo quedaría basura %C3 const base = title.normalize("NFKD").replace(/[\u0300-\u036f]/g, "").toLowerCase() return base.replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")}

Formatear un importe

Separador de miles, dos decimales y la moneda, con el redondeo hecho antes de formatear.

Prompt

Escribe una función de Python que muestre un Decimal como importe en formato español: 1234.5 pasa a 1.234,50 EUR. Redondea a céntimos antes y nunca sobre un float, y deja pasar otro código de moneda.

Resultado

def format_money(amount: Decimal, currency: str = "EUR") -> str: # cuantizar a céntimos ANTES de formatear: sobre un float se pierde el último céntimo value = amount.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP) return locale.format_string("%.2f", value, grouping=True) + " " + currency

Validar un campo del formulario

Una expresión regular para el correo y el teléfono, más la comprobación de una línea que la usa.

Prompt

Escribe expresiones regulares que validen un correo electrónico y un teléfono español en el formulario de registro, con una función de comprobación corta para cada una. Explícame qué hace cada parte del patrón para poder ajustarlo.

Resultado

const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[a-z]+$/i// en el navegador solo comprobamos la forma — si la dirección existe lo dirá el correo de confirmaciónexport const isEmail = (value) => EMAIL_RE.test(value.trim().toLowerCase())

Días hábiles entre dos fechas

Fines de semana y festivos descontados, y una excepción si las fechas llegan al revés.

Prompt

Escribe una función de PHP 8.3 que cuente los días hábiles entre dos fechas: salta sábados, domingos y cualquier fecha del array de festivos. Lanza una excepción si la fecha final es anterior a la inicial.

Resultado

function workingDays(DateTimeImmutable $from, DateTimeImmutable $to, array $holidays = []): int{ $period = new DatePeriod($from, new DateInterval("P1D"), $to); $isWork = fn (DateTimeImmutable $d) => (int) $d->format("N") < 6 && !in_array($d->format("Y-m-d"), $holidays, true); return count(array_filter(iterator_to_array($period), $isWork));}

Datos y API

La conversación con el servicio ajeno y con tu propia base: consumir una API REST con reintentos y timeout, importar un CSV sucio sin romper nada, escribir la consulta de un informe y paginar la salida.

Llamada a una API con reintentos

Timeout, reintento en 5xx y un final duro: que un servicio lento no cuelgue toda la petición.

Prompt

Escribe una función de TypeScript que llame a una API HTTP con cuatro segundos de timeout y tres intentos como máximo. Reintenta solo en 5xx y errores de red, nunca en 4xx, espera entre intentos y lanza un error tipado cuando se agoten.

Resultado

export async function fetchWithRetry(url: string, tries = 3): Promise<Response> { const res = await fetch(url, { signal: AbortSignal.timeout(4000) }) if (res.ok || res.status < 500 || tries === 1) return res await new Promise((r) => setTimeout(r, 400)) return fetchWithRetry(url, tries - 1)}

Importar un CSV sucio

Lee la tarifa de un proveedor y aparta las filas rotas en su propio fichero en vez de fallar.

Prompt

Escribe un script de Python con pandas que importe la tarifa de un proveedor desde CSV: separador punto y coma, decimales con coma, los precios llegan como texto y en algunas filas faltan. Manda las filas malas a rejected.csv y quita duplicados por order_id.

Resultado

orders = pd.read_csv("orders.csv", sep=";", decimal=",", on_bad_lines="warn")orders["total"] = pd.to_numeric(orders["total"], errors="coerce")bad = orders["total"].isna()orders.loc[bad].to_csv("rejected.csv", index=False)clean = orders.loc[~bad].drop_duplicates(subset="order_id")

Una consulta de informe

Ingresos por cliente y por mes, escrita contra el esquema que pegues en el campo de datos.

Prompt

Escribe una consulta de PostgreSQL para el esquema de arriba: ingresos por cliente y por mes del último año, de mayor a menor, sin los clientes que nunca pidieron nada.

Resultado

SELECT c.name, date_trunc('month', o.created_at) AS month, sum(o.total) AS revenueFROM orders oJOIN customers c ON c.id = o.customer_idWHERE o.created_at >= now() - interval '1 year'GROUP BY 1, 2ORDER BY revenue DESC

Salida paginada

Paginación por cursor: la que no repite filas cuando entran nuevas mientras se desplaza la lista.

Prompt

Escribe una función de TypeScript con Prisma que devuelva una página de posts publicados con paginación por cursor: veinte cada vez, los más nuevos arriba, y un nextCursor que el cliente devuelve para la página siguiente.

Resultado

const page = await prisma.post.findMany({ where: { published: true }, orderBy: { createdAt: "desc" }, cursor: cursorId ? { id: cursorId } : undefined, take: 20,})

Interfaz

Las partes de la pantalla que en realidad son código: un hook de React propio, una rejilla de tarjetas responsive que aguanta en el móvil y una pantalla con lista dentro de una app.

Un hook de React

Retiene lo que se escribe en el buscador para no repetir la consulta en cada tecla.

Prompt

Escribe un hook de React tipado que retrase un valor 300 ms y limpie su temporizador al desmontar, más dos líneas de ejemplo de cómo lo usa un campo de búsqueda.

Resultado

export function useDebounced(value: string, delay = 300) { const [out, setOut] = useState(value) useEffect(() => { const id = setTimeout(() => setOut(value), delay) return () => clearTimeout(id) }, [value, delay]) return out}

Rejilla de tarjetas flexible

Las tarjetas del catálogo pasan de cuatro columnas a una sin una sola media query.

Prompt

Escribe el CSS de una rejilla de tarjetas de catálogo: tarjetas de 260px mínimo, la fila se llena entera, 16px de separación, sin media queries. Nombres de clase con BEM.

Resultado

.catalog__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px;}

Pantalla con lista

Una lista de pedidos que se desplaza en Jetpack Compose, con toque en la fila y estado vacío.

Prompt

Escribe una pantalla en Jetpack Compose con una lista de pedidos desplazable: cada fila muestra número, fecha e importe, al tocarla se abre el pedido y con la lista vacía aparece un aviso.

Resultado

@Composablefun OrderList(orders: List<Order>) { LazyColumn { items(orders) { order -> OrderRow(order, onClick = { openOrder(order.id) }) } }}

Scripts y automatización

Código que trabaja sin ti: un script de copia de seguridad de la base cada noche, una utilidad de consola de un solo uso y una tarea programada con cron que se despierta sola.

Copia nocturna de la base

Hace el volcado, nombra el fichero por fecha y borra todo lo que pase del mes.

Prompt

Escribe un script de Bash que vuelque una base PostgreSQL en /backup con la fecha en el nombre del fichero, borre los volcados de más de 30 días y pare al primer error. Sin avisos de ShellCheck.

Resultado

#!/usr/bin/env bashset -euo pipefailstamp=$(date +%F)pg_dump --format=custom "$DATABASE_URL" > "/backup/db-$stamp.dump"find /backup -name "db-*.dump" -mtime +30 -delete

Una utilidad de consola

Herramienta de un solo uso: recorre una carpeta y renombra sus ficheros por regla.

Prompt

Escribe una utilidad de línea de comandos en Go que recorra una carpeta y renombre las fotos por su fecha de captura. La carpeta llega como flag, sin --apply solo muestra qué cambiaría, y usa solo la biblioteca estándar.

Resultado

func main() { dir := flag.String("dir", ".", "carpeta con las fotos") flag.Parse() if err := filepath.WalkDir(*dir, renameByShootDate); err != nil { log.Fatal(err) }}

Una tarea programada

Se despierta a las siete entre semana, saca las cifras de ayer y las manda por correo.

Prompt

Escribe una tarea de Node.js que a las 07:00 de lunes a viernes saque las ventas de ayer de PostgreSQL, las convierta en una tabla HTML y la envíe por correo al equipo comercial. Registra los fallos y no tires el proceso.

Resultado

// las siete entre semana: las cifras tienen que estar antes de la reunión diariacron.schedule("0 7 * * 1-5", async () => { const rows = await db.query(DAILY_SALES_SQL) await mailer.send({ to: "ventas@tienda.es", subject: "Ventas de ayer", html: render(rows) })})

Tests

Cubrir con tests unitarios el código que ya existe: una función con sus casos límite y un endpoint probado también cuando la entrada llega mal o directamente no llega nunca.

Tests para una función

pytest con casos parametrizados: cero, un importe negativo y None.

Prompt

Escribe tests de pytest para una función format_money(amount, currency): cero, un importe grande, uno negativo, dos decimales y un TypeError cuando entra None. Con parametrize.

Resultado

@pytest.mark.parametrize("amount,expected", [("0", "0,00"), ("1234.5", "1.234,50")])def test_format_money(amount, expected): assert format_money(Decimal(amount)) == expecteddef test_format_money_rejects_none(): with pytest.raises(TypeError): format_money(None)

Tests para un endpoint

Tests de JUnit para GET y POST, con el 404 y el error de validación incluidos.

Prompt

Escribe tests de JUnit 5 para el endpoint REST /api/orders: 200 con cuerpo para un pedido existente, 404 con un id desconocido, 400 con un payload malformado. Comprueba los campos del JSON, no solo el estado.

Resultado

@Testvoid returnsNotFoundForUnknownOrder() throws Exception { mockMvc.perform(get("/api/orders/0")) .andExpect(status().isNotFound()) .andExpect(jsonPath("$.error").value("order_not_found"));}

Prompts para el generador de código: 16 tareas listas