Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ on:
push:
branches:
- main
- "version-*"
pull_request:

permissions:
contents: read

jobs:
verify:
name: Compilar, analizar, probar y empaquetar
name: Analizar, probar y empaquetar JavaScript
runs-on: ubuntu-latest

steps:
Expand All @@ -27,6 +28,9 @@ jobs:
- name: Instalar dependencias
run: npm ci

- name: Auditar dependencias de producción
run: npm audit --omit=dev

- name: Verificar el proyecto
run: npm run check

Expand Down
5 changes: 1 addition & 4 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@
"args": [
"--extensionDevelopmentPath=${workspaceFolder}"
],
"outFiles": [
"${workspaceFolder}/dist/**/*.js"
],
"preLaunchTask": "npm: compile"
"preLaunchTask": "npm: lint"
}
]
}
11 changes: 2 additions & 9 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,11 @@
"tasks": [
{
"type": "npm",
"script": "compile",
"script": "lint",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": "$tsc"
},
{
"type": "npm",
"script": "watch",
"isBackground": true,
"problemMatcher": "$tsc-watch"
}
}
]
}
22 changes: 18 additions & 4 deletions .vscodeignore
Original file line number Diff line number Diff line change
@@ -1,12 +1,26 @@
.github/**
.vscode/**
src/**
dist/test/**
src/test/**
coverage/**
node_modules/**
node_modules/**/*.ts
node_modules/**/*.tsx
node_modules/**/*.cts
node_modules/**/*.mts
node_modules/**/tsconfig*.json
node_modules/**/*.map
node_modules/**/README*.md
node_modules/**/examples/**
node_modules/**/example/**
node_modules/**/test/**
node_modules/**/tests/**
node_modules/**/docs/**
node_modules/exceljs/dist/**
node_modules/sql.js/dist/*debug*
node_modules/sql.js/dist/sql-asm*
node_modules/sql.js/dist/worker.*
node_modules/sql.js/dist/sql-wasm-browser*
.gitignore
eslint.config.mjs
tsconfig.json
plan.txt
project requirements.txt
*.vsix
39 changes: 33 additions & 6 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,40 @@
# Changelog

Todos los cambios relevantes de Simple DB se documentarán en este archivo.
Todos los cambios relevantes de Simple DB se documentan en este archivo.

## 0.1.1 - 2026-08-07

### Añadido

- SQLite como quinto motor, ejecutado con `sql.js` en un Worker cancelable.
- Adaptadores completos para SQLite, PostgreSQL, MySQL, SQL Server y Oracle.
- Perfiles múltiples, prueba de conexión, conexión/desconexión y contraseñas en `SecretStorage`.
- Exploración de bases, esquemas y objetos específicos: tablas, vistas, vistas materializadas, rutinas, packages Oracle, índices, triggers, secuencias, tipos, sinónimos y eventos MySQL según el motor.
- Editor SQL por sesión y contexto de base/esquema.
- Parser de dialecto para PostgreSQL `$$`, MySQL `DELIMITER`, SQL Server `GO`, Oracle PL/SQL `/` y triggers SQLite.
- Ejecución de selección, sentencia actual o documento; DML, DDL y SQL arbitrario.
- Lectura/plantillas de DDL con acciones para mostrar definición, preparar `CREATE`, `ALTER` y `DROP`.
- Transacciones por editor, `COMMIT`, `ROLLBACK`, cancelación y timeouts.
- Resultados paginados en disco, múltiples result sets, copia de celda/fila/selección y exportación CSV/JSON/XLSX.
- Historial configurable, duración, filas recuperadas y filas afectadas.
- Confirmaciones configurables para operaciones destructivas y DML sin `WHERE`.
- Pruebas automatizadas íntegramente en JavaScript, incluida integración real del adaptador SQLite.
- Protección SQLite frente a cambios externos y WAL activo, además de lectura exacta de enteros de 64 bits.
- DDL específico por motor para índices/triggers y eliminación correcta de índices respaldados por constraints cuando el catálogo aporta esa información.
- Protección de inicios de transacción escritos como SQL para mantener PostgreSQL/MySQL sobre una conexión física reservada, incluidas variantes de `START TRANSACTION`.
- Protección frente a inyección de fórmulas al exportar CSV y preservación de `NUMBER` Oracle como texto exacto.

### Cambiado

- Proyecto migrado completamente de TypeScript a JavaScript: no quedan `.ts`, `tsconfig.json` ni compilación TypeScript.
- `F5` carga directamente `src/extension.js`.
- `simpleDb.maxRows` pasa a `0` por defecto, es decir, **sin límite de filas**. El usuario puede configurar uno si lo necesita.
- La paginación de resultados es almacenamiento/visualización y no altera el SQL con `TOP`, `LIMIT` o `FETCH`.
- CI verifica JavaScript mediante lint, tests y empaquetado VSIX.
- Dependencias bloqueadas por lockfile y auditoría npm integrada en CI.

## 0.0.1 - 2026-08-05

### Añadido

- Esqueleto de extensión para Visual Studio Code escrito en TypeScript.
- Contenedor Simple DB y vista lateral inicial de conexiones.
- Catálogo inicial de PostgreSQL, MySQL, SQL Server y Oracle.
- Configuración de compilación, ESLint, pruebas y depuración con F5.
- Empaquetado VSIX y flujo de verificación en GitHub Actions.
- Esqueleto inicial de la extensión.
183 changes: 143 additions & 40 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,59 +1,162 @@
# Simple DB

Simple DB será una extensión de Visual Studio Code para trabajar desde una sola interfaz con PostgreSQL, MySQL, SQL Server y Oracle.
Simple DB `0.1.1` es una extensión de Visual Studio Code, escrita íntegramente en JavaScript, para trabajar con **SQLite, PostgreSQL, MySQL, SQL Server y Oracle** desde una interfaz común.

## Estado actual
La extensión abre documentos SQL normales de VS Code. `F5` inicia directamente `src/extension.js`: no hay TypeScript, `tsconfig.json`, carpeta `dist` ni paso de compilación.

La versión `0.0.1` contiene el esqueleto técnico del proyecto:
## Funciones principales

- Extensión escrita en TypeScript.
- Contenedor propio de **Simple DB** en la barra de actividad.
- Vista inicial **Conexiones** con los cuatro motores previstos.
- Compilación, análisis estático y pruebas automatizadas.
- Configuración para iniciar una ventana de desarrollo con `F5`.
- Empaquetado local en formato `.vsix`.
- Verificación automática mediante GitHub Actions.
- Crear, editar, probar y eliminar múltiples conexiones por motor.
- Contraseñas en `SecretStorage`; nunca dentro de los perfiles ni del repositorio.
- Conectar varios motores simultáneamente y desconectarlos de forma explícita.
- Explorar bases de datos, esquemas y los objetos propios de cada motor.
- Abrir editores SQL vinculados a una conexión, base de datos y esquema.
- Ejecutar la selección, la sentencia del cursor o el documento completo.
- Ejecutar SQL libre: `SELECT`, `INSERT`, `UPDATE`, `DELETE`, `MERGE`, `CREATE`, `ALTER`, `DROP`, `TRUNCATE` y demás sintaxis que acepte el servidor.
- Crear scripts `CREATE`, `ALTER` y `DROP` desde el explorador y consultar la definición/DDL de objetos.
- Transacciones explícitas por editor con `BEGIN`, `COMMIT` y `ROLLBACK`.
- Cancelar consultas y aplicar timeout configurable por conexión.
- Resultados con varias tablas, tipos, `NULL`, filas afectadas, duración y copia de celda/fila/selección.
- Conservación de enteros de 64 bits/`NUMBER` de alta precisión como valores exactos antes de mostrarlos o exportarlos.
- Exportar el resultado ya recuperado a CSV, JSON o XLSX sin volver a ejecutar el SQL.
- Historial local configurable con reapertura, copia y reejecución.

La creación y el almacenamiento seguro de conexiones todavía no forman parte de esta versión. Se incorporarán en los pasos siguientes del plan.
## Cinco motores

## Requisitos para desarrollar
| Motor | Driver | Dialecto y exploración destacada |
|---|---|---|
| SQLite | `sql.js` en Worker | tablas, vistas, índices, triggers, PRAGMA, transacciones |
| PostgreSQL | `pg` + `pg-cursor` | bases, esquemas, tablas, vistas/materializadas, rutinas, índices, triggers, secuencias, tipos, `$$` |
| MySQL | `mysql2` | bases/esquemas, tablas, vistas, rutinas, índices, triggers, eventos, `DELIMITER` |
| SQL Server | `mssql` | bases, esquemas, tablas, vistas, procedimientos/funciones, índices, triggers, secuencias, tipos, sinónimos, `GO` |
| Oracle | `oracledb` Thin | esquemas, tablas, vistas/materializadas, procedimientos/funciones, packages, índices, triggers, secuencias, tipos, sinónimos, PL/SQL |

Oracle utiliza el modo Thin predeterminado de `node-oracledb`, por lo que las conexiones habituales no requieren instalar Oracle Client. SQL Server `0.1.1` utiliza autenticación SQL con usuario y contraseña.

## Resultados sin límite impuesto por defecto

`simpleDb.maxRows` vale **`0` por defecto: sin límite de filas**.

Simple DB no añade automáticamente `TOP`, `LIMIT` ni `FETCH` a una consulta. Los drivers consumen los resultados mediante cursor, result set o streaming y el almacenamiento temporal se divide en páginas para no enviar todas las filas de golpe al webview.

`simpleDb.resultPageSize` (500 por defecto) es únicamente el tamaño de página de almacenamiento/visualización; **no es un límite de filas**. Si el usuario quiere un límite, puede asignar a `simpleDb.maxRows` un valor mayor que cero.

## Explorador y DDL

Los grupos visibles dependen del motor. Desde un objeto se puede:

- abrir `SELECT *` para tablas, vistas y vistas materializadas, sin límite SQL añadido;
- mostrar su definición cuando el catálogo del servidor la ofrece;
- preparar un script `ALTER`;
- preparar un script `DROP`;
- copiar su nombre cualificado.

Desde una base, esquema o grupo se puede preparar un `CREATE` del tipo correspondiente. Los scripts se abren primero en un editor: el usuario los revisa y decide si los ejecuta.

Los `DROP`/`TRUNCATE` solicitan confirmación por defecto. También se avisa antes de `UPDATE` o `DELETE` sin `WHERE`. Ambos comportamientos son configurables.

## Ejecución por dialecto

El documento no se divide con un `split(';')`. El parser entiende:

- PostgreSQL: strings, comentarios y bloques dollar-quoted como `$$ ... $$`;
- MySQL: `DELIMITER`, strings, comentarios `--`, `/* ... */` y `#`;
- SQL Server: batches `GO` y `GO n`;
- Oracle: bloques `DECLARE`/`BEGIN`, procedimientos, funciones, packages, tipos, triggers, terminador `/` y literales `q'[...]'`;
- SQLite: `CREATE TRIGGER ... BEGIN ... END` con sentencias internas.

La ejecución de un documento se detiene en el primer error y selecciona el bloque que falló. La selección explícita se procesa dentro de sus límites y los separadores de cliente (`GO`, `DELIMITER`, `/`) no se envían al servidor.

## Transacciones

Cada editor SQL tiene un identificador de sesión independiente. Una transacción reserva su conexión física hasta `COMMIT` o `ROLLBACK`.

- Cerrar un editor con una transacción activa provoca `ROLLBACK` y muestra un aviso.
- Desconectar una conexión con transacciones abiertas requiere confirmación y realiza `ROLLBACK`.
- Tras un error/cancelación dentro de una transacción, la barra de estado puede exigir `ROLLBACK`.
- SQLite impide que otra pestaña utilice el mismo adaptador mientras un editor tiene una transacción abierta.

## Resultados, copia y exportación

El panel de resultados permite navegar por páginas, cambiar entre múltiples result sets, distinguir `NULL`, seleccionar una celda o un rango con `Shift` y copiar celda, fila o selección.

CSV, JSON y XLSX se generan en streaming a partir de las páginas temporales recuperadas. No se reejecuta la consulta. Los valores de celda muy grandes se acotan para la vista mediante `simpleDb.maxCellCharacters`; el texto indica explícitamente cuando una celda fue recortada.

La exportación CSV protege por defecto valores que podrían interpretarse como fórmulas al abrirlos en una hoja de cálculo. Puede desactivarse si se necesita una exportación CSV literal.

## Conexiones y seguridad

- Los perfiles no contienen contraseñas.
- Las contraseñas se guardan con la API `SecretStorage` de VS Code.
- SSL/TLS, cifrado y confianza del certificado son opciones explícitas según el motor.
- `simpleDb.confirmDestructiveQueries` está activado por defecto.
- `simpleDb.warnUnsafeDml` está activado por defecto.
- El historial puede contener literales escritos en SQL. Puede desactivarse con `simpleDb.history.enabled` o vaciarse desde la vista **Historial**.

### Nota SQLite

SQLite se ejecuta en un Worker dedicado mediante WebAssembly para que consultas largas no bloqueen la interfaz y puedan cancelarse terminando el Worker. El archivo se mantiene como una instantánea cargada durante la conexión. Antes de cada operación, Simple DB comprueba que el archivo principal/WAL/journal no haya cambiado externamente; ante un conflicto se niega a continuar y pide reconectar. Si al abrir existe un WAL activo, la conexión se rechaza hasta que el proceso propietario haga checkpoint/cierre el WAL, evitando cargar o sobrescribir una instantánea incompleta.

## Configuración

| Ajuste | Predeterminado | Función |
|---|---:|---|
| `simpleDb.maxRows` | `0` | Límite opcional por result set; `0` = ilimitado |
| `simpleDb.resultPageSize` | `500` | Filas por página temporal/visual |
| `simpleDb.maxCellCharacters` | `10000` | Máximo conservado por celda en resultados |
| `simpleDb.history.enabled` | `true` | Guardar historial local |
| `simpleDb.history.maxEntries` | `500` | Entradas máximas de historial |
| `simpleDb.confirmDestructiveQueries` | `true` | Confirmar `DROP`/`TRUNCATE` |
| `simpleDb.warnUnsafeDml` | `true` | Avisar de `UPDATE`/`DELETE` sin `WHERE` |
| `simpleDb.csvDelimiter` | `;` | Delimitador de exportación CSV |
| `simpleDb.csvProtectFormulaInjection` | `true` | Neutralizar posibles fórmulas al exportar CSV |

El timeout de conexión y el timeout máximo de consulta se configuran por perfil. `0` en el timeout de consulta significa sin timeout.

## Desarrollo

Requisitos:

- Visual Studio Code `1.95.0` o posterior.
- Node.js `20` o posterior.
- Node.js `20` o posterior para desarrollo.
- npm.

## Puesta en marcha

1. Clona el repositorio.
2. Ejecuta `npm install`.
3. Abre la carpeta del proyecto en Visual Studio Code.
4. Pulsa `F5` y elige **Ejecutar Simple DB**.
5. En la nueva ventana de VS Code, abre el icono **Simple DB** de la barra lateral.
```bash
npm ci
npm run check
```

La vista **Conexiones** debe mostrar PostgreSQL, MySQL, SQL Server y Oracle.
Después abre el repositorio en VS Code y pulsa `F5` con la configuración **Ejecutar Simple DB**. El `preLaunchTask` ejecuta ESLint y el Extension Host carga `src/extension.js` directamente.

## Comandos de desarrollo
Comandos del proyecto:

| Comando | Función |
|---|---|
| `npm run compile` | Compila TypeScript en la carpeta `dist`. |
| `npm run watch` | Recompila al detectar cambios. |
| `npm run lint` | Revisa el código con ESLint. |
| `npm test` | Ejecuta las pruebas unitarias. |
| `npm run check` | Compila, revisa y prueba todo el proyecto. |
| `npm run package` | Verifica el proyecto y genera el archivo VSIX. |

## Estructura principal

- `src/extension.ts`: punto de activación de la extensión.
- `src/databaseEngines.ts`: catálogo inicial de motores.
- `src/views/`: proveedores de las vistas laterales.
- `src/test/`: pruebas unitarias.
- `resources/`: recursos visuales de la extensión.
- `.vscode/`: tareas y configuración de depuración.
- `.github/workflows/`: verificación automática.
- `plan.txt`: plan completo de desarrollo.
| `npm run lint` | ESLint sobre JavaScript |
| `npm test` | Pruebas Vitest escritas en JavaScript |
| `npm run check` | Lint + tests |
| `npm run package` | Verificación y creación del VSIX |
| `npm run package:win32` | VSIX objetivo `win32-x64` |
| `npm run package:linux` | VSIX objetivo `linux-x64` |

Las pruebas incluyen parser/safety/DDL/almacenamiento/SecretStorage simulado y una integración SQLite real. Los servidores PostgreSQL, MySQL, SQL Server y Oracle externos requieren sus credenciales/infraestructura para pruebas de integración contra una instancia real.

## Estructura

```text
src/
adapters/ # cinco adaptadores y Worker SQLite
core/ # errores y normalización de valores
managers/ # conexiones y sesiones de editor
services/ # ejecución y exportación
sql/ # splitter por dialecto, safety y DDL
storage/ # perfiles, historial y resultados paginados
test/ # tests JavaScript
ui/ # formulario de conexión
views/ # árboles y panel de resultados
extension.js # activate/deactivate
```

## Licencia

Este proyecto se distribuye bajo la licencia MIT.
MIT. Consulta `LICENSE`.
36 changes: 25 additions & 11 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,20 +1,34 @@
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
import globals from 'globals';

export default tseslint.config(
export default [
{
ignores: [
'coverage/**',
'dist/**',
'node_modules/**',
],
ignores: ['coverage/**', 'node_modules/**'],
},
eslint.configs.recommended,
...tseslint.configs.recommended,
{
files: ['src/**/*.ts'],
files: ['src/**/*.js', 'scripts/**/*.js'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'commonjs',
globals: {
...globals.node,
},
},
rules: {
'@typescript-eslint/consistent-type-imports': 'error',
'no-unused-vars': [
'error',
{ argsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_' },
],
},
},
{
files: ['src/test/**/*.js'],
languageOptions: {
globals: {
...globals.node,
...globals.vitest,
},
},
},
);
];
Loading
Loading