Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
41 lines
1.6 KiB
Text
41 lines
1.6 KiB
Text
const makePagedClientRequest = async (CommandCtor, client, input, withCommand = (_) => _, ...args) => {
|
|
let command = new CommandCtor(input);
|
|
command = withCommand(command) ?? command;
|
|
return await client.send(command, ...args);
|
|
};
|
|
export function createPaginator(ClientCtor, CommandCtor, inputTokenName, outputTokenName, pageSizeTokenName) {
|
|
return async function* paginateOperation(config, input, ...additionalArguments) {
|
|
const _input = input;
|
|
let token = config.startingToken ?? _input[inputTokenName];
|
|
let hasNext = true;
|
|
let page;
|
|
while (hasNext) {
|
|
_input[inputTokenName] = token;
|
|
if (pageSizeTokenName) {
|
|
_input[pageSizeTokenName] = _input[pageSizeTokenName] ?? config.pageSize;
|
|
}
|
|
if (config.client instanceof ClientCtor) {
|
|
page = await makePagedClientRequest(CommandCtor, config.client, input, config.withCommand, ...additionalArguments);
|
|
}
|
|
else {
|
|
throw new Error(`Invalid client, expected instance of ${ClientCtor.name}`);
|
|
}
|
|
yield page;
|
|
const prevToken = token;
|
|
token = get(page, outputTokenName);
|
|
hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken));
|
|
}
|
|
return undefined;
|
|
};
|
|
}
|
|
const get = (fromObject, path) => {
|
|
let cursor = fromObject;
|
|
const pathComponents = path.split(".");
|
|
for (const step of pathComponents) {
|
|
if (!cursor || typeof cursor !== "object") {
|
|
return undefined;
|
|
}
|
|
cursor = cursor[step];
|
|
}
|
|
return cursor;
|
|
};
|