Changelog¶
O formato segue Keep a Changelog e o projeto adota Versionamento Semântico.
[0.1.0] — 2026-06-29¶
Primeira versão pública, publicada no npm.
Adicionado¶
- Fase 1 — Schema declarativo class-based. Classe base
Model+ fábricacolumncom catálogo rico de tipos espelhando o SQLAlchemy (smallInteger,integer,bigInteger→bigint,numeric/decimal→string,real,double,varchar/string,char,text,boolean,date,time,datetime,timestamp,blob→Uint8Array,json<T>/jsonb<T>,uuid,enum→união literal). Modificadores.primaryKey(),.notNull(),.default(),.onUpdate(). Tipos inferidos porInferModel(SELECT) eInferInsert(insert). - Defaults portáveis (
sql.now(),sql.uuidv4(), etc.), guardados na coluna pro IR de migração. parseDatabaseUrl/detectDialect— banco identificado via URL (à lamake_url).- Serialização (
toDict/toJSON/stringify/fromDict/parse) com coerção por tipo de coluna. - Fase 3 — operadores tipados por tipo de coluna (
OperatorsFor<T>):string→like/ilike/in;number/bigint/Date→ordenados+between;boolean→ eq/isNull. Combinação inválida = erro de compilação. - Fase 4a — compilação SQL por dialeto:
getDialect(...).compile(node)→{ sql, params }parametrizado (?/$1), SELECT/INSERT/UPDATE/DELETE +RETURNING;ilikenativo no Postgres. - Fase 4b — execução real:
createEngine(async) /createSyncEngine(SQLite sync),Session.executecom terminais tipados,engine.transaction+ savepoints, coerção de linha. SQLite vianode:sqlite; PostgreSQL viapostgres.js. - Fase 5 — joins tipados:
join(Model, alias).innerJoin/leftJoin(...)→ tipo composto{ [alias]: Row },leftJoinnullable; refsalias.columntipadas. - Fase 6 — migrações (
tempest-db-js/migrations, estilo Alembic):reflectSchema,diffSchema, operações tipadas +invert,renderOperation(DDL por dialeto),generateMigration, grafo DAG (topoOrder/heads),MigrationRunner(upgrade/downgradereais). SQL só no renderer. - Fase 7 — repository:
BaseRepository<Model>(CRUD + paginação tipada) sobreAsyncSession, convenção 404 (RecordNotFound/[]),PaginationFilter/PaginationResultalinhados aotempest-fastapi-sdk. - Refinamentos: combinadores
and/or/notnowhere(select/update/delete/ join); batch-mode SQLite (recreate_table) pra mudanças de coluna preservando dados; introspecção SQLite +checkDrift(compara DB vivo com os modelos). - Mais refinamentos:
session.stream(query)(iteração preguiçosa sync/async); relationshasMany/belongsTo+loadRelations(eager-load tipado, sem N+1); CLI de migraçãorunMigrationCli(upgrade/downgrade/check/revision --autogenerate); PostgreSQL estrutural (introspecção, enum nomeado,PoolOptions). - Fase 2 — Query builder tipado (AST pura, sem execução).
select(Model)/select(Model, [cols])→ inferência de linha completa ouPick, com.where(),.orderBy(),.limit(),.offset().insert(Model).values(...)tipado porInferInsert, com.returning().update(Model)/del(Model)com guard de estado tipado: a query só se torna executável após.where(...)ou.unguarded()explícito — um UPDATE/DELETE em tabela inteira sem querer vira erro de compilação..returning(cols)inferindo projeçãoPickem todas as mutações.
- Documentação bilíngue (PT-BR + EN-US) em MkDocs Material, publicada no GitHub Pages.
Notas¶
- Alpha (
v0.1.0). A superfície pública pode ainda mudar antes dav1.0. - Execução SQLite real e testada (
node:sqlite); PostgreSQL viapostgres.js.