@stndrds/client
v1.0.0-alpha.381
Published
Public TypeScript client for Standards: declare schema sources with the fluent builders, sync them to a hosted tenant, and operate typed records over the REST API.
Readme
@stndrds/client
Declare your schema with the @stndrds/schema fluent builders, sync it to a hosted Standards tenant, and operate typed records — from any Node ≥ 22 server process. No runtime, no NestJS.
pnpm add @stndrds/clientEverything you need — the builders, createStandards, defineSchemaSource, error classes — is exported from @stndrds/client. One package, one version.
1. Declare a source
import { date, defineSchemaSource, object, select, text } from "@stndrds/client";
export const incident = object("incidents", "Incident")
.attribute(text("title", "Title").required())
.attribute(
select("severity", "Severity").options([
{ value: "minor", label: "Minor" },
{ value: "major", label: "Major" },
{ value: "critical", label: "Critical" },
])
)
.attribute(date("startedAt", "Started at"))
.labelExpression("{{ title }}");
export const statusSource = defineSchemaSource({ id: "status-site", objects: [incident] });2. Sync it (server-side only)
import { createStandards } from "@stndrds/client";
// Reads STANDARDS_API_URL and STANDARDS_API_KEY (explicit { baseUrl, apiKey } win).
// Create the key with a role granting architect:update (`standards keys create --role`); keys default to member.
const standards = createStandards();
const result = await standards.schema.sync(statusSource);
// { applied: false, hash } when nothing changed — one GET, no write.Objects you push are system: users can add their own attributes and views on top, but cannot delete or retype yours. Remove an object from the source and it is demoted to a custom object — its records survive. Never call createStandards with an API key in browser code; it refuses to.
3. Typed records
const db = createStandards({ baseUrl, apiKey, schema: statusSource });
const incidents = db.incidents; // one typed query per object, keyed by the camelCase of its name
await incidents.create({ title: "API latency", severity: "major", startedAt: new Date() });
const critical = await incidents.eq("severity", "critical").orderBy("startedAt", "desc").limit(10).fetch();Inputs are typed from the builder (severity only accepts the three options); dates come back as Date.
Errors
StandardsAuthError (401/403), SchemaSourceConflictError (409 from schema.sync, with objectName and owner), SchemaSourceValidationError (400 from schema.sync, server message verbatim), StandardsRequestError (any other non-2xx, with the server's code), StandardsConfigurationError (misuse). schema.sync never throws for "nothing to do".
Licensed under the Standards SDK License 1.0 — see LICENSE. This package is not open source: it is provided to build applications that communicate with Standards.
