Skip to content

v2.10 SQL Formatter: formateo, minificado y resaltado de SQL básico (106/106 tests) - #11

Merged
luisfemojica merged 1 commit into
mainfrom
v2.10-sql
Jul 1, 2026
Merged

luisfemojica merged 1 commit into
mainfrom
v2.10-sql

Conversation

@luisfemojica

Copy link
Copy Markdown
Owner

Resumen

Petición directa del mantenedor: opción para formatear SQL. Evaluada con el Test de 4 Preguntas (3/4, con alcance acotado) e implementada como formateador básico — explícitamente NO un parser SQL completo (eso serían miles de líneas, tipo sql-formatter).

🗄️ Formateo SQL

formatSQL() sobre un tokenizer propio que respeta strings ('O''Brien'), identificadores citados ("" `` []) y comentarios (--, /* */):

  • Saltos de línea por cláusula: SELECT / FROM / WHERE / GROUP / HAVING / ORDER / LIMIT / UNION / VALUES / SET...
  • JOINs en línea propia (LEFT JOIN), ON / AND / OR / WHEN con sangría extra
  • Subconsultas indentadas por profundidad de paréntesis
  • BETWEEN x AND y no se rompe (caso especial)
  • Funciones pegadas al paréntesis (COUNT(id)), cláusulas con espacio (IN (1, 2))
  • Un ítem del SELECT por línea; comas dentro de paréntesis quedan inline
  • Opción "Mayúsculas (SQL)" para keywords, persistida en Recordar config y presets de URL

Ejemplo real verificado en la UI:

SELECT u.id,
  u.nombre,
  COUNT(p.id) AS pedidos
FROM usuarios u
LEFT JOIN pedidos p
  ON p.usuario_id = u.id
WHERE u.activo = 1
  AND u.fecha_alta BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY u.id,
  u.nombre
HAVING COUNT(p.id) > 5
ORDER BY pedidos DESC
LIMIT 10

📦 Minificado SQL

Una línea con espacios mínimos. Detalle importante: los comentarios -- se convierten a /* */ (en una sola línea comentarían todo lo que sigue). La opción "Quitar comentarios" existente también aplica.

🎨 Resaltado SQL

Keywords .tag, strings .value, números .attr, comentarios .comment — reutiliza los colores de los 5 temas sin una línea de CSS nueva.

🔌 Integración

  • Detección automática por sentencia inicial (SELECT/INSERT/CREATE/WITH/MERGE...) — orden: JSON → SQL → XML
  • Validación en vivo ligera y honesta: balance de paréntesis y comillas ("✓ SQL (paréntesis y comillas balanceados)") — validar SQL de verdad requiere un parser completo que queda fuera de alcance
  • Descarga con extensión .sql y MIME correcto
  • Avisos claros donde SQL no aplica: conversión XML⇄JSON, CSV y vista de árbol

⚠️ Cierre de presupuesto v2.x

Con v2.10 el archivo queda en ~2474 líneas / ~97KB — al filo de los límites (~2500 / 100KB duro). La línea v2.x pasa a modo solo-bugfixes; cualquier feature nueva requiere decisión explícita del mantenedor sobre los límites. Documentado en ROADMAP.md, SCOPE.md y CLAUDE.md.

Tests

14 nuevos: 7 de formatSQL (cláusulas, subconsultas, mayúsculas opcionales, strings con keywords dentro, BETWEEN, comentarios, funciones vs cláusulas), 2 de minifySQL, 1 de highlightSQL, 1 de detección isSQL, y 3 de UI (formatear con resaltado + validación viva, paréntesis desbalanceados, minificar). 106/106 pasando.

🤖 Generated with Claude Code

Evaluado con el Test de 4 Preguntas (3/4): formateador básico acotado,
NO un parser SQL completo (eso serían miles de líneas).

- formatSQL(): tokenizer propio (strings con '' escapada, identificadores
  citados, comentarios -- y /* */) + saltos por cláusula
  (SELECT/FROM/WHERE/JOIN/GROUP/ORDER/UNION...), sangría por profundidad
  de paréntesis (subconsultas), AND/OR/ON con sangría extra,
  BETWEEN x AND y sin romper, funciones pegadas al paréntesis (COUNT(id))
  y cláusulas con espacio (IN (1, 2)). Opción 'Mayúsculas (SQL)'
  persistida en prefs y presets de URL.
- minifySQL(): una línea; los comentarios -- pasan a /* */ (en una línea
  comentarían todo lo que sigue); 'Quitar comentarios' también aplica.
- highlightSQL(): keywords/strings/números/comentarios con las clases de
  color existentes — 5 temas sin CSS nuevo.
- Integración: detección por sentencia inicial, validación en vivo ligera
  (balance de paréntesis y comillas), descarga .sql, avisos claros en
  conversiones que no aplican (XML⇄JSON, CSV, árbol).

⚠️ Presupuesto v2.x agotado: ~2474 líneas / ~97KB (límites ~2500/100KB).
La línea v2.x pasa a modo solo-bugfixes; documentado en ROADMAP, SCOPE y
CLAUDE.md.

Tests: 14 nuevos — 106/106 pasando.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@luisfemojica
luisfemojica merged commit f518218 into main Jul 1, 2026
1 check passed
@luisfemojica
luisfemojica deleted the v2.10-sql branch July 1, 2026 20:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant