Package Exports
- @justwant/warehouse
- @justwant/warehouse/clickhouse
- @justwant/warehouse/duckdb
Readme
@justwant/warehouse
DAL for data warehouses (OLAP). Contract-first, append-only. Batch insert, query, aggregate.
Install
bun add @justwant/warehouse @justwant/contract waddlerFor ClickHouse: bun add @clickhouse/client
For DuckDB: bun add @duckdb/node-api
Usage
import { defineContract, uuid, string, number, date } from "@justwant/contract";
import { createWarehouse } from "@justwant/warehouse";
import { createDuckDbAdapter } from "@justwant/warehouse/duckdb";
const EventContract = defineContract("events", {
timestamp: date().required(),
user_id: uuid().required(),
event_type: string().required(),
amount: number().optional(),
});
const warehouse = createWarehouse(createDuckDbAdapter({ path: ":memory:" }));
const events = warehouse.table(EventContract);
await events.createTable();
await events.insert([
{ timestamp: new Date(), user_id: crypto.randomUUID(), event_type: "purchase", amount: 99 },
{ timestamp: new Date(), user_id: crypto.randomUUID(), event_type: "view" },
]);
const rows = await events.query({ where: { event_type: "purchase" }, limit: 100 });
const agg = await events.aggregate({
groupBy: ["event_type"],
select: { total: "sum(amount)", count: "count()" },
});Drivers
- ClickHouse:
createClickHouseAdapterfrom@justwant/warehouse/clickhouse - DuckDB:
createDuckDbAdapterfrom@justwant/warehouse/duckdb
Pass the driver config to createWarehouse for tree-shaking (import only the driver you need).
Docs
- Drivers — config per driver, mapping
API
createWarehouse(config)— builds aWarehousefrom driver config (createDuckDbAdapter, etc.)createWarehouseFromSql(sql, { dialect })— low-level: build from Waddler SQL client directlytable(contract)— returnsWarehouseMappedTablewithcreateTable,exist,drop,insert,query,aggregateadapter.createTable(contract)— legacy DDL (prefertable(contract).createTable())