Skip to content

feat(sqlrunner): SQL Live Blocks — esecutore SQL client-side per il Volume 3 - #7

Merged
marcofarina merged 3 commits into
mainfrom
feat/sql-live-blocks
Jun 10, 2026
Merged

feat(sqlrunner): SQL Live Blocks — esecutore SQL client-side per il Volume 3#7
marcofarina merged 3 commits into
mainfrom
feat/sql-live-blocks

Conversation

@marcofarina

Copy link
Copy Markdown
Owner

Panoramica

Introduce SQL Live Blocks: blocchi di codice SQL interattivi in stile PyRunner, alimentati da SQLite (sql.js WASM) eseguito in un Web Worker. Progettato per il Volume 3 — Manuale dell'Archivista.

Funzionalità

  • **Fence ```sql live ** → componente viaplugins/sqlrunner/remark.js(factory condivisaremark-live-fence.js` con PyRunner)
  • Motore: sql.js 1.14.1 self-hosted in static/sql-runner/ (no CDN — importScripts nei worker non supporta SRI); eseguito in un Web Worker statico dedicato
  • Meta supportati: dataset, title, readonly, maxLines, maxRows, timeout, stateful, runOnMount, noExplain, explainPrompt
  • Restore trasparente del DB: snapshot seed (db.export()) per dataset; modalità stateless (default) riapre dal seed a ogni Esegui → DROP/DELETE/UPDATE sempre ripristinati senza che lo studente se ne accorga; modalità stateful mantiene il DB tra i run con bottone "Reset DB" e notice di ripristino dopo timeout
  • Sicurezza/robustezza: worker + watchdog sul main thread (timeout → terminate + respawn), PRAGMA hard_heap_limit 64MiB, cap righe/byte nel worker prima del postMessage, celle renderizzate come text node React (no XSS), zero persistenza lato client
  • PRAGMA foreign_keys = ON per-connessione (per la didattica dei vincoli referenziali)
  • Lazy loading: worker/wasm/dataset scaricati solo al primo Esegui — zero impatto sulle pagine senza SQL (verificato via Network tab)
  • Dataset seed: biblioteca.sql (tabelle autori/libri/prestiti con dati di esempio)
  • Pagina di test: docs/sqlrunner-test.mdx con 16 casi d'uso (unlisted: true), verificati a video in light/dark mode

Refactor code-health (incluso in questo branch)

Cleanup emersi dalla review, applicati prima del feat:

Area Fix
FontAwesome library.add duplicata rimossa da MDXComponents
Clipboard Helper condiviso clipboard.ts con error propagation; riusato da Toolbar e "Spiegamelo facile"
PyRunner Editor forwardRef + useImperativeHandle; prop language opzionale per riuso con SQLRunner
coerce.ts coerceBool/coerceNumber estratti in file condiviso
PathContext Rimosso clearPath mai usato; fix hydration mismatch (localStorage letto nell'effect)
Remark plugin Logica comune estratta in remark-live-fence.js; warning build-time per meta numerici non validi
smartypants-guard Placeholder cambiato in U+E000 (Private Use Area)
Toolbar Prop opzionali showResetDb/onResetDb per SQLRunner
grid.py bare exceptexcept Exception
Prettier Riformattazione su file con violazioni pre-esistenti (lint verde)

File principali

File Ruolo
src/theme/SQLRunner/index.tsx Componente principale
src/theme/SQLRunner/sqlBridge.ts Bridge main-thread ↔ worker (watchdog, snapshot, restore)
src/theme/SQLRunner/Output.tsx Rendering risultati / errori
src/theme/SQLRunner/ResultTable.tsx Tabella risultati
src/theme/SQLRunner/styles.module.css Stili (dark/light)
plugins/sqlrunner/remark.js Remark plugin fence → JSX
plugins/remark-live-fence.js Factory condivisa PyRunner + SQLRunner
static/sql-runner/ sql.js WASM + worker self-hosted
static/sql-datasets/archivista/biblioteca.sql Dataset seed
docs/sqlrunner-test.mdx Pagina di test (unlisted)
scripts/sync-sql-wasm.mjs Script per aggiornare sql.js

Test plan

  • Pagina sqlrunner-test.mdx verificata a video (16 casi d'uso: SELECT, JOIN, errori, restore, stateful, timeout, foreign keys, NULL, multi-statement, maxRows, runOnMount, JSX diretto)
  • Light mode e dark mode
  • Lazy loading verificato via Network tab (nulla scaricato a riposo)
  • Build produzione (npm run build) senza errori
  • npm run lint verde dopo Prettier

🤖 Generated with Claude Code

marcofarina and others added 3 commits June 10, 2026 03:11
…dling

- FontAwesome library.add registrata solo in Root.tsx (era duplicata in MDXComponents)
- Helper clipboard condiviso (clipboard.ts) con errore propagato dal fallback;
  usato da Toolbar e da "Spiegamelo facile"
- Editor PyRunner rifattorizzato a forwardRef + useImperativeHandle (via prop
  handleRef non standard) + prop opzionale `language` per riuso con altri linguaggi
- coerceBool/coerceNumber estratti in coerce.ts (riusabili)
- PathContext: rimosso clearPath mai usato; fix hydration mismatch (useState
  parte da {} come l'HTML server-side, localStorage letto nell'effect)
- remark pyrunner: logica estratta nella factory condivisa remark-live-fence.js
  con warning a build time per meta numerici non validi
- plugins/pyrunner: warning se la directory degli esempi non esiste
- smartypants-guard: placeholder U+E000 (Private Use Area) al posto di "·"
- grid.py: bare except → except Exception con motivazione
- Toolbar: prop opzionali showResetDb/onResetDb (per SQLRunner)
- Riformattazione Prettier su file con violazioni pre-esistenti (lint ora verde)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…olume 3

Editor SQL interattivo in stile PyRunner, motore sql.js (SQLite WASM 1.14.1)
self-hosted in static/sql-runner/ (no CDN: importScripts nei worker non
supporta SRI) ed eseguito in un Web Worker statico.

- Fence ```sql live``` via plugins/sqlrunner/remark.js (factory condivisa);
  meta: dataset, title, readonly, maxLines, maxRows, timeout, stateful,
  runOnMount, noExplain, explainPrompt
- Sicurezza: worker + watchdog sul main thread (timeout → terminate + respawn),
  PRAGMA hard_heap_limit 64MiB, cap righe/byte applicato nel worker prima del
  postMessage, celle come text node React (no XSS), zero persistenza
- Restore del DB dietro le quinte: snapshot seed (db.export()) per dataset;
  stateless (default) riapre dal seed a OGNI run → DROP/DELETE sempre
  ripristinati in modo invisibile; stateful mantiene il DB tra i run con
  bottone "Reset DB" e notice di ripristino dopo timeout
- PRAGMA foreign_keys=ON per-connessione (didattica dei vincoli)
- Lazy: worker/wasm/dataset scaricati solo al primo Esegui, zero peso sulle
  pagine senza SQL (verificato via Network)
- Dataset seed biblioteca.sql (autori/libri/prestiti) + pagina di test
  docs/sqlrunner-test.mdx con 16 casi d'uso, verificati a video in light/dark

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@marcofarina
marcofarina merged commit 9677753 into main Jun 10, 2026
@marcofarina
marcofarina deleted the feat/sql-live-blocks branch June 10, 2026 16:35
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