Skip to content

Commit d76f5f7

Browse files
committed
feat: Add schema.Collection
1 parent 2e959e8 commit d76f5f7

38 files changed

+1101
-111
lines changed

.vscode/tasks.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@
4646
"endsPattern": "compiled successfully"
4747
}
4848
}
49+
},
50+
{
51+
"type": "npm",
52+
"script": "build",
53+
"group": "build",
54+
"problemMatcher": [],
55+
"label": "npm: build",
56+
"detail": "yarn build:types && yarn workspaces foreach -ptiv --no-private run build"
4957
}
5058
]
5159
}

docs/rest/guides/summary-list.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ delay: 150,
4545
},
4646
]}>
4747

48-
```typescript title="api/Article.ts" {9}
48+
```typescript title="api/Article.ts" {11,24}
49+
import { validateRequired } from '@rest-hooks/rest';
50+
4951
class ArticleSummary extends Entity {
5052
readonly id: string = '';
5153
readonly title: string = '';
@@ -170,6 +172,7 @@ class Article extends ArticleSummary {
170172

171173
static validate(processedEntity) {
172174
return (
175+
// highlight-next-line
173176
validateRequired(processedEntity, this.defaults) ||
174177
super.validate(processedEntity)
175178
);

examples/benchmark/normalizr.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,15 @@ export default function addNormlizrSuite(suite) {
5555
result,
5656
ProjectSchema,
5757
entities,
58+
[],
5859
denormCache.entities,
5960
denormCache.results['/fake'],
6061
);
6162
denormalizeCached(
6263
queryState.result,
6364
ProjectQuery,
6465
queryState.entities,
66+
[],
6567
denormCache.entities,
6668
denormCache.results['/fakeQuery'],
6769
);
@@ -111,6 +113,7 @@ export default function addNormlizrSuite(suite) {
111113
result,
112114
ProjectSchema,
113115
entities,
116+
[],
114117
denormCache.entities,
115118
denormCache.results['/fake'],
116119
);
@@ -120,6 +123,7 @@ export default function addNormlizrSuite(suite) {
120123
queryState.result,
121124
ProjectQuery,
122125
queryState.entities,
126+
[],
123127
denormCache.entities,
124128
denormCache.results['/fakeQuery'],
125129
);
@@ -129,6 +133,7 @@ export default function addNormlizrSuite(suite) {
129133
queryInfer,
130134
ProjectQuerySorted.schema,
131135
queryState.entities,
136+
[],
132137
denormCache.entities,
133138
denormCache.results['/fakeQuery'],
134139
);

packages/core/src/controller/BaseController.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ export default class Controller<
399399
results,
400400
schema,
401401
state.entities,
402+
args,
402403
this.globalCache.entities,
403404
this.globalCache.results[key],
404405
) as { data: DenormalizeNullable<E['schema']>; paths: Path[] };

packages/core/src/next/Controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export default class Controller<
3030

3131
if (endpoint.schema) {
3232
return action.meta.promise.then(input =>
33-
denormalize(input, endpoint.schema, {}),
33+
denormalize(input, endpoint.schema, {}, args),
3434
) as any;
3535
}
3636
return action.meta.promise as any;

packages/core/src/state/reducer/setReducer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export function setReducer(
4040
const { result, entities, indexes, entityMeta } = normalize(
4141
payload,
4242
action.meta.schema,
43+
action.meta.args as any,
4344
state.entities,
4445
state.indexes,
4546
state.entityMeta,

packages/endpoint/src/interface.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,18 @@ export interface SchemaSimple<T = any> {
2525
visit: (...args: any) => any,
2626
addEntity: (...args: any) => any,
2727
visitedEntities: Record<string, any>,
28+
storeEntities: any,
2829
): any;
2930
denormalize(
3031
// eslint-disable-next-line @typescript-eslint/ban-types
3132
input: {},
3233
unvisit: UnvisitFunction,
3334
): [denormalized: T, found: boolean, suspend: boolean];
34-
denormalizeOnly?(input: {}, unvisit: (input: any, schema: any) => any): T;
35+
denormalizeOnly?(
36+
input: {},
37+
args: any,
38+
unvisit: (input: any, schema: any) => any,
39+
): T;
3540
infer(
3641
args: readonly any[],
3742
indexes: NormalizedIndex,

packages/endpoint/src/normal.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export type Denormalize<S> = S extends EntityInterface<infer U>
7070
? AbstractInstanceType<S>
7171
: S extends { denormalizeOnly: (...args: any) => any }
7272
? ReturnType<S['denormalizeOnly']>
73-
: S extends SchemaClass
73+
: S extends { denormalize: (...args: any) => any }
7474
? DenormalizeReturnType<S['denormalize']>
7575
: S extends Serializable<infer T>
7676
? T
@@ -84,7 +84,7 @@ export type DenormalizeNullable<S> = S extends EntityInterface<any>
8484
? DenormalizeNullableNestedSchema<S> | undefined
8585
: S extends RecordClass
8686
? DenormalizeNullableNestedSchema<S>
87-
: S extends SchemaClass
87+
: S extends { _denormalizeNullable: (...args: any) => any }
8888
? DenormalizeReturnType<S['_denormalizeNullable']>
8989
: S extends Serializable<infer T>
9090
? T
@@ -98,7 +98,7 @@ export type Normalize<S> = S extends EntityInterface
9898
? string
9999
: S extends RecordClass
100100
? NormalizeObject<S['schema']>
101-
: S extends SchemaClass
101+
: S extends { normalize: (...args: any) => any }
102102
? NormalizeReturnType<S['normalize']>
103103
: S extends Serializable<infer T>
104104
? T
@@ -112,7 +112,7 @@ export type NormalizeNullable<S> = S extends EntityInterface
112112
? string | undefined
113113
: S extends RecordClass
114114
? NormalizedNullableObject<S['schema']>
115-
: S extends SchemaClass
115+
: S extends { _normalizeNullable: (...args: any) => any }
116116
? NormalizeReturnType<S['_normalizeNullable']>
117117
: S extends Serializable<infer T>
118118
? T

packages/endpoint/src/queryEndpoint.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,11 @@ export class Query<
4646
if (schema.denormalizeOnly)
4747
query.denormalizeOnly = (
4848
{ args, input }: { args: P; input: any },
49+
_: P,
4950
unvisit: any,
5051
) => {
5152
if (input === undefined) return undefined;
52-
const value = (schema as any).denormalizeOnly(input, unvisit);
53+
const value = (schema as any).denormalizeOnly(input, args, unvisit);
5354
return typeof value === 'symbol'
5455
? undefined
5556
: this.process(value, ...args);
@@ -83,5 +84,9 @@ type QuerySchema<Schema, R> = Exclude<
8384
input: {},
8485
unvisit: UnvisitFunction,
8586
): [denormalized: R | undefined, found: boolean, suspend: boolean];
86-
denormalizeOnly(input: {}, unvisit: (input: any, schema: any) => any): R;
87+
denormalizeOnly(
88+
input: {},
89+
args: readonly any[],
90+
unvisit: (input: any, schema: any) => any,
91+
): R;
8792
};

packages/endpoint/src/schema.d.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import type {
1818
NormalizedNullableObject,
1919
EntityMap,
2020
} from './normal.js';
21+
import { default as Collection } from './schemas/Collection.js';
2122
import { default as Delete } from './schemas/Delete.js';
2223
import {
2324
EntityOptions,
@@ -30,7 +31,7 @@ import {
3031
} from './schemas/EntitySchema.js';
3132
import { default as Invalidate } from './schemas/Invalidate.js';
3233

33-
export { Delete, EntityMap, Invalidate };
34+
export { Delete, EntityMap, Invalidate, Collection };
3435

3536
export { EntityInterface } from './interface.js';
3637

@@ -56,6 +57,7 @@ export class Array<S extends Schema = Schema> implements SchemaClass {
5657
visit: (...args: any) => any,
5758
addEntity: (...args: any) => any,
5859
visitedEntities: Record<string, any>,
60+
storeEntities: any,
5961
): (S extends EntityMap ? UnionResult<S> : Normalize<S>)[];
6062

6163
_normalizeNullable():
@@ -80,6 +82,7 @@ export class Array<S extends Schema = Schema> implements SchemaClass {
8082

8183
denormalizeOnly(
8284
input: {},
85+
args: readonly any[],
8386
unvisit: (input: any, schema: any) => any,
8487
): (S extends EntityMap<infer T> ? T : Denormalize<S>)[];
8588

@@ -116,6 +119,7 @@ export class All<
116119
visit: (...args: any) => any,
117120
addEntity: (...args: any) => any,
118121
visitedEntities: Record<string, any>,
122+
storeEntities: any,
119123
): (S extends EntityMap ? UnionResult<S> : Normalize<S>)[];
120124

121125
_normalizeNullable():
@@ -140,6 +144,7 @@ export class All<
140144

141145
denormalizeOnly(
142146
input: {},
147+
args: readonly any[],
143148
unvisit: (input: any, schema: any) => any,
144149
): (S extends EntityMap<infer T> ? T : Denormalize<S>)[];
145150

@@ -168,6 +173,7 @@ export class Object<O extends Record<string, any> = Record<string, Schema>>
168173
visit: (...args: any) => any,
169174
addEntity: (...args: any) => any,
170175
visitedEntities: Record<string, any>,
176+
storeEntities: any,
171177
): NormalizeObject<O>;
172178

173179
_normalizeNullable(): NormalizedNullableObject<O>;
@@ -182,6 +188,7 @@ export class Object<O extends Record<string, any> = Record<string, Schema>>
182188

183189
denormalizeOnly(
184190
input: {},
191+
args: readonly any[],
185192
unvisit: (input: any, schema: any) => any,
186193
): DenormalizeObject<O>;
187194

@@ -215,6 +222,7 @@ export class Union<Choices extends EntityMap = any> implements SchemaClass {
215222
visit: (...args: any) => any,
216223
addEntity: (...args: any) => any,
217224
visitedEntities: Record<string, any>,
225+
storeEntities: any,
218226
): UnionResult<Choices>;
219227

220228
_normalizeNullable(): UnionResult<Choices> | undefined;
@@ -237,6 +245,7 @@ export class Union<Choices extends EntityMap = any> implements SchemaClass {
237245

238246
denormalizeOnly(
239247
input: {},
248+
args: readonly any[],
240249
unvisit: (input: any, schema: any) => any,
241250
): AbstractInstanceType<Choices[keyof Choices]>;
242251

@@ -277,6 +286,7 @@ export class Values<Choices extends Schema = any> implements SchemaClass {
277286
visit: (...args: any) => any,
278287
addEntity: (...args: any) => any,
279288
visitedEntities: Record<string, any>,
289+
storeEntities: any,
280290
): Record<
281291
string,
282292
Choices extends EntityMap ? UnionResult<Choices> : Normalize<Choices>
@@ -317,6 +327,7 @@ export class Values<Choices extends Schema = any> implements SchemaClass {
317327

318328
denormalizeOnly(
319329
input: {},
330+
args: readonly any[],
320331
unvisit: (input: any, schema: any) => any,
321332
): Record<
322333
string,
@@ -363,8 +374,13 @@ export interface SchemaSimpleNew<T = any> {
363374
visit: (...args: any) => any,
364375
addEntity: (...args: any) => any,
365376
visitedEntities: Record<string, any>,
377+
storeEntities: any,
366378
): any;
367-
denormalizeOnly(input: {}, unvisit: (input: any, schema: any) => any): T;
379+
denormalizeOnly(
380+
input: {},
381+
args: readonly any[],
382+
unvisit: (input: any, schema: any) => any,
383+
): T;
368384
infer(
369385
args: readonly any[],
370386
indexes: NormalizedIndex,

packages/endpoint/src/schema.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ export { default as All } from './schemas/All.js';
66
export { default as Object } from './schemas/Object.js';
77
export { default as Delete } from './schemas/Delete.js';
88
export { default as Invalidate } from './schemas/Invalidate.js';
9+
export { default as Collection } from './schemas/Collection.js';
910
export { default as Entity } from './schemas/EntitySchema.js';

packages/endpoint/src/schemas/All.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,18 @@ export default class AllSchema<
2626
visit: any,
2727
addEntity: any,
2828
visitedEntities: any,
29+
storeEntities: any,
2930
): any {
3031
// we return undefined
31-
super.normalize(input, parent, key, visit, addEntity, visitedEntities);
32+
super.normalize(
33+
input,
34+
parent,
35+
key,
36+
visit,
37+
addEntity,
38+
visitedEntities,
39+
storeEntities,
40+
);
3241
}
3342

3443
infer(args: any, indexes: any, recurse: any, entities: EntityTable): any {

packages/endpoint/src/schemas/Array.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export default class ArraySchema extends PolymorphicSchema {
1313
visit: any,
1414
addEntity: any,
1515
visitedEntities: any,
16+
storeEntities: any,
1617
): any {
1718
const values = getValues(input);
1819

@@ -25,6 +26,7 @@ export default class ArraySchema extends PolymorphicSchema {
2526
visit,
2627
addEntity,
2728
visitedEntities,
29+
storeEntities,
2830
),
2931
)
3032
.filter(value => value !== undefined && value !== null);
@@ -34,10 +36,14 @@ export default class ArraySchema extends PolymorphicSchema {
3436
input: any,
3537
unvisit: any,
3638
): [denormalized: any, found: boolean, deleted: boolean] {
37-
return [this.denormalizeOnly(input, unvisit), true, false];
39+
return [this.denormalizeOnly(input, [], unvisit), true, false];
3840
}
3941

40-
denormalizeOnly(input: any, unvisit: (input: any, schema: any) => any) {
42+
denormalizeOnly(
43+
input: any,
44+
args: any[],
45+
unvisit: (input: any, schema: any) => any,
46+
) {
4147
return input.map
4248
? input
4349
.map((entityOrId: any) => this.denormalizeValue(entityOrId, unvisit))

0 commit comments

Comments
 (0)