data-client-schema
13
总安装量
13
周安装量
#24545
全站排名
安装命令
npx skills add https://github.com/reactive/data-client --skill data-client-schema
Agent 安装分布
codex
13
opencode
12
gemini-cli
12
github-copilot
12
kimi-cli
12
cursor
12
Skill 文档
1. Defining Schemas
Define schemas to represent the JSON returned by an endpoint. Compose these to represent the data expected.
Object
- Entity – represents a single unique object (denormalized)
- new Union(Entity) – polymorphic objects (A | B)
{[key:string]: Schema}– immutable objects- new Invalidate(Entity|Union) – to delete an Entity
List
- new Collection([Schema]) – mutable/growable lists
[Schema]– immutable lists- new All(Entity|Union) – list all Entities of a kind
Map
new Collection(Values(Schema))– mutable/growable maps- new Values(Schema) – immutable maps
Derived / selector pattern
-
new Query(Queryable) – memoized programmatic selectors
const queryRemainingTodos = new Query( TodoResource.getList.schema, entries => entries.filter(todo => !todo.completed).length, );const groupTodoByUser = new Query( TodoResource.getList.schema, todos => Object.groupBy(todos, todo => todo.userId), );
2. Entity best practices
- Every
Entitysubclass defines defaults for all non-optional serialised fields. - Override
pk()only when the primary key âid. pk()return type isnumber | string | undefined- Override
Entity.process(value, parent, key, args)to insert fields based on args/url static schema(optional) for nested schemas or deserialization functions- When designing APIs, prefer nesting entities
3. Entity lifecycle methods
- Normalize order:
process()â validate() âpk()â if existing:mergeWithStore()which callsshouldUpdate()and maybeshouldReorder()+merge(); metadata viamergeMetaWithStore(). - Denormalize order:
createIfValid()â validate() âfromJS().
4. Union Types (Polymorphic Schemas)
To define polymorphic resources (e.g., events), use Union and a discriminator field.
import { Union } from '@data-client/rest';
export abstract class Event extends Entity {
type: EventType = 'Issue'; // discriminator field is shared
/* ... */
}
export class PullRequestEvent extends Event { /* ... */ }
export class IssuesEvent extends Event { /* ... */ }
export const EventResource = resource({
path: '/users/:login/events/public/:id',
schema: new Union(
{
PullRequestEvent,
IssuesEvent,
// ...other event types...
},
'type', // discriminator field
),
});
5. Best Practices & Notes
- Always set up
schemaon every resource/entity/collection for normalization - Normalize deeply nested or relational data by defining proper schemas
- Use
Entity.schemafor client-side joins - Use
Denormalize<>type from rest/endpoint/graphql instead of InstanceType<>. This will handle all schemas like Unions, not just Entity.
6. Common Mistakes to Avoid
- Don’t forget to use
fromJS()or assign default properties for class fields - Manually merging or ‘enriching’ data; instead use
Entity.schemafor client-side joins
References
For detailed API documentation, see the references directory:
- Entity – Normalized data class
- Collection – Mutable/growable lists
- Union – Polymorphic schemas
- Query – Programmatic selectors
- Invalidate – Delete entities
- Values – Map schemas
- All – List all entities of a kind
- Array – Immutable list schema
- Object – Object schema
- schema – Schema overview
- relational-data – Relational data guide
- computed-properties – Computed properties guide
- partial-entities – Partial entities guide
- side-effects – Side effects guide
- sorting-client-side – Client-side sorting guide