// Cliente API moderno con fetch nativo (Vanilla JS) (function(global){ 'use strict'; // Helper para construir query string desde objeto function buildQueryString(params) { if (!params || Object.keys(params).length === 0) return ''; const query = Object.keys(params) .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k])) .join('&'); return '?' + query; } // Helper para manejar respuestas fetch async function handleResponse(response) { // Redirección automática al login en 401 if (response.status === 401) { if (location.pathname.indexOf('login.php') === -1) { window.location.href = '/login.php'; } throw new Error('No autorizado'); } // Parsear JSON o texto según content-type const contentType = response.headers.get('content-type'); let data; if (contentType && contentType.includes('application/json')) { try { data = await response.json(); } catch (err) { const error = new Error('La API devolvió JSON inválido'); error.response = response; throw error; } } else { const text = await response.text(); data = text; if (!response.ok || /^\s*