Documentação
Rodando os testes
git clone https://github.com/sysborg/sorla-db.git
cd sorla-db
npm install
npm test
npm test executa duas suítes:
- Jest (
jest): 223 testes emtest/*.test.jssobre o código-fonte. - Integrações com frameworks (
node --test test/adapters/adapters.test.mjs): as integrações com React, Vue, Svelte e Angular e a interoperabilidade com RxJS, usando as bibliotecas reais (instaladas como dependências de desenvolvimento).
npx jest # só o Jest
npx jest test/feature_cursor.test.js # um arquivo
npx jest -t "bulkWrite" # testes cujo nome corresponde
npx jest --watch # roda de novo ao salvar
node --test test/adapters/adapters.test.mjs
O GitHub Actions roda npm test a cada push em main e a cada pull request, no Node 18, 20, 22 e
24 (.github/workflows).
O que é testado
| Arquivo | Cobre |
|---|---|
unit_*.test.js |
a classe sorla, bancos, documentos (proxies somente leitura), operadores, o fallback de clonagem |
feature_insert.test.js |
ids, cópias, regras de chaves, duplicados, insertMany atômico |
feature_database.test.js |
bancos e coleções, getCollection, getStats, remoções |
feature_collection*.test.js |
find, findOne, count, todos os operadores de consulta |
feature_nested_queries.test.js |
$and / $or / $nor / $not aninhados em qualquer profundidade |
feature_query_equivalence.test.js |
500 consultas aninhadas aleatórias conferidas contra uma implementação de referência |
feature_cursor.test.js |
leitura, ordenação de tipos mistos, nulls, collation, paginação, projeção |
feature_update_delete.test.js |
operadores de atualização, upserts, replaceOne, exclusões, erros |
feature_bulk_write.test.js |
bulkWrite, BulkWriteError, o índice de _id, cursores com cópia na leitura e snapshots |
feature_schema.test.js |
todas as palavras-chave de schema, valores padrão, schemas em função, a API de schema |
feature_form.test.js |
bindForm com inserção, atualização, conversão, erros, campos gerados (jsdom) |
feature_live_query.test.js |
watch(): agrupamento em lotes, identidade estável, projeção, contratos de store e Observable |
feature_sync.test.js |
SSE contra um servidor HTTP real (quedas, Last-Event-ID, 4xx, novas tentativas), o parser de event-stream, o cliente WebSocket (socket falso), atualizações com cópia na escrita |
feature_performance.test.js |
inserções e atualizações lineares (limites de tempo folgados) |
package.test.js |
as entradas do pacote, o bundle do navegador (orçamento de tamanho, window.sorla, API mais recente presente) |
adapters/adapters.test.mjs |
React, Vue, Svelte, Angular, RxJS |
Testando o seu próprio código que usa o sorla-db
O sorla-db roda no Node, então os seus testes unitários não precisam de navegador:
// tasks.test.js (Jest, Vitest ou node:test)
const sorla = require('sorla-db');
let tasks;
beforeEach(() => {
const app = new sorla(); // uma instância nova por teste: nada vaza entre os testes
app.useDb('test');
app.db.createCollection('tasks');
tasks = app.db.tasks;
});
test('completing a task', () => {
const id = tasks.insertOne({ title: 'Write tests', done: false });
completeTask(tasks, id);
expect(tasks.findOne({ _id: id }).done).toBe(true);
});
Para formulários, use o jsdom (testEnvironment: 'jsdom' no Jest, ou crie um JSDOM e passe o
elemento de formulário dele). Para SSE e WebSocket, passe implementações de fetch, EventSource ou
WebSocket nas opções (veja como o test/feature_sync.test.js faz).
Build
npm run build # dist/sorla.min.js
O index.js empacota src/sorla.js com o browserify e o minifica com o terser em
dist/sorla.min.js, que registra window.sorla. Um build que falha termina com erro, então um bundle
desatualizado nunca fica para trás. O package.test.js verifica o bundle: nenhuma dependência de
desenvolvimento dentro dele, dentro do orçamento de tamanho (64 kB) e com a API mais recente presente.
O código-fonte é CommonJS (src/), index.mjs é a entrada como módulo ES, index.d.ts são as
declarações e adapters/ são as integrações com frameworks (módulos ES). Evite em src/ sintaxe mais
nova que o ES2020 (por exemplo, ??=): o parser do browserify não a aceita.
Estrutura do projeto
src/
sorla.js entrada: a classe sorla, estáticos connect / stream / readEventStream
dbs/database.js bancos (coleções como propriedades)
collections/collection.js coleção: formulários, stream, connect, watch
query_language/
query.js find, findOne, count, options
manipulation.js inserções, atualizações, exclusões, bulkWrite, o índice de _id
operators.js operadores de consulta
update.js operadores de atualização (cópia na escrita)
documents/
document.js wrapper somente leitura do documento
cursor.js cursores, ordenação
schema/schema.js subconjunto do JSON Schema, ValidationError
form/form.js bindForm
live/live-query.js watch()
sync/ sse.js, socket.js, apply.js
events.js, clone.js, utils.js
adapters/ react, vue, svelte, angular (.mjs + .d.ts)
test/ suítes do Jest e test/adapters
example/ form_example.html, simple_data_example.html, sse_server.js
docs/ esta documentação (en, pt-BR)
Contribuindo
- Faça um fork e crie uma branch (
feat/…,fix/…,perf/…). - Escreva o teste primeiro; mantenha o
npm testpassando. - Use Conventional Commits:
feat(cursor): …,fix(update): …. - Atualize o
CHANGELOG.mdem[Unreleased], oREADME.mde esta documentação quando o comportamento mudar. - Rode
npm run buildquandosrc/mudar e faça o commit dedist/junto. - Abra um pull request.
Publicando uma versão
npm version 1.8.0 --no-git-tag-version # package.json e package-lock.json
# CHANGELOG: [Unreleased] → [1.8.0] - data
npm test && npm run build
git commit -am "chore(release): 1.8.0"
git tag -a v1.8.0 -m v1.8.0
git push origin main v1.8.0
npm publish
O projeto segue o Versionamento Semântico.