# Multijet v2.0.0

## Panoramica novità
- Supporto completo a **Bun** (runtime + package manager)
- Nuova variante `multijet minimal`
- Refactor completo CLI (performance, stability, QoL)
- Nuovi comandi CLI per self-upgrade e codegen
- Nuove configurazioni default per linting più aggressivo e formatting
- Rimosso codice e moduli opzionali legacy
- Testing locale servizi migliorato (docker-compose + NGNIX)
- Nuovo sistema di logging strutturato
- Refactor core/utils
- Risolti errori di build con AWS SAM
- Risolti problemi di sicurezza e code smells
- Upgrade completo di tutte le dipendenze core
## Bun
Multijet v2 supporta nativamente [Bun](https://bun.sh/), il runtime e package manager JavaScript **più veloce** in assoluto.
Creando un progetto con la CLI è possibile selezionare `bun` come opzione di runtime. In questo modo, **tutte le dipendenze verranno installate con bun**, sia durante la creazione e sia utilizzando la CLI per generare libs o microservizi (multijet capisce automaticamente quale package manager utilizzare a seconda del progetto in cui viene eseguito).
Viene inoltre incluso nello script di build Docker l'opzione di immagine ufficiale `oven/bun:alpine` per utilizzare Bun come **runtime** invece di Node.js.
## Nuova CLI

> ⚠️ a partire da v2.0.0, è consigliabile installare la CLI globalmente con `npm i -g multijet@latest` per una esperienza migliore. E' comunque possibile utilizzarla tramite `npx` o `bunx`.
La nuova CLI di multijet è ispirata in parte a `@angular/cli` e presenta un comando nuovo e cambiamenti radicali a quelli già esistenti. Inoltre è stato fatto un refactoring completo per rendere molto più semplice aggiungere funzionalità future.
Cambiamenti principali:
- Il comando base è stato modificato da `multijet` a `mjet`
- Nuovo comando `mjet upgrade`: ispirato a `bun upgrade`, consente di aggiornare la versione di mjet CLI all'ultima versione.
- `mjet create`: refactor completo e nuove scelte di scaffolding progetto
- Variant: `Core`/`Minimal`
- Runtime: `Bun`/`Node.js`
- `mjet new`: modificato il comportamento aggiungendo opzioni di generazione: `lib`, `ms` (microservice) e `pkg` (package)
> ℹ️ La CLI v1.x è sempre utilizzabile con il comando `npx multijet@1`. Questo rende possibile il mantenimento di progetti vecchi che utilizzano multijet v1.
## Variante minimal
La variante minimal **non** include i moduli e file relativi a sviluppo di REST API, incluso sistema di build e deploy specifico e generazione OpenAPI. Questo rende possibile creare un progetto più generico senza rinunciare alla comodità e velocità di multijet⚡
Il template minimal contiene solo gli elementi essenziali di Multijet per gestire una monorepo Node.js:
- Turborepo
- npm workspaces
- ESBuild bundler
- ESLint, Prettier
A differenza della variante `Core`, minimal include solo un workspace `packages`. E' possibile generare ulteriori package tramite la CLI con `mjet new pkg <name>`.
## Modifiche minori
- Cambiato nome libreria core da `fastify-utils` a `http` in ottica di astrarre l'utilizzo di Fastify per una eventuale *nuova variante* 👀
- Aggiunto [eslint-plugin-sonarjs](https://github.com/SonarSource/eslint-plugin-sonarjs) per linting più aggressivo
- Aggiunto di default `docker-compose` e NGNIX nella root di un progetto Core, facilitando di molto il testing in locale di microservizi. A partire da v2 è altamente **sconsigliato** l'utilizzo di `aws sam` per testing in locale (è estremamente lento). Gli script non sono stati rimossi quindi è comunque possibile utilizzarlo
## Anteprima nuove versioni
> ⚠️ Queste feature sono ancora sperimentali o in fase iniziale, è possibile che cambino in futuro. Non saranno presenti in multijet v2.0.0
Le seguenti sono in ordine di priorità (dalla più alta alla più bassa):
- Nuovo modulo per facilitare lavoro con database SQL
- interazioni typesafe con database SQL **senza** utilizzo di ORM come [Prisma](https://www.prisma.io/) o [Drizzle](https://orm.drizzle.team/)
- [sqlc](https://sqlc.dev/) (*ancora in beta per TypeScript*) per generare modelli e funzioni typesafe a partire da query raw (file `.sql`)
- scala facilmente progetti grandi che usano database relazionali
- Integrazione `kysley` (query builder) per database SQL non supportati da `sqlc` e coma alternativa da file raw `.sql`
- 
- Nuova variante `fast`
- sperimentazione framework web [Hono](https://hono.dev/) (al posto di Fastify)
- nuovo core web minimale
- ottimale per progetti più piccoli
- eseguibile ovunque nativamente (Node, Bun, Deno, Lambda, WASM & Cloudflare Workers)
- performance migliori rispetto a variante standard, meno features
- `mjet takeoff` (altamente sperimentale)
- nuovo comando CLI `mjet takeoff`
- generazione automatica microservizi e storage basandosi su OpenAPI
- generazione automatica di ogni route a OpenAPI con relativi handler
- risparmia tempo, il boilerplate è automatico