@adapttable/server
v0.4.2
Published
Parse and validate an AdaptTable query on the server — one typed contract from the URL to your backend, for Next.js route handlers, Remix loaders and Server Actions.
Downloads
373
Maintainers
Readme
@adapttable/server
Parse and validate an AdaptTable query on the server — one typed contract from the URL to your backend.
The table puts its whole state in the URL, which is what makes a view
shareable and a page reloadable. The moment that URL reaches a backend it
stops being state and becomes user input: limit=999999,
sortBy=password, a filter on a column that is not in the table at all.
Requires Node.js 22.12.0 or newer; packed releases are tested on Node 22.12 and Node 24.
Features
- Validation, not just parsing — you give it the columns a client is allowed to name, and everything else is dropped. A column name chosen by the caller never reaches your database.
- Never throws — a stale bookmark or a hand-edited link degrades to a
simpler table instead of an error page, and everything refused is reported
in
rejectedso a route that would rather answer 400 can. - The whole query — page, limit and offset, search, the multi-sort chain, grouping, column filters, the advanced filter tree, the pivot configuration, and the cursor.
- All-or-nothing filter trees — dropping one condition out of an AND quietly widens the result set, so an unknown field discards the tree rather than a branch of it.
- Any framework — takes a
Request, aURL, a query string orURLSearchParams, so Next.js route handlers, Remix loaders and Server Actions all work without an adapter. - Backend-agnostic — no ORM, no SQL. It describes what was asked for; what you do with it is yours.
- No React — the codecs come from
@adapttable/core/query, the entry with no hooks and no client boundary, so an Express or Fastify service installs a 4.2 KB parser and not a UI library.
Install
npm install @adapttable/serverUse
import { parseTableQuery } from "@adapttable/server";
export async function GET(request: Request) {
const query = parseTableQuery(request, {
columns: ["name", "team", "budget"],
maxLimit: 100,
});
if (query.rejected.length > 0) {
// Optional: be strict instead of forgiving.
return Response.json({ error: query.rejected }, { status: 400 });
}
return Response.json(await people(query));
}Full documentation: Server queries.
License
MIT © Orwa Mahmoud
