@ranjeetk25/schema-grid-core
v0.4.1
Published
Schema-driven data grid core: schemas, field types, filters, formulas and the wire contract. Zero UI dependencies.
Maintainers
Readme
@ranjeetk25/schema-grid-core
Framework-free core of Schema Grid: schema and field types, filter AST, query model,
permissions, the formula engine, the DataSource contract, an in-memory reference
data source and the transport-neutral wire contract.
Subpath exports
@ranjeetk25/schema-grid-core – schema, field-type ids, query/row/permission types, formulas, filters
@ranjeetk25/schema-grid-core/field-types – built-in field types and registries
@ranjeetk25/schema-grid-core/filter – filter AST, operators, validateFilter, resolveRelativeDate
@ranjeetk25/schema-grid-core/formula – parser, evaluator, dependency graph
@ranjeetk25/schema-grid-core/memory – createInMemoryDataSource (reference semantics)
@ranjeetk25/schema-grid-core/testing – fixture schema/rows used by every package's tests
@ranjeetk25/schema-grid-core/wire – run a DataSource across any transport (below)Running a DataSource over the network (./wire)
The grid only needs a DataSource. ./wire splits one into a server half and a
client half that meet over any transport — tRPC, REST, Hono, Lambda, a worker
postMessage — without the grid knowing or caring. No transport is a dependency.
import { createDataSourceHandler, createRemoteDataSource, unwrapWireResult } from "@ranjeetk25/schema-grid-core/wire";
// server: (op, untrustedInput) => { ok: true, data } | { ok: false, error, status }. Never throws.
const handle = createDataSourceHandler(dataSource, { validateOutput: process.env.NODE_ENV !== "production" });
// client: any (op, input) => Promise<output> function becomes a DataSource<GridRow>
const remote = createRemoteDataSource(async (op, input) => unwrapWireResult(await callServer(op, input)));GRID_OPERATIONS— the eight ops:fetch,applyChanges,createRows,deleteRows,getChanges,getOptions,createOption,lookup.wireSchemas[op].input/.output— Zod schemas (zod^3.25 || ^4). Multi-argument ops send named objects ({ partials },{ ids },{ since },{ columnId, search? },{ columnId, label },{ columnId, search });deleteRowsanswersnull.toWireError(err)/httpStatusFor(code)— map thrown errors to{ code, message, details? }by duck-typing onerr.code/err.name(server and in-memory errors included; unknown errors becomeINTERNAL, message hidden).createDataSourceHandler(ds, { validateOutput?, exposeInternalErrors?, mapError?, onError? })— validates input, callsds, maps errors; a missing optional op answersUNSUPPORTED_OPERATION(501).createRemoteDataSource(transport, { supports?, validateOutput? })— validates responses (default on) and rethrowsWireErrors asRemoteDataSourceError(code,status,details). Optional ops exist only whensupports[op] !== false.
Full list of codes, statuses and the HTTP binding: docs/wire-contract.md.
Ready-made HTTP pieces: @ranjeetk25/schema-grid-server/http (server) and createHttpDataSource in
@ranjeetk25/schema-grid-ag-grid (browser).
