Skip to content

Commit a8416c4

Browse files
committed
feat: move page param parsing into collection selector
1 parent e6673de commit a8416c4

File tree

3 files changed

+32
-65
lines changed

3 files changed

+32
-65
lines changed

src/deserializer.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { z } from "zod";
2+
import type { PageParams } from "./pagination.ts";
23
import type { AttributesSchema, DefaultLinks, DefaultMeta, RootLinks } from "./standard-schemas.ts";
34

45
export type RelationshipType = "one" | "one_nullable" | "many";
@@ -125,4 +126,11 @@ export type ResourceDocumentResult<TDeserializer extends AnyResourceDeserializer
125126
export type NullableResourceDocumentResult<TDeserializer extends AnyResourceDeserializer> =
126127
DocumentResult<ResourceResult<TDeserializer> | null>;
127128
export type ResourceCollectionDocumentResult<TDeserializer extends AnyResourceDeserializer> =
128-
DocumentResult<ResourceResult<TDeserializer>[]>;
129+
DocumentResult<ResourceResult<TDeserializer>[]> & {
130+
pageParams: {
131+
first?: PageParams | null;
132+
prev?: PageParams | null;
133+
next?: PageParams | null;
134+
last?: PageParams | null;
135+
};
136+
};

src/selector.ts

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import type {
99
ResourceDocumentResult,
1010
ResourceResult,
1111
} from "./deserializer.ts";
12-
import { type PageParams, parsePageParamsFromLink } from "./pagination.ts";
12+
import { parsePageParamsFromLink } from "./pagination.ts";
1313
import {
1414
type DocumentSchema,
1515
type RelationshipSchema,
@@ -216,40 +216,13 @@ export const createResourceCollectionSelector = <TDeserializer extends AnyResour
216216
const document = documentSchema.parse(raw);
217217
const included = prepareIncludedMap(document);
218218

219-
return createFlattenedDocumentFromData(
220-
document,
221-
document.data.map((resource) =>
222-
flattenResource(resource, null, included, resourceSchemaCache),
223-
),
224-
);
225-
};
226-
};
227-
228-
export const createDataSelector =
229-
<TData>(documentSelector: Selector<DocumentResult<TData>>): Selector<TData> =>
230-
(raw: unknown) =>
231-
documentSelector(raw).data;
232-
233-
type PaginatedCollectionSelector<TDocument> = Selector<
234-
TDocument & {
235-
pageParams: {
236-
first?: PageParams | null;
237-
prev?: PageParams | null;
238-
next?: PageParams | null;
239-
last?: PageParams | null;
240-
};
241-
}
242-
>;
243-
244-
export const createPaginatedCollectionSelector =
245-
<TDocument extends ResourceCollectionDocumentResult<AnyResourceDeserializer>>(
246-
documentSelector: Selector<TDocument>,
247-
): PaginatedCollectionSelector<TDocument> =>
248-
(raw: unknown) => {
249-
const document = documentSelector(raw);
250-
251219
return {
252-
...document,
220+
...createFlattenedDocumentFromData(
221+
document,
222+
document.data.map((resource) =>
223+
flattenResource(resource, null, included, resourceSchemaCache),
224+
),
225+
),
253226
pageParams: {
254227
first: parsePageParamsFromLink(document.links?.first),
255228
prev: parsePageParamsFromLink(document.links?.prev),
@@ -258,3 +231,9 @@ export const createPaginatedCollectionSelector =
258231
},
259232
};
260233
};
234+
};
235+
236+
export const createDataSelector =
237+
<TData>(documentSelector: Selector<DocumentResult<TData>>): Selector<TData> =>
238+
(raw: unknown) =>
239+
documentSelector(raw).data;

test/selector.test.ts

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
type Relationships,
55
createDataSelector,
66
createNullableResourceSelector,
7-
createPaginatedCollectionSelector,
87
createResourceCollectionSelector,
98
createResourceSelector,
109
} from "../src/index.js";
@@ -190,7 +189,7 @@ describe("createNullableResourceSelector", () => {
190189
});
191190

192191
describe("createResourceCollectionSelector", () => {
193-
it("should return an array", () => {
192+
it("should return an page params", () => {
194193
const selector = createResourceCollectionSelector({
195194
type: "article",
196195
});
@@ -200,10 +199,19 @@ describe("createResourceCollectionSelector", () => {
200199
{ id: "1", type: "article" },
201200
{ id: "2", type: "article" },
202201
],
202+
links: {
203+
next: "/?page[number]=2",
204+
},
203205
});
204206

205207
expect(result).toEqual({
206208
data: [{ id: "1" }, { id: "2" }],
209+
links: {
210+
next: "/?page[number]=2",
211+
},
212+
pageParams: {
213+
next: { number: "2" },
214+
},
207215
});
208216
});
209217
});
@@ -231,31 +239,3 @@ describe("crateDataSelector", () => {
231239
});
232240
});
233241
});
234-
235-
describe("cratePaginatedCollectionSelector", () => {
236-
it("should extract page params", () => {
237-
const selector = createPaginatedCollectionSelector(
238-
createResourceCollectionSelector({
239-
type: "article",
240-
attributesSchema: z.object({ title: z.string() }),
241-
}),
242-
);
243-
244-
const result = selector({
245-
data: [],
246-
links: {
247-
next: "/?page[number]=2",
248-
},
249-
});
250-
251-
expect(result).toEqual({
252-
data: [],
253-
links: {
254-
next: "/?page[number]=2",
255-
},
256-
pageParams: {
257-
next: { number: "2" },
258-
},
259-
});
260-
});
261-
});

0 commit comments

Comments
 (0)